https://wiki.henkaku.xyz/vita/api.php?action=feedcontributions&user=CreepNT&feedformat=atom
Vita Development Wiki - User contributions [en]
2024-03-28T16:21:43Z
User contributions
MediaWiki 1.35.13
https://wiki.henkaku.xyz/vita/index.php?title=Physical_Memory&diff=21128
Physical Memory
2024-02-22T19:50:43Z
<p>CreepNT: /* Main table */ Update based off Hardware Timers page changes</p>
<hr />
<div>== Main table ==<br />
<br />
<div class="toccolours mw-collapsible mw-collapsed"><br />
<div style="font-weight:bold;line-height:1.6;">List sorted by group</div><br />
<div class="mw-collapsible-content"><br />
{| class='sortable wikitable mw-collapsible'<br />
|+Top Group<br />
! Address<br />
! Size<br />
! Description<br />
|-<br />
| 0x00000000<br />
| 0x820000<br />
| Device Boot.<br />
|-<br />
| 0x1A000000<br />
| 0x3000<br />
| ARM cache controller.<br />
|-<br />
| 0x1C000000<br />
| 0x200000<br />
| Scratch 2MiB SRAM.<br />
|-<br />
| 0x1F000000<br />
| 0x8000<br />
| Alias of address 0x00000000.<br />
|-<br />
| 0x1F840000<br />
| 0x20000<br />
| Boot store and VIP scratch.<br />
|-<br />
| 0x20000000<br />
| 0x8000000<br />
| 128MiB CDRAM.<br />
|-<br />
| 0x30000000<br />
| ?<br />
| Unknown CMeP device.<br />
|-<br />
| 0x40000000<br />
| 0x20000000<br />
| 512MiB DRAM.<br />
|-<br />
| 0x60000000<br />
| 0x40000000<br />
| 1GiB DRAM for Development Kit.<br />
|-<br />
| 0xE0000000<br />
| 0x100000<br />
| CMeP's Control Register.<br />
|-<br />
| 0xE0100000<br />
| 0x1000<br />
| Gpio 1.<br />
|-<br />
| 0xE0400000<br />
| 0x20000<br />
| Dmac part 4~5.<br />
|-<br />
| 0xE0420000<br />
| 0xC0000<br />
| Audio Control.<br />
|-<br />
| 0xE04E0000<br />
| 0x1000~0x20000<br />
| Dmac Keyring Control.<br />
|-<br />
| 0xE0500000<br />
| 0x20000<br />
| I2c.<br />
|-<br />
| 0xE0900000<br />
| 0x10000<br />
| Msif.<br />
|-<br />
| 0xE0A00000<br />
| 0x30000<br />
| Spi.<br />
|-<br />
| 0xE0B00000<br />
| 0x130000<br />
| Sdif.<br />
|-<br />
| 0xE2030000<br />
| 0x70000<br />
| Uart.<br />
|-<br />
| 0xE20A0000<br />
| 0x10000<br />
| Gpio 0.<br />
|-<br />
| 0xE20B0000<br />
| 0x10000<br />
| Timer.<br />
|-<br />
| 0xE20C0000<br />
| 0x10000<br />
| Pwn.<br />
|-<br />
| 0xE3000000<br />
| 0x20000<br />
| Dmac part 0~1.<br />
|-<br />
| 0xE3020000<br />
| 0x20000<br />
| Cif.<br />
|-<br />
| 0xE3050000<br />
| 0x20000<br />
| Csi.<br />
|-<br />
| 0xE3100000<br />
| 0x20000<br />
| Pervasive.<br />
|-<br />
| 0xE3200000<br />
| 0x130000<br />
| ARM Debugger.<br />
|-<br />
| 0xE4020000<br />
| 0xD0000<br />
| USB Control.<br />
|-<br />
| 0xE5000000<br />
| 0x20000<br />
| Dmac part 2~3.<br />
|-<br />
| 0xE5020000<br />
| 0x50000<br />
| Display Control.<br />
|-<br />
| 0xE5070000<br />
| 0x10000<br />
| Compat.<br />
|-<br />
| 0xE50C0000<br />
| 0x10000<br />
| Dmac part 6.<br />
|-<br />
| 0xE50D0000<br />
| 0x10000<br />
| ARM PA.<br />
|-<br />
| 0xE5800000<br />
| 0x20000<br />
| Sdio Control for Development Kit.<br />
|-<br />
| 0xE5880000<br />
| 0x10000<br />
| DRAM Control for Development Kit.<br />
|-<br />
| 0xE6000000<br />
| 0x10000<br />
| DRAM Control.<br />
|-<br />
| 0xE8000000<br />
| 0x10000<br />
| GPU Control.<br />
|-<br />
| 0xE8100000<br />
| 0x10000<br />
| Compat Shared SRAM.<br />
|-<br />
| 0xE8200000<br />
| 0x10000<br />
| Emc.<br />
|-<br />
| 0xE8300000<br />
| 0x10000<br />
| Grab.<br />
|-<br />
| 0xE8400000<br />
| 0x10000<br />
| SGX543.<br />
|-<br />
| 0xEC000000<br />
| x<br />
| Main Xbar<br />
|-<br />
| 0xEC100000<br />
| x<br />
| Center Xbar<br />
|-<br />
| 0xEC200000<br />
| x<br />
| Video Xbar<br />
|-<br />
| 0xEC300000<br />
| x<br />
| IFTU Xbar<br />
|-<br />
| 0xEC400000<br />
| x<br />
| VIP Xbar<br />
|-<br />
| 0xEC500000<br />
| x<br />
| Debug Bus<br />
|-<br />
| 0xEC600000<br />
| x<br />
| DMAC Xbar<br />
|-<br />
| 0xED000000<br />
| x<br />
| IO Slave Bus<br />
|-<br />
| 0xED100000<br />
| x<br />
| IO Master Bus<br />
|-<br />
| 0xED200000<br />
| x<br />
| Pervasive Bus<br />
|-<br />
| 0xED300000<br />
| x<br />
| Misc IO Bus<br />
|-<br />
| 0xED400000<br />
| x<br />
| North IO Master Bus<br />
|-<br />
| 0xED500000<br />
| x<br />
| Audio Bus<br />
|-<br />
| 0xED600000<br />
| x<br />
| North IO Slave Bus<br />
|-<br />
| 0xED700000<br />
| x<br />
| SRC Bus<br />
|-<br />
| 0xED800000<br />
| x<br />
| GPU Register Bus<br />
|-<br />
| 0xED900000<br />
| x<br />
| IFTU Register Bus<br />
|-<br />
| 0xEE000000<br />
| x<br />
| Camera Slave Bus<br />
|-<br />
| 0xEE100000<br />
| x<br />
| Camera Master Bus<br />
|-<br />
| 0xEE200000<br />
| x<br />
| USB Slave Bus<br />
|-<br />
| 0xEE300000<br />
| x<br />
| USB Master Bus<br />
|-<br />
| 0xEE400000<br />
| x<br />
| SubLCD Slave Bus<br />
|-<br />
| 0xEE500000<br />
| x<br />
| SubLCD Master Bus<br />
|-<br />
| 0xEE600000<br />
| x<br />
| Camera Register Bus<br />
|}<br />
<br />
{| class='sortable wikitable mw-collapsible'<br />
|+Main Xbar<br />
! Address<br />
! Description<br />
|-<br />
| 0xEC040000<br />
| SSX_MainXB_IA_ARM0<br />
|-<br />
| 0xEC040400<br />
| SSX_MainXB_IA_ARM1<br />
|-<br />
| 0xEC048000<br />
| SSX_MainXB_IA_CenterXbar0<br />
|-<br />
| 0xEC048400<br />
| SSX_MainXB_IA_CenterXbar1<br />
|-<br />
| 0xEC048800<br />
| SSX_MainXB_IA_CenterXbar2<br />
|-<br />
| 0xEC048C00<br />
| SSX_MainXB_IA_IoMasterBus<br />
|-<br />
| 0xEC049000<br />
| SSX_MainXB_IA_DmacXbar0<br />
|-<br />
| 0xEC049400<br />
| SSX_MainXB_IA_DmacXbar1<br />
|-<br />
| 0xEC050000<br />
| SSX_MainXB_TA_Spad_32KiB<br />
|-<br />
| 0xEC050400<br />
| SSX_MainXB_TA_LPDDR0<br />
|-<br />
| 0xEC050800<br />
| SSX_MainXB_TA_ACP<br />
|-<br />
| 0xEC058000<br />
| SSX_MainXB_TA_CenterXbar0<br />
|-<br />
| 0xEC058400<br />
| SSX_MainXB_TA_CenterXbar1<br />
|-<br />
| 0xEC058800<br />
| SSX_MainXB_TA_IoSlaveBus<br />
|}<br />
<br />
{| class='sortable wikitable mw-collapsible'<br />
|+Center Xbar<br />
! Address<br />
! Description<br />
|-<br />
| 0xEC140000<br />
| SSX_CenterXB_IA_GPUXbar<br />
|-<br />
| 0xEC148000<br />
| SSX_CenterXB_IA_MainXbar0<br />
|-<br />
| 0xEC148400<br />
| SSX_CenterXB_IA_MainXbar1<br />
|-<br />
| 0xEC148800<br />
| SSX_CenterXB_IA_VideoXbar0<br />
|-<br />
| 0xEC148C00<br />
| SSX_CenterXB_IA_VideoXbar1<br />
|-<br />
| 0xEC149000<br />
| SSX_CenterXB_IA_IoMasterBus<br />
|-<br />
| 0xEC149400<br />
| SSX_CenterXB_IA_DmacXbar0<br />
|-<br />
| 0xEC149800<br />
| SSX_CenterXB_IA_DmacXbar1<br />
|-<br />
| 0xEC150000<br />
| SSX_CenterXB_TA_Compati_2MiB<br />
|-<br />
| 0xEC150400<br />
| SSX_CenterXB_TA_DevNull<br />
|-<br />
| 0xEC150800<br />
| SSX_CenterXB_TA_GpuXbar<br />
|-<br />
| 0xEC158000<br />
| SSX_CenterXB_TA_MainXbar0<br />
|-<br />
| 0xEC158400<br />
| SSX_CenterXB_TA_MainXbar1<br />
|-<br />
| 0xEC158800<br />
| SSX_CenterXB_TA_MainXbar2<br />
|-<br />
| 0xEC158C00<br />
| SSX_CenterXB_TA_VideoXbar<br />
|}<br />
<br />
{| class='sortable wikitable mw-collapsible'<br />
|+Video Xbar<br />
! Address<br />
! Description<br />
|-<br />
| 0xEC240000<br />
| SSX_VideoXB_IA_DMAC2<br />
|-<br />
| 0xEC240400<br />
| SSX_VideoXB_IA_DMAC3<br />
|-<br />
| 0xEC240800<br />
| SSX_VideoXB_IA_Venezia<br />
|-<br />
| 0xEC240C00<br />
| SSX_VideoXB_IA_LCDDMAC<br />
|-<br />
| 0xEC248000<br />
| SSX_VideoXB_IA_CenterXbar<br />
|-<br />
| 0xEC248400<br />
| SSX_VideoXB_IA_IftuXbar0<br />
|-<br />
| 0xEC248800<br />
| SSX_VideoXB_IA_IftuXbar1<br />
|-<br />
| 0xEC248C00<br />
| SSX_VideoXB_IA_VipXbar0<br />
|-<br />
| 0xEC249000<br />
| SSX_VideoXB_IA_VipXbar1<br />
|-<br />
| 0xEC249400<br />
| SSX_VideoXB_IA_DebugBus<br />
|-<br />
| 0xEC250000<br />
| SSX_VideoXB_TA_Spad_128KiB<br />
|-<br />
| 0xEC250400<br />
| SSX_VideoXB_TA_GpuXbar0<br />
|-<br />
| 0xEC250800<br />
| SSX_VideoXB_TA_GpuXbar1<br />
|-<br />
| 0xEC250C00<br />
| SSX_VideoXB_TA_GpuXbar2<br />
|-<br />
| 0xEC258000<br />
| SSX_VideoXB_TA_CenterXbar0<br />
|-<br />
| 0xEC258400<br />
| SSX_VideoXB_TA_CenterXbar1<br />
|-<br />
| 0xEC258800<br />
| SSX_VideoXB_TA_DebugBus<br />
|}<br />
<br />
{| class='sortable wikitable mw-collapsible'<br />
|+IFTU Xbar<br />
! Address<br />
! Description<br />
|-<br />
| 0xEC340000<br />
| SSX_IftuXB_IA_IFTU0a<br />
|-<br />
| 0xEC340400<br />
| SSX_IftuXB_IA_IFTU0b<br />
|-<br />
| 0xEC340800<br />
| SSX_IftuXB_IA_IFTU1a<br />
|-<br />
| 0xEC340C00<br />
| SSX_IftuXB_IA_IFTU1b<br />
|-<br />
| 0xEC341000<br />
| SSX_IftuXB_IA_IFTU2<br />
|-<br />
| 0xEC348000<br />
| SSX_IftuXB_IA_IftuRegBus<br />
|-<br />
| 0xEC358000<br />
| SSX_IftuXB_TA_VideoXbar0<br />
|-<br />
| 0xEC358400<br />
| SSX_IftuXB_TA_VideoXbar1<br />
|}<br />
<br />
{| class='sortable wikitable mw-collapsible'<br />
|+VIP Xbar<br />
! Address<br />
! Description<br />
|-<br />
| 0xEC440000<br />
| SSX_VipXB_IA_VDP0<br />
|-<br />
| 0xEC440400<br />
| SSX_VipXB_IA_VDP1<br />
|-<br />
| 0xEC440800<br />
| SSX_VipXB_IA_VDP2<br />
|-<br />
| 0xEC440C00<br />
| SSX_VipXB_IA_VDP3<br />
|-<br />
| 0xEC441000<br />
| SSX_VipXB_IA_VDPMeP<br />
|-<br />
| 0xEC441400<br />
| SSX_VipXB_IA_BAPMeP<br />
|-<br />
| 0xEC448000<br />
| SSX_VipXB_IA_GpuRegBus<br />
|-<br />
| 0xEC450000<br />
| SSX_VipXB_TA_GpuXbar<br />
|-<br />
| 0xEC458000<br />
| SSX_VipXB_TA_VideoXbar0<br />
|-<br />
| 0xEC458400<br />
| SSX_VipXB_TA_VideoXbar1<br />
|}<br />
<br />
{| class='sortable wikitable mw-collapsible'<br />
|+Debug Bus<br />
! Address<br />
! Description<br />
|-<br />
| 0xEC540000<br />
| SSX_DebugBus_IA_DMAC6<br />
|-<br />
| 0xEC540400<br />
| SSX_DebugBus_IA_PA<br />
|-<br />
| 0xEC548000<br />
| SSX_DebugBus_IA_VideoXbar<br />
|-<br />
| 0xEC550000<br />
| SSX_DebugBus_TA_SDIO0<br />
|-<br />
| 0xEC550400<br />
| SSX_DebugBus_TA_SDIO1<br />
|-<br />
| 0xEC550800<br />
| SSX_DebugBus_TA_LPDDR1<br />
|-<br />
| 0xEC558000<br />
| SSX_DebugBus_TA_VideoXbar<br />
|}<br />
<br />
{| class='sortable wikitable mw-collapsible'<br />
|+DMAC Xbar<br />
! Address<br />
! Description<br />
|-<br />
| 0xEC640000<br />
| SSX_DmacXB_IA_DMAC0<br />
|-<br />
| 0xEC640400<br />
| SSX_DmacXB_IA_DMAC1<br />
|-<br />
| 0xEC648000<br />
| SSX_DmacXB_IA_IoSlaveBus<br />
|-<br />
| 0xEC658000<br />
| SSX_DmacXB_TA_MainXbar0<br />
|-<br />
| 0xEC658400<br />
| SSX_DmacXB_TA_MainXbar1<br />
|-<br />
| 0xEC658800<br />
| SSX_DmacXB_TA_CenterXbar0<br />
|-<br />
| 0xEC658C00<br />
| SSX_DmacXB_TA_CenterXbar1<br />
|}<br />
<br />
{| class='sortable wikitable mw-collapsible'<br />
|+IO Slave Bus<br />
! Address<br />
! Description<br />
|-<br />
| 0xED048000<br />
| SSX_IoSlaveBus_IA_MainXbar<br />
|-<br />
| 0xED058000<br />
| SSX_IoSlaveBus_TA_PervasiveBus<br />
|-<br />
| 0xED058400<br />
| SSX_IoSlaveBus_TA_NorthIoBus<br />
|-<br />
| 0xED058800<br />
| SSX_IoSlaveBus_TA_GpuRegBus<br />
|-<br />
| 0xED058C00<br />
| SSX_IoSlaveBus_TA_MiscIoBus<br />
|-<br />
| 0xED059000<br />
| SSX_IoSlaveBus_TA_CameraSlaveBus0<br />
|-<br />
| 0xED059400<br />
| SSX_IoSlaveBus_TA_CameraSlaveBus1<br />
|-<br />
| 0xED059800<br />
| SSX_IoSlaveBus_TA_CameraSlaveBus2<br />
|-<br />
| 0xED059C00<br />
| SSX_IoSlaveBus_TA_IoMasterBus<br />
|-<br />
| 0xED05A000<br />
| SSX_IoSlaveBus_TA_DmacXbar<br />
|}<br />
<br />
{| class='sortable wikitable mw-collapsible'<br />
|+IO Master Bus<br />
! Address<br />
! Description<br />
|-<br />
| 0xED148000<br />
| SSX_IoMasterBus_IA_NorthIoBus<br />
|-<br />
| 0xED148400<br />
| SSX_IoMasterBus_IA_CameraMasterBus<br />
|-<br />
| 0xED148800<br />
| SSX_IoMasterBus_IA_IoSlaveBus<br />
|-<br />
| 0xED158000<br />
| SSX_IoMasterBus_TA_MainXbar<br />
|-<br />
| 0xED158400<br />
| SSX_IoMasterBus_TA_CenterXbar<br />
|}<br />
<br />
{| class='sortable wikitable mw-collapsible'<br />
|+Pervasive Bus<br />
! Address<br />
! Description<br />
|-<br />
| 0xED248000<br />
| SSX_PervasiveBus_IA_IoSlaveBus<br />
|-<br />
| 0xED250000<br />
| SSX_PervasiveBus_TA_DMAC0<br />
|-<br />
| 0xED250000<br />
| SSX_PervasiveBus_TA_DMAC1<br />
|-<br />
| 0xED250800<br />
| SSX_PervasiveBus_TA_Pervasive<br />
|-<br />
| 0xED250C00<br />
| SSX_PervasiveBus_TA_CoreSight<br />
|-<br />
| 0xED251000<br />
| SSX_PervasiveBus_TA_VFPINT<br />
|}<br />
<br />
{| class='sortable wikitable mw-collapsible'<br />
|+Misc IO Bus<br />
! Address<br />
! Description<br />
|-<br />
| 0xED348000<br />
| SSX_MiscIoBus_IA_IoSlaveBus<br />
|-<br />
| 0xED350000<br />
| SSX_MiscIoBus_TA_UART0<br />
|-<br />
| 0xED350400<br />
| SSX_MiscIoBus_TA_UART1<br />
|-<br />
| 0xED350800<br />
| SSX_MiscIoBus_TA_UART2<br />
|-<br />
| 0xED350C00<br />
| SSX_MiscIoBus_TA_UART3<br />
|-<br />
| 0xED351000<br />
| SSX_MiscIoBus_TA_UART4<br />
|-<br />
| 0xED351400<br />
| SSX_MiscIoBus_TA_UART5<br />
|-<br />
| 0xED351800<br />
| SSX_MiscIoBus_TA_UART6<br />
|-<br />
| 0xED351C00<br />
| SSX_MiscIoBus_TA_GPIO0<br />
|-<br />
| 0xED352000<br />
| SSX_MiscIoBus_TA_Timer<br />
|-<br />
| 0xED352400<br />
| SSX_MiscIoBus_TA_PWM<br />
|}<br />
<br />
{| class='sortable wikitable mw-collapsible'<br />
|+North IO Master Bus<br />
! Address<br />
! Description<br />
|-<br />
| 0xED440000<br />
| SSX_NIoMasterBus_IA_DMAC4<br />
|-<br />
| 0xED440400<br />
| SSX_NIoMasterBus_IA_DMAC5<br />
|-<br />
| 0xED440800<br />
| SSX_NIoMasterBus_IA_HSMMC1<br />
|-<br />
| 0xED440C00<br />
| SSX_NIoMasterBus_IA_HSMMC2<br />
|-<br />
| 0xED441000<br />
| SSX_NIoMasterBus_IA_HSMMC3<br />
|-<br />
| 0xED448000<br />
| SSX_NIoMasterBus_IA_NIoSlaveBus<br />
|-<br />
| 0xED450000<br />
| SSX_NIoMasterBus_TA_KeyRing<br />
|-<br />
| 0xED458000<br />
| SSX_NIoMasterBus_TA_AudioBus<br />
|-<br />
| 0xED458400<br />
| SSX_NIoMasterBus_TA_SrcBus<br />
|-<br />
| 0xED458800<br />
| SSX_NIoMasterBus_TA_IoMasterBus0<br />
|-<br />
| 0xED458C00<br />
| SSX_NIoMasterBus_TA_IoMasterBus1<br />
|}<br />
<br />
{| class='sortable wikitable mw-collapsible'<br />
|+Audio Bus<br />
! Address<br />
! Description<br />
|-<br />
| 0xED548000<br />
| SSX_AudioBus_IA_NIoMasterBus<br />
|-<br />
| 0xED550000<br />
| SSX_AudioBus_TA_I2S0<br />
|-<br />
| 0xED550400<br />
| SSX_AudioBus_TA_I2S1<br />
|-<br />
| 0xED550800<br />
| SSX_AudioBus_TA_I2S2<br />
|-<br />
| 0xED550C00<br />
| SSX_AudioBus_TA_I2SD0<br />
|-<br />
| 0xED551000<br />
| SSX_AudioBus_TA_I2SD1<br />
|-<br />
| 0xED551400<br />
| SSX_AudioBus_TA_I2S4<br />
|-<br />
| 0xED551C00<br />
| SSX_AudioBus_TA_I2S7<br />
|-<br />
| 0xED552000<br />
| SSX_AudioBus_TA_SPDIF<br />
|}<br />
<br />
{| class='sortable wikitable mw-collapsible'<br />
|+North IO Slave Bus<br />
! Address<br />
! Description<br />
|-<br />
| 0xED648000<br />
| SSX_NIoSlaveBus_IA_IoSlaveBus<br />
|-<br />
| 0xED650000<br />
| SSX_NIoSlaveBus_TA_DMAC4<br />
|-<br />
| 0xED650400<br />
| SSX_NIoSlaveBus_TA_DMAC5<br />
|-<br />
| 0xED650800<br />
| SSX_NIoSlaveBus_TA_I2C0<br />
|-<br />
| 0xED650C00<br />
| SSX_NIoSlaveBus_TA_I2C1<br />
|-<br />
| 0xED651000<br />
| SSX_NIoSlaveBus_TA_HSMMC1<br />
|-<br />
| 0xED651400<br />
| SSX_NIoSlaveBus_TA_HSMMC2<br />
|-<br />
| 0xED651800<br />
| SSX_NIoSlaveBus_TA_HSMMC3<br />
|-<br />
| 0xED658000<br />
| SSX_NIoSlaveBus_TA_NIoMasterBus<br />
|}<br />
<br />
{| class='sortable wikitable mw-collapsible'<br />
|+SRC Bus<br />
! Address<br />
! Description<br />
|-<br />
| 0xED748000<br />
| SSX_SrcBus_IA_NIoMasterBus<br />
|-<br />
| 0xED750000<br />
| SSX_SrcBus_TA_SRC0<br />
|-<br />
| 0xED750400<br />
| SSX_SrcBus_TA_SRC1<br />
|-<br />
| 0xED750800<br />
| SSX_SrcBus_TA_SRC2<br />
|}<br />
<br />
{| class='sortable wikitable mw-collapsible'<br />
|+GPU Register Bus<br />
! Address<br />
! Description<br />
|-<br />
| 0xED848000<br />
| SSX_GpuRegBus_IA_IoSlaveBus<br />
|-<br />
| 0xED850000<br />
| SSX_GpuRegBus_TA_DMAC2<br />
|-<br />
| 0xED850400<br />
| SSX_GpuRegBus_TA_DMAC3<br />
|-<br />
| 0xED850800<br />
| SSX_GpuRegBus_TA_LCDDMAC<br />
|-<br />
| 0xED850C00<br />
| SSX_GpuRegBus_TA_DMAC6<br />
|-<br />
| 0xED851000<br />
| SSX_GpuRegBus_TA_PA<br />
|-<br />
| 0xED851400<br />
| SSX_GpuRegBus_TA_Pervasive2<br />
|-<br />
| 0xED851800<br />
| SSX_GpuRegBus_TA_SonyRegBus<br />
|-<br />
| 0xED858000<br />
| SSX_GpuRegBus_TA_IftuRegBus<br />
|-<br />
| 0xED858400<br />
| SSX_GpuRegBus_TA_VipXbar<br />
|}<br />
<br />
{| class='sortable wikitable mw-collapsible'<br />
|+IFTU Register Bus<br />
! Address<br />
! Description<br />
|-<br />
| 0xED948000<br />
| SSX_IftuRegBus_IA_GpuRegBus<br />
|-<br />
| 0xED950000<br />
| SSX_IftuRegBus_TA_IFTU0<br />
|-<br />
| 0xED950400<br />
| SSX_IftuRegBus_TA_IFTU1<br />
|-<br />
| 0xED950800<br />
| SSX_IftuRegBus_TA_IFTU2<br />
|-<br />
| 0xED950C00<br />
| SSX_IftuRegBus_TA_DSI0<br />
|-<br />
| 0xED951000<br />
| SSX_IftuRegBus_TA_DSI1<br />
|-<br />
| 0xED958000<br />
| SSX_IftuRegBus_TA_IftuXbar<br />
|}<br />
<br />
{| class='sortable wikitable mw-collapsible'<br />
|+Camera Slave Bus<br />
! Address<br />
! Description<br />
|-<br />
| 0xEE048000<br />
| SSX_CameraSlaveBus_IA_IoSlaveBus0<br />
|-<br />
| 0xEE048400<br />
| SSX_CameraSlaveBus_IA_IoSlaveBus1<br />
|-<br />
| 0xEE048800<br />
| SSX_CameraSlaveBus_IA_IoSlaveBus2<br />
|-<br />
| 0xEE050000<br />
| SSX_CameraSlaveBus_TA_GPIO1<br />
|-<br />
| 0xEE058000<br />
| SSX_CameraSlaveBus_TA_CameraRegBus<br />
|-<br />
| 0xEE058400<br />
| SSX_CameraSlaveBus_TA_SlcdSlaveBus0<br />
|-<br />
| 0xEE058800<br />
| SSX_CameraSlaveBus_TA_UsbSlaveBus<br />
|-<br />
| 0xEE058C00<br />
| SSX_CameraSlaveBus_TA_SlcdSlaveBus1<br />
|-<br />
| 0xEE059000<br />
| SSX_CameraSlaveBus_TA_CameraMasterBus<br />
|}<br />
<br />
{| class='sortable wikitable mw-collapsible'<br />
|+Camera Master Bus<br />
! Address<br />
! Description<br />
|-<br />
| 0xEE140000<br />
| SSX_CameraMasterBus_IA_CameraIf0<br />
|-<br />
| 0xEE140400<br />
| SSX_CameraMasterBus_IA_CameraIf1<br />
|-<br />
| 0xEE148000<br />
| SSX_CameraMasterBus_IA_SlcdMasterBus<br />
|-<br />
| 0xEE148400<br />
| SSX_CameraMasterBus_IA_UsbMasterBus<br />
|-<br />
| 0xEE148800<br />
| SSX_CameraMasterBus_IA_CameraSlaveBus<br />
|-<br />
| 0xEE158000<br />
| SSX_CameraMasterBus_TA_IoMasterBus0<br />
|-<br />
| 0xEE158400<br />
| SSX_CameraMasterBus_TA_IoMasterBus1<br />
|}<br />
<br />
{| class='sortable wikitable mw-collapsible'<br />
|+USB Slave Bus<br />
! Address<br />
! Description<br />
|-<br />
| 0xEE248000<br />
| SSX_UsbSlaveBus_IA_CameraSlaveBus<br />
|-<br />
| 0xEE250000<br />
| SSX_UsbSlaveBus_TA_USB0HOST<br />
|-<br />
| 0xEE250400<br />
| SSX_UsbSlaveBus_TA_USB1HOST<br />
|-<br />
| 0xEE250800<br />
| SSX_UsbSlaveBus_TA_USB2HOST<br />
|-<br />
| 0xEE252C00<br />
| SSX_UsbSlaveBus_TA_USB1DEVICE<br />
|-<br />
| 0xEE253000<br />
| SSX_UsbSlaveBus_TA_USB2DEVICE<br />
|-<br />
| 0xEE253400<br />
| SSX_UsbSlaveBus_TA_USB0DEVICE<br />
|-<br />
| 0xEE258000<br />
| SSX_UsbSlaveBus_TA_UsbMasterBus<br />
|}<br />
<br />
{| class='sortable wikitable mw-collapsible'<br />
|+USB Master Bus<br />
! Address<br />
! Description<br />
|-<br />
| 0xEE340400<br />
| SSX_UsbMasterBus_IA_USB1OHCI<br />
|-<br />
| 0xEE340800<br />
| SSX_UsbMasterBus_IA_USB1EHCI<br />
|-<br />
| 0xEE340C00<br />
| SSX_UsbMasterBus_IA_USB2OHCI<br />
|-<br />
| 0xEE341000<br />
| SSX_UsbMasterBus_IA_USB2EHCI<br />
|-<br />
| 0xEE341400<br />
| SSX_UsbMasterBus_IA_USB0OHCI<br />
|-<br />
| 0xEE341800<br />
| SSX_UsbMasterBus_IA_USB0EHCI<br />
|-<br />
| 0xEE343400<br />
| SSX_UsbMasterBus_IA_USB1DEVICE<br />
|-<br />
| 0xEE343800<br />
| SSX_UsbMasterBus_IA_USB2DEVICE<br />
|-<br />
| 0xEE343C00<br />
| SSX_UsbMasterBus_IA_USB0DEVICE<br />
|-<br />
| 0xEE348000<br />
| SSX_UsbMasterBus_IA_UsbSlaveBus<br />
|-<br />
| 0xEE358000<br />
| SSX_UsbMasterBus_TA_CameraMasterBus<br />
|}<br />
<br />
{| class='sortable wikitable mw-collapsible'<br />
|+SubLCD Slave Bus<br />
! Address<br />
! Description<br />
|-<br />
| 0xEE448000<br />
| SSX_SlcdSlaveBus_IA_CameraSlaveBus0<br />
|-<br />
| 0xEE448400<br />
| SSX_SlcdSlaveBus_IA_CameraSlaveBus1<br />
|-<br />
| 0xEE450000<br />
| SSX_SlcdSlaveBus_TA_HSMMC0<br />
|-<br />
| 0xEE450400<br />
| SSX_SlcdSlaveBus_TA_SubLCD<br />
|-<br />
| 0xEE450800<br />
| SSX_SlcdSlaveBus_TA_SMSHC<br />
|-<br />
| 0xEE450C00<br />
| SSX_SlcdSlaveBus_TA_SPI0<br />
|-<br />
| 0xEE451000<br />
| SSX_SlcdSlaveBus_TA_SPI1<br />
|-<br />
| 0xEE451400<br />
| SSX_SlcdSlaveBus_TA_SPI2<br />
|-<br />
| 0xEE458000<br />
| SSX_SlcdSlaveBus_TA_SlcdMasterBus<br />
|}<br />
<br />
{| class='sortable wikitable mw-collapsible'<br />
|+SubLCD Master Bus<br />
! Address<br />
! Description<br />
|-<br />
| 0xEE540000<br />
| SSX_SlcdMasterBus_IA_HSMMC0<br />
|-<br />
| 0xEE540400<br />
| SSX_SlcdMasterBus_IA_SubLCD<br />
|-<br />
| 0xEE540800<br />
| SSX_SlcdMasterBus_IA_SMSHC<br />
|-<br />
| 0xEE548000<br />
| SSX_SlcdMasterBus_IA_SlcdSlaveBus<br />
|-<br />
| 0xEE558000<br />
| SSX_SlcdMasterBus_TA_CameraMasterBus<br />
|}<br />
<br />
{| class='sortable wikitable mw-collapsible'<br />
|+Camera Register Bus<br />
! Address<br />
! Description<br />
|-<br />
| 0xEE648000<br />
| SSX_CameraRegBus_IA_CameraSlaveBus<br />
|-<br />
| 0xEE650000<br />
| SSX_CameraRegBus_TA_CameraIf0<br />
|-<br />
| 0xEE650400<br />
| SSX_CameraRegBus_TA_CameraIf1<br />
|-<br />
| 0xEE650800<br />
| SSX_CameraRegBus_TA_CSI0<br />
|-<br />
| 0xEE650C00<br />
| SSX_CameraRegBus_TA_CSI1<br />
|}<br />
</div></div><br />
<br />
{| class='wikitable mw-collapsible'<br />
! Start<br />
! End<br />
! Size<br />
! World<br />
! Comments<br />
|-<br />
| 0x00000000<br />
| 0x0003FFFF<br />
| 0x40000<br />
| NS/S<br />
| ARM Boot. By default, alias of physical address <code>0x1F000000</code> i.e. [[ScePower]] scratchpad.<br />
Can be remapped.<br />
|-<br />
| 0x00040000<br />
| 0x0005FFFF<br />
| 0x20000<br />
| S<br />
| MeP boot. Mirror of physical address <code>0x00800000</code>.<br />
|-<br />
| 0x00300000<br />
| 0x0030FFFF<br />
| 0x10000<br />
| S<br />
| cmep icache<br />
|-<br />
| 0x00310000<br />
| 0x0031FFFF<br />
| 0x10000<br />
| S<br />
| cmep icache tag<br />
|-<br />
| 0x00320000<br />
| 0x0032FFFF<br />
| 0x10000<br />
| S<br />
| cmep dcache<br />
|-<br />
| 0x00330000<br />
| 0x0033FFFF<br />
| 0x10000<br />
| S<br />
| cmep dcache tag<br />
|-<br />
| 0x004B0000<br />
| 0x005FFFFF<br />
| 0x150000<br />
| S<br />
| Reserved for [[Venezia]]<br />
|-<br />
| 0x00600000<br />
| 0x007FFFFF<br />
| 0x200000<br />
| S<br />
| Reserved for MeP<br />
|-<br />
| 0x00800000<br />
| 0x0081FFFF<br />
| 0x20000<br />
| S<br />
| Cmep 128KiB SRAM. Stores [[Second_Loader|second_loader]], [[Secure_Kernel|secure_kernel]] and [[Secure_Modules|Secure Modules]].<br />
|-<br />
| 0x1A000000<br />
| 0x1A001FFF<br />
| 0x2000<br />
| NS/S<br />
| ARM. SceInterruptControllerReg, ScePeriphReg, [[Interrupts]] (<code>PERIPHBASE</code>). Stores SCU_CONTROL_REG, SCU_SAC_REG.<br />
|-<br />
| 0x1A002000<br />
| 0x1A002FFF<br />
| 0x1000<br />
| NS/S<br />
| ARM. ScePl310Reg, SceL2CacheReg, [[L2 Cache Controller]]. Stores SCU_CONFIG_REG, PL310_CACHE_ID, PL310_CACHE_TYPE.<br />
|-<br />
| 0x1C000000<br />
| 0x1C1FFFFF<br />
| 0x200000<br />
| NS/S<br />
| SRAM. SRAM used to store [[ARZL]] decoded [[SceSysmem]] by [[SKBL]], [[SceDisplay]] / [[SceCamera]] SRAM (only 960x544 pixels * 4 bytes = 0x1FE000 bytes mapped), Compatibility SRAM for PspEmu (Tachyon-eDRAM), SceKernelBsodSram for [[SceKernelBlueScreenOfDeath]]. Cleared with zeroes on soft reset.<br />
|-<br />
| 0x1D000000<br />
| 0x1D000FFF<br />
| 0x1000<br />
| ?<br />
| <code>/dev/null</code> - memory that reads as zero and ignores writes. Used by [[SceMsif]].<br />
|-<br />
| 0x1D001000<br />
| 0x1D001FFF<br />
| 0x1000<br />
| ?<br />
| <code>/dev/null (E)</code> - memory that reads as zero and ignores writes. Not accessible by ARM NS.<br />
|-<br />
| 0x1F000000<br />
| 0x1F007FFF<br />
| 0x8000<br />
| NS/S<br />
| SPAD32K, ScePowerScratchPad32KiB. After suspend, [[SKBL]] stores there "Non-secure power.kprx resume" using suspendinfo then jumps to it.<br />
|-<br />
| 0x1F840000<br />
| 0x1F85FFFF<br />
| 0x20000<br />
| NS/S<br />
| SPAD128K. [[Venezia|SceVeneziaSpram]]. Stores Secure Kernel on boot.<br />
|-<br />
| 0x20000000<br />
| 0x27FFFFFF<br />
| 0x8000000<br />
| NS<br />
| [[VRAM]]. Graphics bar<br />
|-<br />
| 0x30000000<br />
| ?0x3FFFFFFF?<br />
| ?0x10000000?<br />
| S<br />
| Unknown secure area used by Cmep. Used by [[First_Loader|first_loader]] (prototype:0x5C398) and [[Second_Loader|second_loader]] (3.600.011:0x808208).<br />
|-<br />
| 0x40000000<br />
| 0x401FFFFF on FWs < 3.50<br />
0x401FFFFF on FWs >= 3.50<br />
| 0x300000 on FWs < 3.50<br />
0x200000 on FWs >= 3.50<br />
| S<br />
| [[#Secure DRAM|Secure DRAM]]<br />
|-<br />
| 0x40300000 on FWs < 3.50<br />
0x40200000 on FWs >= 3.50<br />
| 0xBFFFFFFF<br />
| 0x7FD00000 on FWs < 3.50<br />
0x7FE00000 on FWs >= 3.50<br />
| NS/S<br />
| [[#Non-secure Shared DRAM|Non-secure Shared DRAM]]<br />
|-<br />
| 0xC0000000<br />
| 0xDFFFFFFF<br />
| 0x20000000<br />
| NS/S<br />
| Reserved for [[Venezia]]. Maybe unused.<br />
|-<br />
| 0xE0000000<br />
| 0xE00FFFFF<br />
| 0x100000<br />
| S<br />
| Control Register. [[#cmep|cmep]]<br />
|-<br />
| 0xE0100000<br />
| 0xE0100FFF<br />
| 0x1000<br />
| NS<br />
| [[GPIO_Registers|SceGpio1Reg]]<br />
|-<br />
| 0xE0400000<br />
| 0xE0400FFF<br />
| 0x1000<br />
| NS<br />
| [[DMAC#DMAC4|SceDmacmgrDmac4Reg]]<br />
|-<br />
| 0xE0410000<br />
| 0xE0410FFF<br />
| 0x1000<br />
| NS<br />
| [[DMAC#DMAC5|SceDmacmgrDmac5Reg]]<br />
|-<br />
| 0xE0420000<br />
| 0xE0420FFF<br />
| 0x1000<br />
| NS<br />
| SceI2s0Reg<br />
|-<br />
| 0xE0430000<br />
| 0xE0430FFF<br />
| 0x1000<br />
| NS<br />
| SceI2s1Reg<br />
|-<br />
| 0xE0440000<br />
| 0xE0440FFF<br />
| 0x1000<br />
| NS<br />
| SceI2s2Reg<br />
|-<br />
| 0xE0450000<br />
| 0xE0450FFF<br />
| 0x1000<br />
| NS<br />
| SceI2s3Reg<br />
|-<br />
| 0xE0460000<br />
| 0xE0460FFF<br />
| 0x1000<br />
| NS<br />
| SceI2s5Reg<br />
|-<br />
| 0xE0470000<br />
| 0xE0470FFF<br />
| 0x1000<br />
| NS<br />
| SceI2s4Reg<br />
|-<br />
| 0xE0490000<br />
| 0xE0490FFF<br />
| 0x1000<br />
| NS<br />
| SceI2s7Reg<br />
|-<br />
| 0xE04A0000<br />
| 0xE04A0FFF<br />
| 0x1000<br />
| NS<br />
| SceSrcMix0Reg<br />
|-<br />
| 0xE04B0000<br />
| 0xE04B0FFF<br />
| 0x1000<br />
| NS<br />
| SceSrcMix1Reg<br />
|-<br />
| 0xE04C0000<br />
| 0xE04C0FFF<br />
| 0x1000<br />
| NS<br />
| SceSrcMix2Reg<br />
|-<br />
| 0xE04D0000<br />
| 0xE04D3FFF<br />
| 0x4000<br />
| NS<br />
| SceSpdifReg<br />
|-<br />
| 0xE04DC000<br />
| 0xE04DCFFF<br />
| 0x1000<br />
| NS<br />
| SceAclkgenReg<br />
|-<br />
| 0xE04E0000<br />
| 0xE04E0FFF<br />
| 0x1000<br />
| NS/S<br />
| [[DMAC#DMAC5_Key_Ring|SceDmacmgrKeyringReg]], SceSblDMAC5DmacKRBase, DMAC Register base<br />
|-<br />
| 0xE0500000<br />
| 0xE0500FFF<br />
| 0x1000<br />
| NS<br />
| [[I2C_Registers|SceI2c0Reg]]<br />
|-<br />
| 0xE0510000<br />
| 0xE0510FFF<br />
| 0x1000<br />
| NS<br />
| [[I2C_Registers|SceI2c1Reg]]<br />
|-<br />
| 0xE0900000<br />
| 0xE0900FFF<br />
| 0x1000<br />
| NS<br />
| [[MSIF_Registers|SceMsif]]<br />
|-<br />
| 0xE0A00000<br />
| 0xE0A00FFF<br />
| 0x1000<br />
| NS<br />
| [[SPI_Registers|SceSpi0Reg]] ([[SceSyscon]])<br />
|-<br />
| 0xE0A10000<br />
| 0xE0A10FFF<br />
| 0x1000<br />
| NS<br />
| [[SPI_Registers|SceSpi1Reg]] ([[SceMotionDev]])<br />
|-<br />
| 0xE0A20000<br />
| 0xE0A20FFF<br />
| 0x1000<br />
| NS<br />
| [[SPI_Registers|SceSpi2Reg]] ([[SceOled]])<br />
|-<br />
| 0xE0B00000<br />
| 0xE0B00FFF<br />
| 0x1000<br />
| NS<br />
| [[SDIF_Registers|SceSdif0]]<br />
|-<br />
| 0xE0C00000<br />
| 0xE0C00FFF<br />
| 0x1000<br />
| NS<br />
| [[SDIF_Registers|SceSdif1]]<br />
|-<br />
| 0xE0C10000<br />
| 0xE0C10FFF<br />
| 0x1000<br />
| NS<br />
| [[SDIF_Registers|SceSdif2]]<br />
|-<br />
| 0xE0C20000<br />
| ?<br />
| ?<br />
| ?<br />
| [[SDIF_Registers|SceSdif3]] (not present on FW 1.69, does FW 3.60 use only NSKBL?)<br />
|-<br />
| 0xE2030000<br />
| 0xE209FFFF<br />
| 0x70000<br />
| NS<br />
| [[UART_Registers|SceUartReg]]<br />
|-<br />
| 0xE20A0000<br />
| 0xE20AFFFF<br />
| 0x10000<br />
| NS/S<br />
| [[GPIO_Registers|SceGpio0Reg / SceLedReg]]<br />
|-<br />
| 0xE20B0000<br />
| 0xE20B0FFF<br />
| 0x1000<br />
| NS<br />
| [[Hardware Timers#Global Timer|Global Timer]]<br />
|-<br />
| 0xE20B1000<br />
| 0xE20B5FFF<br />
| 0x5000<br />
| NS<br />
| [[Hardware Timers|SceLongRangeTimerReg]]<br />
|-<br />
| 0xE20B6000<br />
| 0xE20B6FFF<br />
| 0x1000<br />
| NS<br />
| SceLT5 - holds System Time in usec (part of [[Hardware Timers|SceLongRangeTimerReg]])<br />
|-<br />
| 0xE20B7000<br />
| 0xE20BDFFF<br />
| 0x7000<br />
| NS<br />
| [[Hardware Timers|SceWordTimerReg]]<br />
|-<br />
| 0xE20BE000<br />
| 0xE20BEFFF<br />
| 0x1000<br />
| NS/S<br />
| SceTimerForUsleep (part of [[Hardware Timers|SceWordTimerReg]])<br />
|-<br />
| 0xE20BF000<br />
| 0xE20BFFFF<br />
| 0x1000<br />
| NS/S<br />
| [[Hardware_Timers#Bus Error Registers|Timer Bus Error Registers]]<br />
|-<br />
| 0xE20C0000<br />
| 0xE20C0FFF<br />
| 0x1000<br />
| NS<br />
| ScePwmReg<br />
|-<br />
| 0xE3000000<br />
| 0xE3000FFF<br />
| 0x1000<br />
| NS<br />
| [[DMAC#Standard_DMACs|SceDmacmgrDmac0Reg]]<br />
|-<br />
| 0xE3010000<br />
| 0xE3010FFF<br />
| 0x1000<br />
| NS<br />
| [[DMAC#Standard_DMACs|SceDmacmgrDmac1Reg]]<br />
|-<br />
| 0xE3020000<br />
| 0xE3020FFF<br />
| 0x1000<br />
| NS<br />
| SceCif0Reg<br />
|-<br />
| 0xE3030000<br />
| 0xE3030FFF<br />
| 0x1000<br />
| NS<br />
| SceCif1Reg<br />
|-<br />
| 0xE3050000<br />
| 0xE3050FFF<br />
| 0x1000<br />
| NS<br />
| SceCsi0Reg<br />
|-<br />
| 0xE3060000<br />
| 0xE3060FFF<br />
| 0x1000<br />
| NS<br />
| SceCsi1Reg<br />
|-<br />
| 0xE3100000<br />
| 0xE3100FFF<br />
| 0x1000<br />
| NS<br />
| ScePervasiveMisc<br />
|-<br />
| 0xE3101000<br />
| 0xE3101FFF<br />
| 0x1000<br />
| NS<br />
| ScePervasiveResetReg<br />
|-<br />
| 0xE3102000<br />
| 0xE3102FFF<br />
| 0x1000<br />
| NS<br />
| ScePervasiveGate<br />
|-<br />
| 0xE3103000<br />
| 0xE3103FFF<br />
| 0x1000<br />
| NS<br />
| [[Pervasive#Base_Clock|ScePervasiveBaseClk]]<br />
|-<br />
| 0xE3104000<br />
| 0xE3104FFF<br />
| 0x1000<br />
| NS<br />
| ScePervasiveVid<br />
|-<br />
| 0xE3105000<br />
| 0xE3105FFF<br />
| 0x1000<br />
| NS<br />
| [[UART_Registers|SceUartClkgenReg]]<br />
|-<br />
| 0xE3106000<br />
| 0xE3106FFF<br />
| 0x1000<br />
| NS<br />
| ScePervasiveMailboxReg<br />
|-<br />
| 0xE3108000<br />
| 0xE3108FFF<br />
| 0x1000<br />
| NS<br />
| ScePervasiveTas0<br />
|-<br />
| 0xE3109000<br />
| 0xE3109FFF<br />
| 0x1000<br />
| NS<br />
| ScePervasiveTas1<br />
|-<br />
| 0xE310A000<br />
| 0xE310AFFF<br />
| 0x1000<br />
| NS<br />
| ScePervasiveTas2<br />
|-<br />
| 0xE310B000<br />
| 0xE310BFFF<br />
| 0x1000<br />
| NS<br />
| ScePervasiveTas3<br />
|-<br />
| 0xE310C000<br />
| 0xE310CFFF<br />
| 0x1000<br />
| NS<br />
| ScePervasiveTas4<br />
|-<br />
| 0xE310D000<br />
| 0xE310DFFF<br />
| 0x1000<br />
| NS<br />
| ScePervasiveTas5<br />
|-<br />
| 0xE310E000<br />
| 0xE310EFFF<br />
| 0x1000<br />
| NS<br />
| ScePervasiveTas6<br />
|-<br />
| 0xE310F000<br />
| 0xE310FFFF<br />
| 0x1000<br />
| NS<br />
| ScePervasiveTas7<br />
|-<br />
| 0xE3110000<br />
| 0xE3110FFF<br />
| 0x1000<br />
| NS<br />
| SPM32, SPM128, Compati SRAM, ScePervasive2Reg, SceUdcd0<br />
|-<br />
| 0xE3200000<br />
| 0xE3200FFF<br />
| 0x1000<br />
| S<br />
| Base Debug ROM Table<br />
|-<br />
| 0xE3203000<br />
| 0xE3203FFF<br />
| 0x1000<br />
| NS<br />
| SceTpiuReg<br />
|-<br />
| 0xE3204000<br />
| 0xE3204FFF<br />
| 0x1000<br />
| NS<br />
| SceFunnelReg<br />
|-<br />
| 0xE3205000<br />
| 0xE3205FFF<br />
| 0x1000<br />
| NS<br />
| SceItmReg<br />
|-<br />
| 0xE3300000<br />
| 0xE3300FFF<br />
| 0x1000<br />
| S<br />
| ARM Cortex-A9 Debug ROM Table<br />
|-<br />
| 0xE3310000<br />
| 0xE3310FFF<br />
| 0x1000<br />
| NS<br />
| SceDbg0Reg, [[Debugger Interface]]<br />
|-<br />
| 0xE3311000<br />
| 0xE3311FFF<br />
| 0x1000<br />
| NS<br />
| ScePmu0Reg<br />
|-<br />
| 0xE3312000<br />
| 0xE3312FFF<br />
| 0x1000<br />
| NS<br />
| SceDbg1Reg, [[Debugger Interface]]<br />
|-<br />
| 0xE3313000<br />
| 0xE3313FFF<br />
| 0x1000<br />
| NS<br />
| ScePmu1Reg<br />
|-<br />
| 0xE3314000<br />
| 0xE3314FFF<br />
| 0x1000<br />
| NS<br />
| SceDbg2Reg, [[Debugger Interface]]<br />
|-<br />
| 0xE3315000<br />
| 0xE3315FFF<br />
| 0x1000<br />
| NS<br />
| ScePmu2Reg<br />
|-<br />
| 0xE3316000<br />
| 0xE3316FFF<br />
| 0x1000<br />
| NS<br />
| SceDbg3Reg, [[Debugger Interface]]<br />
|-<br />
| 0xE3317000<br />
| 0xE3317FFF<br />
| 0x1000<br />
| NS<br />
| ScePmu3Reg<br />
|-<br />
| 0xE3318000<br />
| 0xE3318FFF<br />
| 0x1000<br />
| NS<br />
| SceCti0Reg<br />
|-<br />
| 0xE3319000<br />
| 0xE3319FFF<br />
| 0x1000<br />
| NS<br />
| SceCti1Reg<br />
|-<br />
| 0xE331A000<br />
| 0xE331AFFF<br />
| 0x1000<br />
| NS<br />
| SceCti2Reg<br />
|-<br />
| 0xE331B000<br />
| 0xE331BFFF<br />
| 0x1000<br />
| NS<br />
| SceCti3Reg<br />
|-<br />
| 0xE331C000<br />
| 0xE331CFFF<br />
| 0x1000<br />
| NS<br />
| ScePtm0Reg<br />
|-<br />
| 0xE331D000<br />
| 0xE331DFFF<br />
| 0x1000<br />
| NS<br />
| ScePtm1Reg<br />
|-<br />
| 0xE331E000<br />
| 0xE331EFFF<br />
| 0x1000<br />
| NS<br />
| ScePtm2Reg<br />
|-<br />
| 0xE331F000<br />
| 0xE331FFFF<br />
| 0x1000<br />
| NS<br />
| ScePtm3Reg<br />
|-<br />
| 0xE3320000<br />
| 0xE3323FFF<br />
| 0x4000<br />
| NS<br />
| ARM-VFP. SceIntrmgrVfpIntRegs<br />
|-<br />
| 0xE4020000<br />
| 0xE4020FFF<br />
| 0x1000<br />
| NS<br />
| USB2_OHCI. SceUsbdEhci<br />
|-<br />
| 0xE40B0000<br />
| 0xE40B0FFF<br />
| 0x1000<br />
| NS<br />
| SceUsbdEhci<br />
|-<br />
| 0xE40C0000<br />
| 0xE40C0FFF<br />
| 0x1000<br />
| NS<br />
| SceUdcd1<br />
|-<br />
| 0xE40D0000<br />
| 0xE40D0FFF<br />
| 0x1000<br />
| NS<br />
| SceUdcd2<br />
|-<br />
| 0xE40E0000<br />
| 0xE40E0FFF<br />
| 0x1000<br />
| NS<br />
| SceUsbdEhci<br />
|-<br />
| 0xE5000000<br />
| 0xE5000FFF<br />
| 0x1000<br />
| NS<br />
| [[DMAC#Standard_DMACs|SceDmacmgrDmac2Reg]]<br />
|-<br />
| 0xE5010000<br />
| 0xE5010FFF<br />
| 0x1000<br />
| NS<br />
| [[DMAC#Standard_DMACs|SceDmacmgrDmac3Reg]]<br />
|-<br />
| 0xE5020000<br />
| 0xE5020FFF<br />
| 0x1000<br />
| NS<br />
| [[IFTU_Registers|SceIftu0RegA]] (OLED FB)<br />
|-<br />
| 0xE5021000<br />
| 0xE5021FFF<br />
| 0x1000<br />
| NS<br />
| [[IFTU_Registers|SceIftu0RegB]]<br />
|-<br />
| 0xE5022000<br />
| 0xE5022FFF<br />
| 0x1000<br />
| NS<br />
| [[IFTU_Registers|SceIftuc0Reg]]<br />
|-<br />
| 0xE5030000<br />
| 0xE5030FFF<br />
| 0x1000<br />
| NS<br />
| [[IFTU_Registers|SceIftu1RegA]] (HDMI FB)<br />
|-<br />
| 0xE5031000<br />
| 0xE5031FFF<br />
| 0x1000<br />
| NS<br />
| [[IFTU_Registers|SceIftu1RegB]]<br />
|-<br />
| 0xE5032000<br />
| 0xE5032FFF<br />
| 0x1000<br />
| NS<br />
| [[IFTU_Registers|SceIftuc1Reg]]<br />
|-<br />
| 0xE5040000<br />
| 0xE5040FFF<br />
| 0x1000<br />
| NS<br />
| [[IFTU_Registers|SceIftu2Reg]]<br />
|-<br />
| 0xE5050000<br />
| 0xE5050FFF<br />
| 0x1000<br />
| NS<br />
| [[DSI_Registers|SceDsi0Reg]]<br />
|-<br />
| 0xE5060000<br />
| 0xE5060FFF<br />
| 0x1000<br />
| NS<br />
| [[DSI_Registers|SceDsi1Reg]]<br />
|-<br />
| 0xE5070000<br />
| 0xE5070FFF<br />
| 0x1000<br />
| NS<br />
| [[SceCompatMailbox]]<br />
|-<br />
| 0xE5071000<br />
| 0xE5071FFF<br />
| 0x1000<br />
| NS<br />
| SceCompatLCDDMA<br />
|-<br />
| 0xE50C0000<br />
| 0xE50C0FFF<br />
| 0x1000<br />
| NS<br />
| [[DMAC#Standard_DMACs|SceDmacmgrDmac6Reg]]<br />
|-<br />
| 0xE50D0000<br />
| 0xE50D1FFF<br />
| 0x2000<br />
| NS<br />
| Debug/PA, ScePfmReg, SceDeci4pDtracepPaReg<br />
|-<br />
| 0xE5800000<br />
| 0xE580FFFF<br />
| 0x10000<br />
| NS<br />
| SceSDbgSdio0<br />
|-<br />
| 0xE5810000<br />
| 0xE581FFFF<br />
| 0x10000<br />
| NS<br />
| SceDbgSdio1<br />
|-<br />
| 0xE5880000<br />
| 0xE588FFFF<br />
| 0x10000<br />
| ?<br />
| LPDDR2 I/F CH1. LPDDR2SUB (1st 256MiB DRAM bank config regs) (?)<br />
|-<br />
| 0xE6000000<br />
| 0xE600FFFF<br />
| 0x10000<br />
| ?<br />
| LPDDR2 I/F CH0. LPDDR2"TOP" (2nd 256MiB DRAM bank config regs) (?). Stores DDRSC_CONF.<br />
|-<br />
| 0xE8000000<br />
| 0xE8001FFF<br />
| 0x2000<br />
| S<br />
| SceSonyRegbus. GPU Control<br />
|-<br />
| 0xE8100000<br />
| 0xE8100FFF<br />
| 0x1000<br />
| NS/S<br />
| SceCompatSharedSram ([[PSP_Emulator#PSP_Memory_Layout|<code>0xBFC00000</code>]] in PSP)<br />
|-<br />
| 0xE8200000<br />
| 0xE8200FFF<br />
| 0x1000<br />
| S<br />
| SceEmcTop (External Memory Controller, VRAM?)<br />
|-<br />
| 0xE8300000<br />
| 0xE8301FFF<br />
| 0x2000<br />
| S<br />
| SceGrab<br />
|-<br />
| 0xE8400000<br />
| 0xE841FFFF<br />
| 0x20000<br />
| NS<br />
| SceSGX543Reg. See [[SGX543]].<br />
|-<br />
| 0xEC000000<br />
| ?<br />
| ?<br />
| NS/S<br />
| Xbar<br />
|-<br />
| 0xED000000<br />
| ?<br />
| ?<br />
| NS/S<br />
| Xbar<br />
|-<br />
| 0xEE000000<br />
| ?<br />
| ?<br />
| NS/S<br />
| Xbar<br />
|-<br />
| 0xF0000000<br />
| ?<br />
| ?<br />
| ?<br />
| Reserved for [[Venezia]]<br />
|}<br />
<br />
== Secure DRAM ==<br />
<br />
=== System Software version 0.931.010 Secure DRAM ===<br />
<br />
On System Software version 0.931.010, [[SKBL]] is stored at physical address <code>0x50000000</code>. So, on System Software version 0.931.010, which data are stored at <code>0x40040000</code>? Is it even considered as Secure DRAM?<br />
<br />
[[ARZL]] compressed [[NSKBL]] is kept in place inside SKBL segment 0 (at offset 0x37100) til [[ARZL]] decoding to Non-secure DRAM at physical address <code>0x51000000</code>.<br />
<br />
=== FWs 0.990-0.995 Secure DRAM ===<br />
<br />
On FWs 0.990-0.995, [[SKBL]] segment 0 starts at physical address <code>0x40040000</code>.<br />
<br />
[[ARZL]] compressed [[NSKBL]] is extracted from a [[Kernel_Boot_Loader|kernel_boot_loader]] segment to Non-secure DRAM at physical address <code>0x50000000</code>. It is then [[ARZL]] decoded to Non-secure DRAM at physical address <code>0x51000000</code>.<br />
<br />
=== FWs >=0.996 Secure DRAM ===<br />
<br />
Since FW 0.996, [[SKBL]] segment 0 starts at physical address <code>0x40020000</code>. This change could have come from the increasing [[SKBL]] segment 0 size with revisions.<br />
<br />
=== FW 3.60 Secure DRAM ===<br />
<br />
{| class='wikitable'<br />
! Start<br />
! End<br />
! Size<br />
! Comments<br />
|-<br />
| 0x40000000<br />
| 0x400000BF<br />
| 0xC0<br />
| SKBL Reset Vector<br />
|-<br />
| 0x40000500<br />
| 0x400099FF<br />
| 0x9500<br />
| kprx_auth_sm.self. This area is also used as a scratchpad at boot.<br />
|-<br />
| 0x40009B00<br />
| 0x4000A27F<br />
| 0x780<br />
| prog_rvk.srvk<br />
|-<br />
| 0x4001FD00<br />
| 0x4001FEFF<br />
| 0x100<br />
| SceKblParam with magic not set<br />
|-<br />
| 0x40020000<br />
| 0x400570C7<br />
| 0x370C8<br />
| SKBL segment 0<br />
|-<br />
| 0x40057100<br />
| 0x400571DF<br />
| 0xE0<br />
| SKBL segment 1<br />
|-<br />
| 0x40073570<br />
| 0x4007376F<br />
| 0x200<br />
| SceKblParam<br />
|}<br />
<br />
== Non-secure Shared DRAM ==<br />
<br />
This region is used by both Secure and Non-Secure Kernel Boot Loaders, and by Secure Kernel modules.<br />
<br />
{| class='wikitable'<br />
! Start<br />
! End<br />
! Size<br />
! Comments<br />
|-<br />
| 0x40200000 on FW 3.60<br />
0x40300000 on FW 1.69<br />
| 0x4FFFFFFF<br />
| 0x0FE00000 on FW 3.60<br />
0x0FD00000 on FW 1.69<br />
| TrustZone region. ?First 0x1000 bytes are a Reset Vector named SceKernelReset whose first 0x100 bytes are identical as in uncompressed NSKBL (need to check)?<br />
|-<br />
| 0x50000000<br />
| 0x50FFFFFF<br />
| 0x1000000<br />
| ARZL compressed NSKBL. Comes from one of kernel_boot_loader.self segments.<br />
|-<br />
| 0x51000000<br />
| 0x51FFFFFF<br />
| 0x1000000<br />
| SceBootKernelImage. Uncompressed [[NSKBL]]. Comes from ARZL compressed NSKBL.<br />
|-<br />
| 0x52000000<br />
| 0x5FFFFFFF<br />
| 0xE000000<br />
| Non-secure kernel and usermode modules<br />
|-<br />
| 0x60000000<br />
| 0x7FFFFFFF<br />
| 0x20000000<br />
| DevKit additional 512MiB. LDDR2TOP.<br />
|-<br />
| 0x80000000<br />
| 0x9FFFFFFF<br />
| 0x20000000<br />
| DevKit additional 512MiB. LDDR2SUB. For perf (not published anywhere). This memory is mapped on usermode VA 0x40000000.<br />
|-<br />
| 0xA0000000<br />
| 0xBFFFFFFF<br />
| 0x20000000<br />
| DevKit additional 512MiB. LDDR2SUB. For perf (not published anywhere, disabled).<br />
|}<br />
<br />
== NSKBL Layout ==<br />
<br />
=== NSKBL on FW 0.931 ===<br />
<br />
ARZL encoded size: 0x2541B.<br />
<br />
=== NSKBL on FW 3.60 ===<br />
<br />
{| class='wikitable'<br />
! Start<br />
! End<br />
! Size<br />
! Comments<br />
|-<br />
| 0x51000000<br />
| 0x51028087<br />
| 0x28088<br />
| NSKBL Text segment<br />
|-<br />
| ???<br />
| ???<br />
| ???<br />
| NSKBL Data segment<br />
|}<br />
<br />
Notes:<br />
* The first 0xC0 bytes of the Text segment are the reset vector.<br />
* NSKBL is mapped in RWX mode so it may write itself to text segment.<br />
<br />
== Cmep registers ==<br />
<br />
See also [[Cmep registers]].<br />
<br />
Each Cmep device has its own physical memory area.<br />
<br />
{| class='wikitable'<br />
! Start<br />
! End<br />
! Comments<br />
|-<br />
| 0xE0000000<br />
| 0xE000FFFF<br />
| [[Cmep#Communication|ARM/Cmep communication]]<br />
|-<br />
| 0xE0010000<br />
| 0xE001FFFF<br />
| [[Cmep]] Reset<br />
|-<br />
| 0xE0020000<br />
| 0xE002FFFF<br />
| Unknown device. See [[ReadAs]]. Related to DMA.<br />
|-<br />
| 0xE0030000<br />
| 0xE003FFFF<br />
| [[Cmep_registers#0xE0030000:_Bigmac_Keyring_controller|Bigmac Key Ring controller]]. ?EEPROM programmer?<br />
|-<br />
| 0xE0040000<br />
| 0xE004FFFF<br />
| Cmep Math Processor (Bignum worker)<br />
|-<br />
| 0xE0050000<br />
| 0xE0050FFF?<br />
| [[DMAC#Bigmac|Bigmac]] DMAC/crypto engine (similar to [[DMAC#DMAC5|DMAC5]])<br />
|-<br />
| 0xE0058000<br />
| 0xE0067FFF<br />
| [[Cmep registers]] [[Cmep Key Ring Base]]. EEPROM / [[DMAC#Bigmac_Key_Ring|Bigmac key ring]], <code>0x800</code> entries, <code>0x20</code> bytes for each slot<br />
|-<br />
| 0xE0070000<br />
| ?<br />
| SceEmmcController<br />
|-<br />
| 0xE00C0000<br />
| 0xE00CFFFF<br />
| ?<br />
|}<br />
<br />
== Interrupt registers ==<br />
<br />
{| class='wikitable'<br />
! Start<br />
! End<br />
! Comments<br />
|-<br />
| 0xE3100138<br />
| 0xE310013B<br />
| BEATB<br />
|-<br />
| 0xE310013C<br />
| 0xE310013F<br />
| BEADR<br />
|-<br />
| 0xE3110D80<br />
| 0xE3110D83<br />
| BET0<br />
|-<br />
| 0xE3110D90<br />
| 0xE3110D93<br />
| BET1<br />
|-<br />
| 0xE3110D94<br />
| 0xE3110D97<br />
| BEBT<br />
|-<br />
| 0xE3000110<br />
| 0xE3000113<br />
| DMAC0 - address<br />
|-<br />
| 0xE3000114<br />
| 0xE3000117<br />
| DMAC0 - attribute<br />
|-<br />
| 0xE3010110<br />
| 0xE3010113<br />
| DMAC1 - address<br />
|-<br />
| 0xE3010114<br />
| 0xE3010117<br />
| DMAC1 - attribute<br />
|-<br />
| 0xE5000110<br />
| 0xE5000113<br />
| DMAC2 - address<br />
|-<br />
| 0xE5000114<br />
| 0xE5000117<br />
| DMAC2 - attribute<br />
|-<br />
| 0xE5010110<br />
| 0xE5010113<br />
| DMAC3 - address<br />
|-<br />
| 0xE5010114<br />
| 0xE5010117<br />
| DMAC3 - attribute<br />
|-<br />
| 0xE0400810<br />
| 0xE0400813<br />
| DMAC4 - address<br />
|-<br />
| 0xE0400814<br />
| 0xE0400817<br />
| DMAC4 - attribute<br />
|-<br />
| 0xE50C0110<br />
| 0xE50C0113<br />
| DMAC6 - address<br />
|-<br />
| 0xE50C0114<br />
| 0xE50C0117<br />
| DMAC6 - attribute<br />
|-<br />
| 0xE3110D14<br />
| 0xE3110D17<br />
| SPM32 - address<br />
|-<br />
| 0xE3110D18<br />
| 0xE3110D1B<br />
| SPM32 - attribute<br />
|-<br />
| 0xE3110D04<br />
| 0xE3110D07<br />
| SPM128 - address<br />
|-<br />
| 0xE3110D08<br />
| 0xE3110D0B<br />
| SPM128 - attribute<br />
|-<br />
| 0xE600C008<br />
| 0xE600C00B<br />
| LPDDR2 I/F CH0 - address<br />
|-<br />
| 0xE600C000<br />
| 0xE600C003<br />
| LPDDR2 I/F CH0 - attribute<br />
|-<br />
| 0xE588C008<br />
| 0xE588C00B<br />
| LPDDR2 I/F CH1 - address<br />
|-<br />
| 0xE588C000<br />
| 0xE588C003<br />
| LPDDR2 I/F CH1 - attribute<br />
|-<br />
| 0xE310013C<br />
| 0xE310013F<br />
| Pervasive - address<br />
|-<br />
| 0xE3100138<br />
| 0xE310013B<br />
| Pervasive - attribute<br />
|-<br />
| 0xE50D10F0<br />
| 0xE50D10F3<br />
| Debug/PA - address<br />
|-<br />
| 0xE50D10F4<br />
| 0xE50D10F7<br />
| Debug/PA - attribute<br />
|-<br />
| 0xE3110D34<br />
| 0xE3110D37<br />
| Pervasive2 - address<br />
|-<br />
| 0xE3110D38<br />
| 0xE3110D3B<br />
| Pervasive2 - attribute<br />
|-<br />
| 0xE580FFF0<br />
| 0xE580FFF3<br />
| SDIO0 - address<br />
|-<br />
| 0xE580FFF4<br />
| 0xE580FFF7<br />
| SDIO0 - attribute<br />
|-<br />
| 0xE581FFF0<br />
| 0xE581FFF3<br />
| SDIO1 - address<br />
|-<br />
| 0xE581FFF4<br />
| 0xE581FFF7<br />
| SDIO1 - attribute<br />
|-<br />
|}<br />
<br />
== PSP Emulator ==<br />
<br />
[[PSP_Emulator|PSP Emulator memory map]]<br />
<br />
[[Category:Devices]]<br />
[[Category:Memory]]<br />
[[Category:Kernel]]</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=Hardware_Timers&diff=21127
Hardware Timers
2024-02-22T19:48:42Z
<p>CreepNT: Add changes based off 0.920 phymem table</p>
<hr />
<div>The PSVita system embeds 8 Word timers (<code>SceWT0</code> to <code>SceWT7</code>) and 6 Longrange timers (<code>SceLT0</code> to <code>SceLT5</code>). The timers consist of a counter that gets incremented at a configurable time interval (multiple of a base frequency?), and can generate an interrupt when a certain value is reached.<br />
<br />
Most timers are managed by [[SceSystimer]].<br />
<br />
== Available timers ==<br />
<br />
The <code>Address</code> column indicates the '''physical''' address at which the interface for a timer is located. <br />
<br />
Each timer interface takes 0x1000 bytes.<br />
<br />
{| class="wikitable" style="text-align:center;"<br />
|+ List of timers<br />
|-<br />
! Name !! Address !! Interrupt ID !! Usage<br />
|-<br />
| <code>GT</code> || 0xE20B0000 || ? || Never used by the operating system<br />
|-<br />
| SceLT0 / SceSystimerLongrangeTimer0 || 0xE20B1000 || 0x88 || Available for [[SceSystimer]]<br />
|-<br />
| SceLT1 / SceSystimerLongrangeTimer1 || 0xE20B2000 || 0x89 || Available for [[SceSystimer]]<br />
|-<br />
| SceLT2 / SceSystimerLongrangeTimer2 || 0xE20B3000 || 0x8A || Available for [[SceSystimer]]<br />
|-<br />
| SceLT3 / SceSystimerLongrangeTimer3 || 0xE20B4000 || 0x8B || Available for [[SceSystimer]]<br />
|-<br />
| SceLT4 / SceSystimerLongrangeTimer4 || 0xE20B5000 || 0x8C || Available for [[SceSystimer]]<br />
|-<br />
| SceLT5 / SceThreadmgrTimer || 0xE20B6000 || 0x8D || Used by [[SceKernelThreadMgr]] as CPU timer<br />
|-<br />
| SceWT0 / SceSystimerWordTimer0 || 0xE20B7000 || 0x80 || Available for [[SceSystimer]]<br />
|-<br />
| SceWT1 / SceSystimerWordTimer1 || 0xE20B8000 || 0x81 || Available for [[SceSystimer]]<br />
|-<br />
| SceWT2 / SceSystimerWordTimer2 || 0xE20B9000 || 0x82 || Available for [[SceSystimer]]<br />
|-<br />
| SceWT3 / SceSystimerWordTimer3 || 0xE20BA000 || 0x83 || Available for [[SceSystimer]]<br />
|-<br />
| SceWT4 / SceSystimerWordTimer4 || 0xE20BB000 || 0x84 || Available for [[SceSystimer]]<br />
|-<br />
| SceWT5 / SceSystimerWordTimer5 || 0xE20BC000 || 0x85 || Available for [[SceSystimer]]<br />
|-<br />
| SceWT6 / SceSystimerWordTimer6 || 0xE20BD000 || 0x86 || Available for [[SceSystimer]]<br />
|-<br />
| SceWT7 / SceTimerForUsleep || 0xE20BE000 || 0x87 || Used by [[SceKernelIntrMgr#SceIntrmgrForTZS|Tzs SceKernelIntrMgr]] for [[SceKernelIntrMgr#sceKernelUsleepForTZS|usleep]]<br />
|}<br />
<br />
== Bus Error Registers ==<br />
<br />
Called <code>TMBERR</code> in 0.920. This interface found at physical address <code>0xE20BF000</code> is used to manage Timer Bus Errors.<br />
<br />
{| class="wikitable"<br />
|+ Timer Bus Error interface<br />
|-<br />
! Offset !! Usage<br />
|-<br />
| 0x0<br />
| Bus Error Address<br />
|-<br />
| 0x4<br />
| Bus Error Attributes<br />
|-<br />
| 0x8<br />
| Secure Bus Error Address<br />
|-<br />
| 0xC<br />
| Secure Bus Error Attributes<br />
|}<br />
<br />
== Configuration register ==<br />
<br />
The configuration register is identical for all timers. The period of a Systimer tick is calculated using the following formulas:<br />
* <code>t = (prescale_factor + 1) / src_clk</code> in seconds (multiply by 10^9 for ns)<br />
* <code>f = 1 / t = src_clk / (prescale_factor+1)</code> in Hz (divide by 10^6 for MHz) <br />
<br />
<code>src_clk</code> is the frequency of the timer's input clock - see below for more information.<br />
<br />
{| class="wikitable"<br />
|+ Configuration register bit mappings<br />
|-<br />
! Mask !! Name !! Effect / Notes<br />
|-<br />
| 0x00000001 || enable || 0: timer stopped - 1: timer counting<br />
|-<br />
| 0x0000000E || ? ||<br />
|-<br />
| 0x00000070 || ? || ?Mode select?<br />
|-<br />
| 0x00000080 || ? ||<br />
|-<br />
| 0x00000700 || clk2_ctrl || Changes clock if <code>clk_select == 2</code><br />
|-<br />
| 0x00000800 || RAZ/WI || Read As Zero / Write Ignore (always 0)<br />
|-<br />
| 0x0000F000 || ? ||<br />
|-<br />
| 0x000F0000 || ? ||<br />
|-<br />
| 0x00F00000 || clk_select || Controls which clock is used as input to prescaler (see below)<br />
|-<br />
| 0xFF000000 || prescale_factor || Input clock division factor (the higher this is, the slower the timer will tick)<br />
|}<br />
<br />
{| class="wikitable"<br />
|+ Available input clocks<br />
|-<br />
! <code>clk_select</code> || Input clock<br />
|-<br />
| 0 || [[ScePower#scePowerSetSysClockFrequencyForDriver|ScePower SysClock]] (190/222MHz)<br />
|-<br />
| 1 || ~37MHz<br />
|-<br />
| 2<br />
| Varies based on '''<code>clk2_ctrl</code>'''<br />
{| class="wikitable"<br />
! <code>clk2_ctrl</code><br />
!<br />
|-<br />
| 0<br />
| 27MHz<br />
|-<br />
| 2-3<br />
| ~24.57MHz<br />
|-<br />
| 4 || ~37.38MHz<br />
|-<br />
| 5 || ~74MHz<br />
|-<br />
| 1,6,7 || No clock (timer doesn't tick)<br />
|}<br />
|-<br />
| 3 || 48MHz<br />
|-<br />
| 4 || 60Hz<br />
|-<br />
| 5 || ~35.6kHz<br />
|-<br />
| 8 || 60Hz<br />
|-<br />
| 9 || ~45kHz<br />
|-<br />
| 6-7,A-F || No clock (timer doesn't tick)<br />
|}<br />
<br />
{| class="wikitable"<br />
|+ Known configurations<br />
|-<br />
! Timer !! Value !! Explaination<br />
|-<br />
| SceWT7 (SceTimerForUsleep) || 0xDD00000D || SysClock source / (prescale_factor = 221) -> 0.85/1MHz frequency<br />
|-<br />
| SceLT5 || 0x2F34500D || 48MHz source / (prescale_factor = 47) -> 1MHz frequency<br />
|}<br />
<br />
== Word Timers ==<br />
<br />
Timers with 32-bit counters.<br />
<source lang="C"><br />
typedef volatile _SceWordTimer {<br />
SceUInt32 unk0; // Value at which an interrupt is triggered?<br />
SceUInt32 current; // Current value of the timer's counter<br />
SceUInt32 cfg; // Configuration register<br />
SceUInt32 unkC; // Another counter?<br />
SceUInt32 unk10; // Unused?<br />
SceUInt32 unk14; // Interrupt status? Write 0x3 to clear pending IRQ?<br />
} SceWordTimer;<br />
</source><br />
<br />
== Long Timers ==<br />
<br />
Timers with 64-bit counters.<br />
<br />
SceLT5 timer is configured to increment every microsecond (1MHz frequency).<br />
<source lang="C"><br />
typedef volatile _SceLongTimer {<br />
SceKernelSysClock current; // Current value of the timer counter<br />
SceKernelSysClock unk8; // Value at which an interrupt is triggered?<br />
SceKernelSysClock unk10; // Another counter?<br />
SceUInt32 unk18; // Interrupt status? Write 0x3 to clear pending IRQ?<br />
SceUInt32 cfg; // Configuration register<br />
} SceLongTimer;<br />
</source><br />
<br />
NOTE: On ARMv7 processors that do not support the Large Physical Address Extension, such as the PS Vita's CPU, [https://developer.arm.com/documentation/ddi0406/cb/Application-Level-Architecture/Application-Level-Memory-Model/Memory-types-and-attributes-and-the-memory-order-model/Atomicity-in-the-ARM-architecture?lang=en 64-bit accesses are not guaranteed to be atomic].<br />
<br />
This can lead to issues when reading the timer if the low word of a counter is about to overflow.<br />
<br />
To ensure the readings from a timer are accurate, use code similar to the following code:<br />
<source lang="C"><br />
//Return value should hopefully be optimized into registers<br />
SceKernelSysClock readCounter(volatile SceKernelSysClock* pTimer) {<br />
SceKernelSysClock ctr;<br />
SceUInt32 ctrHi;<br />
do {<br />
ctr.u.hi = pTimer->u.hi; //Read high word first<br />
ctr.u.lo = pTimer->u.lo; //Read low word next<br />
ctrHi = pTimer->u.hi; //Read high word again to make sure no overflow happened<br />
} while (ctr.hi != ctrHi); //Try again if high word changed while reading low word<br />
<br />
return ctr;<br />
}<br />
</source><br />
<br />
== Global Timer ==<br />
<br />
Located at physical address <code>0xE20B0000</code>.<br />
<br />
This name is derived from the abbreviation used to name it in 0.920 <code>sysmem.skprx</code> physical address table: <code>GT</code>.<br />
<br />
The Global Timer is a 64-bit timer with the following restrictions:<br />
* Fixed input clock selection (always SysClock)<br />
* Only prescale factor can be changed in the configuration register<br />
** '''All fields other than <code>prescale_factor</code> and <code>enable</code> are RAZ/WI'''<br />
* Cannot generate interrupts?<br />
<br />
<source lang="c"><br />
typedef volatile _SceTopTimer {<br />
SceKernelSysClock current; // Current value of the timer counter<br />
unsigned RAZ_WI; //Read As Zero / Write Ignore<br />
SceUInt32 cfg; //Configuration register<br />
} SceHiddenTimer;<br />
</source></div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=SceSysmem&diff=21126
SceSysmem
2024-02-21T23:53:20Z
<p>CreepNT: /* SceSysrootForKernel_118657C6 */ Add potential name</p>
<hr />
<div>SceSysmem is a kernel module that acts as the heart of the kernel. It exports multiple libraries for various features. SceSysmem is the first module that is loaded in the [[Boot Sequence|kernel load sequence]] and its libraries are imported by almost all other modules. See [[Virtual Memory]] and [[Physical Memory]] for more details on the memory subsystem.<br />
<br />
== Module ==<br />
<br />
This module exists in both non-secure and secure world. The non-secure world SELF can be found in <code>os0:kd/sysmem.skprx</code>. It also can be found in the [[Boot Sequence|Boot Image]].<br />
<br />
{| class="wikitable"<br />
! Version !! World !! Privilege<br />
|-<br />
| 1.50-3.61 || Non-secure || Kernel<br />
|-<br />
| 1.69-1.80 || Secure || Kernel<br />
|}<br />
<br />
== Libraries ==<br />
<br />
=== Known NIDs ===<br />
{| class="wikitable"<br />
! Version !! Name !! World !! Visibility !! NID<br />
|-<br />
| 0.990-3.61 || [[SceSysmem#SceSysmemForKernel|SceSysmemForKernel]] || Non-secure || Kernel || 0x63A519E5<br />
|-<br />
| 3.63-3.65 || [[SceSysmem#SceSysmemForKernel|SceSysmemForKernel]] || Non-secure || Kernel || 0x02451F0F<br />
|-<br />
| 0.990-3.65 || [[SceSysmem#SceSysmemForDriver|SceSysmemForDriver]] || Non-secure || Kernel || 0x6F25E18A<br />
|-<br />
| 0.990-1.692 || [[SceSysmem#SceSysmemForDebugger|SceSysmemForDebugger]] || Non-secure || Kernel || 0xC7309957<br />
|-<br />
| 1.80-3.74 || [[SceSysmem#SceSysmemForDebugger|SceSysmemForDebugger]] || Non-secure || Kernel || not present. Removed.<br />
|-<br />
| 0.990-3.60 || [[SceSysmem#SceSysmem|SceSysmem]] || Non-secure || User || 0x37FE725A<br />
|-<br />
| 0.990-3.65 || [[SceSysmem#SceDipsw|SceDipsw]] || Non-secure || User || 0xB36D5922<br />
|-<br />
| 0.990-3.65 || [[SceSysmem#SceDipswForDriver|SceDipswForDriver]] || Non-secure || Kernel || 0xC9E26388<br />
|-<br />
| 0.990-3.61 || [[SceSysmem#SceUartForKernel|SceUartForKernel]] || Non-secure || Kernel || 0xC03DBE40<br />
|-<br />
| 3.63-3.65 || [[SceSysmem#SceUartForKernel|SceUartForKernel]] || Non-secure || Kernel || 0x1CCD9BA3<br />
|-<br />
| 0.990-3.740.011 || [[SceSysmem#SceCpu|SceCpu]] || Non-secure || User || 0x45265161<br />
|-<br />
| 0.990-3.61 || [[SceSysmem#SceCpuForKernel|SceCpuForKernel]] || Non-secure || Kernel || 0x54BF2BAB<br />
|-<br />
| 3.63-3.65 || [[SceSysmem#SceCpuForKernel|SceCpuForKernel]] || Non-secure || Kernel || 0xA5195D20<br />
|-<br />
| 0.990-3.65 || [[SceSysmem#SceCpuForDriver|SceCpuForDriver]] || Non-secure || Kernel || 0x40ECDB0E<br />
|-<br />
| 0.990-1.692 || [[SceSysmem#SceSysclibForKernel|SceSysclibForKernel]] || Non-secure || Kernel || 0x24878615<br />
|-<br />
| 1.80-3.74 || [[SceSysmem#SceSysclibForKernel|SceSysclibForKernel]] || Non-secure || Kernel || not present. Removed.<br />
|-<br />
| 0.990-3.65 || [[SceSysmem#SceSysclibForDriver|SceSysclibForDriver]] || Non-secure || Kernel || 0x7EE45391<br />
|-<br />
| 0.990-3.65 || [[SceSysmem#SceSysrootForKernel|SceSysrootForKernel]] || Non-secure || Kernel || 0x3691DA45<br />
|-<br />
| 0.990-3.65 || [[SceSysmem#SceSysrootForDriver|SceSysrootForDriver]] || Non-secure || Kernel || 0x2ED7F97A<br />
|-<br />
| 0.990-3.65 || [[SceSysmem#SceKernelUtilsForDriver|SceKernelUtilsForDriver]] || Non-secure || Kernel || 0x496AD8B4<br />
|-<br />
| 0.990-1.692 || [[SceSysmem#SceZlibForDriver|SceZlibForDriver]] || Non-secure || Kernel || 0xE241534E<br />
|-<br />
| 1.80-3.74 || [[SceSysmem#SceZlibForDriver|SceZlibForDriver]] || Non-secure || Kernel || not present. Moved to [[SceSblPostSsMgr#SceZlibForDriver]].<br />
|-<br />
| 0.990-3.65 || [[SceSysmem#SceKernelSuspendForDriver|SceKernelSuspendForDriver]] || Non-secure || Kernel || 0x7290B21C<br />
|-<br />
| 0.990-3.65 || [[SceSysmem#SceQafMgrForDriver|SceQafMgrForDriver]] || Non-secure || Kernel || 0x4E29D3B6<br />
|-<br />
| 0.990-3.65 || [[SceSysmem#ScePmMgrForDriver|ScePmMgrForDriver]] || Non-secure || Kernel || 0xF13F32F9<br />
|-<br />
| 0.990-3.65 || [[SceSysmem#SceSblAIMgrForDriver|SceSblAIMgrForDriver]] || Non-secure || Kernel || 0xFD00C69A<br />
|-<br />
| 0.990-3.65 || [[SceSysmem#SceProcEventForDriver|SceProcEventForDriver]] || Non-secure || Kernel || 0x887F19D0<br />
|-<br />
| 0.990-3.65 || [[SceSysmem#SceDebugLed|SceDebugLed]] || Non-secure || User || 0xAE004C0A<br />
|-<br />
| 0.990-3.65 || [[SceSysmem#SceDebugLedForDriver|SceDebugLedForDriver]] || Non-secure || Kernel || 0x7BC05EAD<br />
|-<br />
| 0.990-3.61 || [[SceSysmem#SceDebugForKernel|SceDebugForKernel]] || Non-secure || Kernel || 0x88C17370<br />
|-<br />
| 3.63-3.65 || [[SceSysmem#SceDebugForKernel|SceDebugForKernel]] || Non-secure || Kernel || 0x13D793B7<br />
|-<br />
| 0.990-3.65 || [[SceSysmem#SceDebugForDriver|SceDebugForDriver]] || Non-secure || Kernel || 0x88758561<br />
|-<br />
| 0.931-3.60 || [[SceSysmem#SceSysmemForTZS|SceSysmemForTZS]] || Secure || Kernel || 0x08680060<br />
|-<br />
| 0.931-3.60 || [[SceSysmem#SceDipswForTZS|SceDipswForTZS]] || Secure || Kernel || 0x9DBF584C<br />
|-<br />
| 0.931-3.60 || [[SceSysmem#SceUartForTZS|SceUartForTZS]] || Secure || Kernel || 0xA1D740D7<br />
|-<br />
| 0.931-3.60 || [[SceSysmem#SceDebugForTZS|SceDebugForTZS]] || Secure || Kernel || 0x028FFADB<br />
|-<br />
| 0.931-3.60 || [[SceSysmem#SceCpuForTZS|SceCpuForTZS]] || Secure || Kernel || 0xC516B23E<br />
|-<br />
| 0.931-3.60 || [[SceSysmem#SceSysclibForTZS|SceSysclibForTZS]] || Secure || Kernel || 0xC839BB78<br />
|-<br />
| 0.931-3.60 || [[SceSysmem#SceSysrootForTZS|SceSysrootForTZS]] || Secure || Kernel || 0xFEFF641D<br />
|-<br />
| 0.931-3.60 || [[SceSysmem#SceQafMgrForTZS|SceQafMgrForTZS]] || Secure || Kernel || 0x637069DD<br />
|-<br />
| 0.931-3.60 || [[SceSysmem#ScePmMgrForTZS|ScePmMgrForTZS]] || Secure || Kernel || 0x27F1AFD8<br />
|-<br />
| 0.931-3.60 || [[SceSysmem#SceSblAIMgrForTZS|SceSblAIMgrForTZS]] || Secure || Kernel || 0x60D19047<br />
|}<br />
<br />
The SceCpu libraries provide wrappers for much ARM CP15 co-processor access as well as low level support of spinlocks and other synchronization primitives.<br />
<br />
== Types ==<br />
<br />
See [[SceSysmem Types]].<br />
<br />
== SysEvent ==<br />
<br />
Dispatcher<br />
<br />
{| class="wikitable sortable mw-collapsible mw-collapsed"<br />
|-<br />
! Module !! Type !! Event !! Description<br />
|-<br />
| [[ScePower]] || 0 || 0x100 || <code>SCE_KERNEL_SYSEVENT_SUSPEND_START</code>. before sceKernelCpuSuspendIntr.<br />
|-<br />
| [[ScePower]] || 0 || 0x101 || unknown<br />
|-<br />
| [[ScePower]] || 0 || 0x102 || unknown. later sceKernelCpuResumeIntr.<br />
|-<br />
| [[ScePower]] || 0 || 0x20F -> 0x200 || <code>SCE_KERNEL_SYSEVENT_SUSPEND_PHASE2</code>. after sceKernelCpuResumeIntr.<br />
|-<br />
| [[ScePower]] || 0 || 0x400 || <code>SCE_KERNEL_SYSEVENT_SUSPEND_PHASE1_START</code>.<br />
|-<br />
| [[ScePower]] || 0 || 0x401 || <code>SCE_KERNEL_SYSEVENT_SUSPEND_PHASE1_MAIN</code>. (this is a guessed name. but should be official name)<br />
|-<br />
| [[ScePower]] || 0 || 0x402 || <code>SCE_KERNEL_SYSEVENT_SUSPEND_PHASE1_END</code>. (this is a guessed name)<br />
|-<br />
| [[ScePower]] || 1 || 0x1000 || <code>SCE_KERNEL_SYSEVENT_SUSPEND_FREEZE_TIME</code>.<br />
|-<br />
| [[ScePower]] || 1 || 0x400F -> 0x4000 || <code>SCE_KERNEL_SYSEVENT_SUSPEND_PHASE0</code>.<br />
|-<br />
| [[ScePower]] || 1 || 0x10000 -> 0x1000F || <code>SCE_KERNEL_SYSEVENT_RESUME_PHASE0</code>.<br />
|-<br />
| [[ScePower]] || 1 || 0x40000 || <code>SCE_KERNEL_SYSEVENT_RESUME_MELT_TIME</code>. before sceKernelCpuResumeIntr.<br />
|-<br />
| [[ScePower]] || 1 || 0x100000 || <code>SCE_KERNEL_SYSEVENT_RESUME_PHASE1_START</code>. after sceKernelCpuResumeIntr.<br />
|-<br />
| [[ScePower]] || 1 || 0x100001 || <code>SCE_KERNEL_SYSEVENT_RESUME_PHASE1_MAIN</code>.<br />
|-<br />
| [[ScePower]] || 1 || 0x100002 || <code>SCE_KERNEL_SYSEVENT_RESUME_PHASE1_END</code>. (this is a guessed name)<br />
|-<br />
| [[ScePower]] || 1 || 0x400000 || <code>SCE_KERNEL_SYSEVENT_RESUME_COMPLETED<br />
|}<br />
<br />
Handler<br />
<br />
{| class="wikitable sortable mw-collapsible mw-collapsed"<br />
|-<br />
! Module !! Type !! Event !! Description<br />
|-<br />
| [[SceAppMgr]] || 0 || 0x20F || _sceAppMgrSystemSuspend<br />
|-<br />
| [[SceAppMgr]] || 1 || 0x400000 || _sceAppMgrSystemResume<br />
|-<br />
| [[SceAudio]] || 0 || 0x1000 || Something<br />
|-<br />
| [[SceAudio]] || 0 || 0x400F || Something<br />
|-<br />
| [[SceAudio]] || 0 || 0x102 || Something<br />
|-<br />
| [[SceAudio]] || 1 || 0x1000F || Something<br />
|-<br />
| [[SceAudioin]] (SceAudioIn) || 0 || 0x102 || Something<br />
|-<br />
| [[SceAudioin]] (SceAudioIn) || 1 || 0x1000F || Something<br />
|-<br />
| [[SceAVConfig]] || 0 || 0x200 || Something<br />
|-<br />
| [[SceAVConfig]] || 1 || 0x400000 || Something<br />
|-<br />
| [[SceAVConfig]] || 1 || 0x1000F || Something<br />
|-<br />
| [[SceAVConfig]] || 1 || 0x100001 || Something<br />
|-<br />
| [[SceBt]] || 0 || 0x401 || Something<br />
|-<br />
| [[SceBt]] || 0 || 0x402 || Something<br />
|-<br />
| [[SceBt]] || 1 || 0x100001 || Something<br />
|-<br />
| [[SceBt]] || 1 || 0x100002 || Something<br />
|-<br />
| [[SceCamera]] || 0 || 0x401 || Something<br />
|-<br />
| [[SceCamera]] || 0 || 0x402 || Something<br />
|-<br />
| [[SceCamera]] || 0 || 0x400 || Something<br />
|-<br />
| [[SceCamera]] || 1 || 0x100000 || Something<br />
|-<br />
| [[SceCamera]] || 1 || 0x100002 || Something<br />
|-<br />
| [[SceClockgen]] || 1 || 0x10000 || Something<br />
|-<br />
| [[SceClockgen]] || 1 || 0x100000 || Something<br />
|-<br />
| [[SceCodec]] || 0 || 0x200 || Something<br />
|-<br />
| [[SceCodec]] || 1 || 0x10000 || Something<br />
|-<br />
| [[SceCodecEngineWrapper]] || 0 || 0x401 || Something<br />
|-<br />
| [[SceCodecEngineWrapper]] || 0 || 0x200 || Something<br />
|-<br />
| [[SceCodecEngineWrapper]] || 0 || 0x402 || Something<br />
|-<br />
| [[SceCodecEngineWrapper]] || 0 || 0x400E || Something<br />
|-<br />
| [[SceCodecEngineWrapper]] || 1 || 0x1000E || Something<br />
|-<br />
| [[SceCodecEngineWrapper]] || 1 || 0x100000 || Something<br />
|-<br />
| [[SceCompat]] || 1 || 0x100000 || Something<br />
|-<br />
| [[SceCtrl]] || 0 || 0x402 || Something<br />
|-<br />
| [[SceCtrl]] || 0 || 0x400C || Something<br />
|-<br />
| [[SceCtrl]] || 0 || 0x400 || Something<br />
|-<br />
| [[SceCtrl]] || 1 || 0x1000C || Something<br />
|-<br />
| [[SceDbgSdio]] (SceDbgSdio1) || 0 || 0x102 || Something<br />
|-<br />
| [[SceDbgSdio]] (SceDbgSdio1) || 0 || 0x4003 || Something<br />
|-<br />
| [[SceDbgSdio]] (SceDbgSdio1) || 1 || 0x10003 || Something<br />
|-<br />
| [[SceDeci4pDbgp]] || 0 || 0x102 || Something<br />
|-<br />
| [[SceDeci4pDbgp]] || 0 || 0x4000 || Something<br />
|-<br />
| [[SceDeci4pDbgp]] || 1 || 0x10000 || Something<br />
|-<br />
| [[SceDeci4pDbgp]] || 1 || 0x400000 || Something<br />
|-<br />
| [[SceDeci4pDfMgr]] || 0 || 0x200 || Something<br />
|-<br />
| [[SceDeci4pDfMgr]] || 0 || 0x100 || Something<br />
|-<br />
| [[SceDeci4pDfMgr]] || 0 || 0x401 || Something<br />
|-<br />
| [[SceDeci4pDfMgr]] || 0 || 0x402 || Something<br />
|-<br />
| [[SceDeci4pDfMgr]] || 1 || 0x100002 || Something<br />
|-<br />
| [[SceDeci4pDfMgr]] || 1 || 0x400000 || Something<br />
|-<br />
| [[SceDeci4pDfMgr]] || 1 || 0x100000 || Something<br />
|-<br />
| [[SceDeci4pDrfp]] || 0 || any || Something<br />
|-<br />
| [[SceDeci4pDtracep]] || 0 || 0x200 || Something<br />
|-<br />
| [[SceDeci4pDtracep]] || 0 || 0x1000 || Something<br />
|-<br />
| [[SceDeci4pDtracep]] || 1 || 0x40000 || Something<br />
|-<br />
| [[SceDeci4pDtracep]] || 1 || 0x100002 || Something<br />
|-<br />
| [[SceDeci4pSDfCtl]] || 0 || 0x102 || Something<br />
|-<br />
| [[SceDisplay]] || 0 || 0x400 || Something<br />
|-<br />
| [[SceDisplay]] || 0 || 0x200 || Something<br />
|-<br />
| [[SceDisplay]] || 0 || 0x402 || Something<br />
|-<br />
| [[SceDisplay]] || 0 || 0x400A || Something<br />
|-<br />
| [[SceDisplay]] || 1 || 0x40000 || Something<br />
|-<br />
| [[SceDisplay]] || 1 || 0x100000 || Something<br />
|-<br />
| [[SceDisplay]] || 1 || 0x1000A || Something<br />
|-<br />
| [[SceError]] || 0 || 0x200 || Something<br />
|-<br />
| [[SceError]] || 1 || 0x100001 || Something<br />
|-<br />
| [[SceGps]] (SceGpsd) || 0 || 0x102 || Something<br />
|-<br />
| [[SceGps]] (SceGpsd) || 1 || 0x400000 || Something<br />
|-<br />
| [[SceGpuEs4]] (SceGpu) || 0 || 0x402 || Something<br />
|-<br />
| [[SceGpuEs4]] (SceGpu) || 0 || 0x4005 || Something<br />
|-<br />
| [[SceGpuEs4]] (SceGpu) || 0 || 0x400 || Something<br />
|-<br />
| [[SceGpuEs4]] (SceGpu) || 1 || 0x10005 || Something<br />
|-<br />
| [[SceHdmi]] || 0 || 0x400 || Something<br />
|-<br />
| [[SceHdmi]] || 0 || 0x402 || Something<br />
|-<br />
| [[SceHdmi]] || 1 || 0x100000 || Something<br />
|-<br />
| [[SceHid]] || 0 || 0x402 || Something<br />
|-<br />
| [[SceHid]] || 0 || 0x4000 || Something<br />
|-<br />
| [[SceHid]] || 0 || 0x200 || Something<br />
|-<br />
| [[SceHid]] || 1 || 0x100000 || Something<br />
|-<br />
| [[SceHpremote]] (SceHprm) || 1 || 0x1000C || Something<br />
|-<br />
| [[SceIdStorage]] || ? || ? || Something<br />
|-<br />
| [[SceIofilemgr]] || 0 || 0x401 || vfs_sync_all_mount_point<br />
|-<br />
| [[SceIofilemgr]] || 0 || 0x402 || Something<br />
|-<br />
| [[SceIofilemgr]] || 0 || 0x400 || Something<br />
|-<br />
| [[SceIofilemgr]] || 1 || 0x10000 || Something<br />
|-<br />
| [[SceIofilemgr]] || 1 || 0x400000 || Something<br />
|-<br />
| [[SceLowio]] (ScePervasive) || 1 || 0x10000 || Something<br />
|-<br />
| [[SceLowio]] (SceGpio) || 1 || 0x10002 || Something<br />
|-<br />
| [[SceLowio]] (ScePwm) || 0 || 0x4002 || Something<br />
|-<br />
| [[SceLowio]] (ScePwm) || 1 || 0x10002 || Something<br />
|-<br />
| [[SceLowio]] (SceI2c) || 0 || 0x402 || Something<br />
|-<br />
| [[SceLowio]] (SceI2c) || 0 || 0x4002 || Something<br />
|-<br />
| [[SceLowio]] (SceI2c) || 1 || 0x10002 || Something<br />
|-<br />
| [[SceLowio]] (SceDsi) || 0 || 0x4004 || Something<br />
|-<br />
| [[SceLowio]] (SceIftu) || 0 || 0x4005 || Something<br />
|-<br />
| [[SceLowio]] (SceIftu) || 1 || 0x10005 || Something<br />
|-<br />
| [[SceLowio]] (SceCsi) || 0 || 0x4004 || Something<br />
|-<br />
| [[SceLowio]] (SceCsi) || 1 || 0x10004 || Something<br />
|-<br />
| [[SceMotionDev]] (SceMotion) || 0 || 0x401 || Something<br />
|-<br />
| [[SceMotionDev]] (SceMotion) || 0 || 0x402 || Something<br />
|-<br />
| [[SceMotionDev]] (SceMotion) || 0 || 0x400 || Something<br />
|-<br />
| [[SceMotionDev]] (SceMotion) || 1 || 0x100000 || Something<br />
|-<br />
| [[SceMotionDev]] (SceMotion) || 1 || 0x100002 || Something<br />
|-<br />
| [[SceMsif]] || 0 || 0x400C || Something<br />
|-<br />
| [[SceMsif]] || 1 || 0x1000C || Something<br />
|-<br />
| [[SceNetPs]] || 0 || 0x200 || Something<br />
|-<br />
| [[SceNetPs]] || 1 || 0x400000 || Something<br />
|-<br />
| [[SceOled]] || 0 || 0x402 || Something<br />
|-<br />
| [[SceOled]] || 0 || 0x4003 || Something<br />
|-<br />
| [[SceOled]] || 1 || 0x10003 || Something<br />
|-<br />
| [[ScePfsMgr]] || 0 || 0x402 || Something<br />
|-<br />
| [[ScePower]] (ScePower) || 0 || 0x402 || Something<br />
|-<br />
| [[ScePower]] (ScePower) || 0 || 0x4009 || Something<br />
|-<br />
| [[ScePower]] (ScePower) || 0 || 0x400 || Something<br />
|-<br />
| [[ScePower]] (ScePower) || 1 || 0x10009 || Something<br />
|-<br />
| [[ScePower]] (ScePower) || 1 || 0x100000 || Something<br />
|-<br />
| [[ScePower]] (SceLed) || 0 || 0x102 || Something<br />
|-<br />
| [[ScePower]] (SceLed) || 0 || 0x400A || Something<br />
|-<br />
| [[ScePower]] (SceLed) || 1 || 0x100000 || Something<br />
|-<br />
| [[SceRtc]] || 0 || 0x200 || Something<br />
|-<br />
| [[SceRtc]] || 0 || 0x1000 || Something<br />
|-<br />
| [[SceRtc]] || 1 || 0x1000A || Something<br />
|-<br />
| [[SceRtc]] || 1 || 0x100000 || Something<br />
|-<br />
| [[SceSblSmSchedProxy]] || 1 || 0x10004 || Something<br />
|-<br />
| [[SceSblSsMgr]] || 0 || 0x200 || Something<br />
|-<br />
| [[SceSblSsMgr]] || 1 || 0x100000 || Something<br />
|-<br />
| [[SceSblUpdateMgr]] || 0 || any || Something<br />
|-<br />
| [[SceSdif]] || 0 || 0x400C || Something<br />
|-<br />
| [[SceSdif]] || 1 || 0x10009 || resume eMMC with sdif reset<br />
|-<br />
| [[SceSdif]] || 1 || 0x1000C || resume eMMC<br />
|-<br />
| [[SceSdstor]] || 0 || 0x200 || Umount 0x900/0xA00/0x100. invalidate gc sdpart str.<br />
|-<br />
| [[SceSdstor]] || 0 || 0x400D || disable intr/power off for gc/rm<br />
|-<br />
| [[SceSdstor]] || 1 || 0x100000 || Something<br />
|-<br />
| [[SceSdstor]] || 1 || 0x400000 || Something<br />
|-<br />
| [[SceSyscon]] || 0 || 0x4006 || Something<br />
|-<br />
| [[SceSyscon]] || 0 || 0x402 || Something<br />
|-<br />
| [[SceSyscon]] || 0 || 0x400F || Something<br />
|-<br />
| [[SceSyscon]] || 1 || 0x10006 || Something<br />
|-<br />
| [[SceSyscon]] || 1 || 0x1000F || Something<br />
|-<br />
| [[SceTouch]] || 0 || 0x401 || Something<br />
|-<br />
| [[SceTouch]] || 0 || 0x400 || Something<br />
|-<br />
| [[SceTouch]] || 0 || 0x402 || Something<br />
|-<br />
| [[SceTouch]] || 0 || 0x400C || Something<br />
|-<br />
| [[SceTouch]] || 1 || 0x1000C || Something<br />
|-<br />
| [[SceTouch]] || 1 || 0x100000 || Something<br />
|-<br />
| [[SceUsbEtherRtl]] || 0 || 0x401 || Something<br />
|-<br />
| [[SceUsbEtherRtl]] || 0 || 0x402 || Something<br />
|-<br />
| [[SceUsbEtherRtl]] || 0 || 0x400 || Something<br />
|-<br />
| [[SceUsbEtherSmsc]] || 0 || 0x401 || Something<br />
|-<br />
| [[SceUsbEtherSmsc]] || 0 || 0x402 || Something<br />
|-<br />
| [[SceUsbEtherSmsc]] || 0 || 0x400 || Something<br />
|-<br />
| [[SceUsbServ]] || 0 || 0x200 || Something<br />
|-<br />
| [[SceUsbServ]] || 0 || 0x400E || Something<br />
|-<br />
| [[SceUsbServ]] || 1 || 0x100000 || Something<br />
|-<br />
| [[SceUsbServ]] || 1 || 0x100002 || Something<br />
|-<br />
| [[SceWlanBt]] (SceWlanBtRobin) || 0 || 0x401 || Something<br />
|-<br />
| [[SceWlanBt]] (SceWlanBtRobin) || 0 || 0x400 || Something<br />
|-<br />
| [[SceWlanBt]] (SceWlanBtRobin) || 1 || 0x100000 || Something<br />
|-<br />
| [[SceWlanBt]] (SceWlanBtRobin) || 1 || 0x100002 || Something<br />
|}<br />
<br />
== SceSysmemForKernel ==<br />
<br />
=== SceSysmemForKernel_A7D44B50 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.692.000 || 0xA7D44B50<br />
|-<br />
| 1.800.071-3.740.011 || not present<br />
|}<br />
<br />
A guessed name is sceKernelSetSysmemFuncForKernel.<br />
<br />
Used by [[SceKernelSSProxy]]'s module_start to register a function that just calls [[SMC]] 0x10E (BusErrorClear).<br />
<br />
The registered function is used internally by [[#sceKernelPhysicalMemReadForKernel]] and [[#sceKernelPhysicalMemWriteForKernel]].<br />
<br />
<source lang="C">int SceSysmemForKernel_A7D44B50(void* pBusErrorClearFunc);</source><br />
<br />
=== sceKernelSysmemModuleStartAfterProcessmgrForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.600.011-3.610.011 || 0xE7938BFB<br />
|-<br />
| 3.630.011-3.740.011 || 0x4E74DA48<br />
|}<br />
<br />
Temp name was sceKernelInitProcessMemoryForKernel.<br />
<br />
Used by [[SceProcessmgr]].<br />
<br />
<source lang="C">int sceKernelSysmemModuleStartAfterProcessmgrForKernel(void);</source><br />
<br />
=== sceKernelSysmemCleanerForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x43E81C4B<br />
|-<br />
| 3.63 || 0x50980298<br />
|}<br />
<br />
Only implemented in sysdbg build.<br />
<br />
<source lang="C">int sceKernelSysmemCleanerForKernel(void);</source><br />
<br />
=== sceKernelStrnlenFromUserForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0x9BC3DEAC<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">SceSize sceKernelStrnlenFromUserForKernel(const char *s, SceSize maxlen);</source><br />
<br />
=== sceKernelPhysicalMemWriteForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.060.031 || 0x4B86A751<br />
|-<br />
| 1.50-3.740.011 || not present<br />
|}<br />
<br />
Writes to physical address <code>pdest</code> using a pre-allocated memblock. Destination must belong into a hardcoded table describing physical ranges.<br />
<br />
<source lang="C">SceSSize sceKernelPhysicalMemWriteForKernel(SceUIntPAddr pdest, const void *src, SceSize size);</source><br />
<br />
=== sceKernelPhysicalMemReadForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.060.031 || 0xF96E3AE2<br />
|-<br />
| 1.50-3.740.011 || not present<br />
|}<br />
<br />
Temp name was memcpy_from_paddr.<br />
<br />
Dest must be a virtual address and src must be a physical address. Returns copied size on success.<br />
<br />
<source lang="C">int sceKernelPhysicalMemReadForKernel(void *dest, const void *src, SceSize dest_size, SceSize src_size);</source><br />
<br />
=== sceKernelCopyFromUser32DomainForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0xD530399A<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int sceKernelCopyFromUser32DomainForKernel(SceUID pid, void *dst, const void *src, SceSize size);</source><br />
<br />
=== sceKernelCopyToUserProcTextDomainForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x30931572<br />
|-<br />
| 3.65 || 0x2995558D<br />
|}<br />
<br />
Temp name was sceKernelRxMemcpyKernelToUserForPidForKernel, sceKernelProcCopyToUserRxForKernel.<br />
<br />
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.<br />
<br />
This function is usually called when resolving stubs during a module loads. In 3.60, DACR is set to 0x15450FC3 instead of 0xFFFFFFFF.<br />
<br />
<source lang="c">SceInt32 sceKernelCopyToUserProcTextDomainForKernel(SceUID pid, void *uaddr, const void *kaddr, SceSize size);</source><br />
<br />
=== sceKernelCopyToUserProcTextDomainForDBGPForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0xE65EA709<br />
|-<br />
| 3.63 || 0x4345C61F<br />
|}<br />
<br />
<source lang="C">int sceKernelCopyToUserProcTextDomainForDBGPForKernel(SceUID pid, void *dst, const void *src, SceSize length);</source><br />
<br />
=== sceKernelCopyToUserTextDomainForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x67BAD5B4<br />
|-<br />
| 3.65 || 0x5EF1DAAF<br />
|}<br />
<br />
This is a guessed name. Temp name was sceKernelMemcpyToUserRxForKernel, sceKernelCopyToUserRxForKernel.<br />
<br />
Similar to [[SceSysmem#sceKernelCopyToUserProcTextDomainForKernel|sceKernelCopyToUserProcTextDomain]], but performed in the current address space.<br />
<br />
In FW 3.60, [[SceSysmem#sceKernelCopyToUserProcTextDomainForKernel|sceKernelCopyToUserProcTextDomain]] calls this function to perform the copy after changing address space.<br />
<br />
<source lang="c">SceInt32 sceKernelCopyToUserTextDomainForKernel(void *dst, const void *src, SceSize len);</source><br />
<br />
=== sceKernelCopyToUserDomainForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || Not present<br />
|-<br />
| 3.60-3.61 || 0xA6F95838<br />
|-<br />
| 3.63 || 0x499A9FFF<br />
|}<br />
<br />
This is a guessed name. Temp name was sceKernelMemcpyToUserRoForKernel, sceKernelCopyToUserRoForKernel.<br />
<br />
Similar to [[SceSysmem#sceKernelCopyToUserTextDomainForKernel|sceKernelCopyToUserTextDomain]], but doesn't perform any DCache clean.<br />
<br />
Uses the same DACR, 0x15450FC3, for the copy.<br />
<br />
<source lang="c">int sceKernelCopyToUserDomainForKernel(void *dst, const void *src, SceSize len);</source><br />
<br />
=== sceKernelRegisterClassForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || 0x11761B77<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
=== sceKernelFindClassByNameForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x62989905<br />
|-<br />
| 3.65 || 0x7D87F706<br />
|}<br />
<br />
<source lang="c">int sceKernelFindClassByNameForKernel(const char *name, SceClass **ppClass);</source><br />
<br />
=== sceKernelGetUIDHeapClassForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x4CCA935D<br />
|-<br />
| 3.63 || 0x7C878E94<br />
|}<br />
<br />
<source lang="c">SceClass *sceKernelGetUIDHeapClassForKernel(void);</source><br />
<br />
=== sceKernelGetUIDMemBlockClassForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0xAF729575<br />
|-<br />
| 3.63 || 0x86681B64<br />
|}<br />
<br />
<source lang="c">SceClass *sceKernelGetUIDMemBlockClassForKernel(void);</source><br />
<br />
=== sceKernelGetUIDDLinkClassForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.610.011 || 0xC105604E<br />
|-<br />
| 3.630.011-3.740.011 || 0xE4193EB6<br />
|}<br />
<br />
<source lang="c">SceClass *sceKernelGetUIDDLinkClassForKernel(void);</source><br />
<br />
=== sceKernelGetUIDAddressSpaceClassForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0xAF180A3F<br />
|-<br />
| 3.63 || 0x99D3BF76<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">SceClass *sceKernelGetUIDAddressSpaceClassForKernel(void);</source><br />
<br />
=== sceKernelGetUIDPartitionClassForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x2791F109<br />
|-<br />
| 3.63 || 0x5C0FC6BE<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">SceClass *sceKernelGetUIDPartitionClassForKernel(void);</source><br />
<br />
=== sceUIDDLinkClassInitForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x21285F40<br />
|-<br />
| 3.63 || 0x7CDB7655<br />
|}<br />
<br />
Temp name was sceKernelCreateClassForKernel, sceUIDClassInitClassForKernel.<br />
<br />
Calls [[SceSysmem#sceUIDClassInitClassForDriver|sceUIDClassInitClassForDriver]].<br />
<br />
<source lang="C">int sceUIDDLinkClassInitForKernel(SceClass *pClass, const char *name, SceClass *subclass, SceSize itemsize, void *cstr, void *dstr);</source><br />
<br />
=== sceUIDClassGetClassInfoAllForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || not present<br />
|-<br />
| 3.60-3.61 || 0xC0BF149E<br />
|-<br />
| 3.63 || 0x100B4029<br />
|}<br />
<br />
This is a guessed name (ForDriver function name and NID changed at some point before 1.69). Temp name was sceKernelGetRegisterClassInfoForKernel.<br />
<br />
<source lang="C"><br />
typedef struct SceClassInfo {<br />
SceSize size;<br />
SceClass *pClass;<br />
SceClass *pSubClass;<br />
const char *name;<br />
} SceClassInfo;<br />
<br />
int sceUIDClassGetClassInfoAllForKernel(SceClassInfo *vector, uint32_t maxNumClass, uint32_t *pNumClassInBuf);<br />
</source><br />
<br />
=== sceKernelCreateAddressSpaceForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x4A3737F0<br />
|-<br />
| 3.65 || 0x8EE89D2C<br />
|}<br />
<br />
<source lang="C"><br />
// type: 0x10000001 (user AS)<br />
// name: maybe titleid<br />
SceUID sceKernelCreateAddressSpaceForKernel(SceUID pid, const char *name, SceUInt32 type, SceKernelCreateAddressSpaceOpt *pOpt);<br />
</source><br />
<br />
=== sceKernelDeleteAddressSpaceForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0xF2D7FE3A<br />
|-<br />
| 3.65 || 0x4A2E421D<br />
|}<br />
<br />
<source lang="C">int sceKernelDeleteAddressSpaceForKernel(SceUID guid);</source><br />
<br />
=== sceKernelAddressSpaceSetNameForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-1.50 || not present<br />
|-<br />
| 3.60 || 0x7BD56D6D<br />
|-<br />
| 3.65 || 0xCEBC4963<br />
|}<br />
<br />
Used by [[SceProcessmgr]].<br />
<br />
<source lang="C">int sceKernelAddressSpaceSetNameForKernel(SceUID guid, const char *name);</source><br />
<br />
=== sceKernelAddressSpaceSetPhyMemPartForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x67955EE9<br />
|-<br />
| 3.65 || 0x7DF07D60<br />
|}<br />
<br />
<source lang="C">int sceKernelAddressSpaceSetPhyMemPartForKernel(SceUID guid, SceUInt32 index, SceKernelPhyMemPart *pPhyMemPart);</source><br />
<br />
=== sceKernelAddressSpaceCtrSetObjectHeapForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0xFC74A355<br />
|-<br />
| 3.63 || 0xFA348CB1<br />
|}<br />
<br />
=== sceKernelAddressSpaceFreeAllMemBlockForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x89CE1F31<br />
|-<br />
| 3.65 || 0x36159CF5<br />
|}<br />
<br />
<source lang="C">int sceKernelAddressSpaceFreeAllMemBlockForKernel(SceUID guid);</source><br />
<br />
=== sceKernelAddressSpaceUnmapForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.61 || 0xCE72839E<br />
|-<br />
| 3.63 || 0x73C38695<br />
|}<br />
<br />
<source lang="C"><br />
# For FW 0.931:<br />
int sceKernelAddressSpaceUnmapForKernel(SceUID uid, int a2, void* addr, SceSize size);<br />
# For FW 3.60:<br />
int sceKernelAddressSpaceUnmapForKernel(SceUID uid, int a2, int a3, void* addr, SceSize size);<br />
</source><br />
<br />
Example: 0.990 [[SceSysStateMgr]]:<br />
<source lang="C"><br />
sceKernelAddressSpaceUnmapForKernel(0x10007, 0xF7, 0x51000000, 0x1000000);<br />
sceKernelAddressSpaceUnmapForKernel(0x10007, 0xF0, 0xE0000000, 0x8000000);<br />
sceKernelAddressSpaceUnmapForKernel(0x10007, 0xF0, 0x1A000000, 0x100000);<br />
</source><br />
<br />
Example: 3.60 [[SceSysStateMgr]]:<br />
<source lang="C"><br />
sceKernelAddressSpaceUnmapForKernel(0x10007, 0xF7, 0xC, 0x51000000, 0x1000000);<br />
sceKernelAddressSpaceUnmapForKernel(0x10007, 0xF0, 0xC, 0xE0000000, 0x8000000);<br />
sceKernelAddressSpaceUnmapForKernel(0x10007, 0xF0, 0xC, 0x1A000000, 0x100000);<br />
</source><br />
<br />
=== sceKernelAddressSpaceSetProcessForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.61 || 0x2476B90F<br />
|-<br />
| 3.63 || 0x5E772E19<br />
|}<br />
<br />
<source lang="C">int sceKernelAddressSpaceSetProcessForKernel(SceUID address_space, SceUID pid);</source><br />
<br />
=== sceKernelAddressSpaceChangeMMUContextForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.61 || 0x653B0849<br />
|-<br />
| 3.63 || 0x20D01AFA<br />
|}<br />
<br />
Changes to the MMU context (CONTEXTIDR.ASID + DACR + TTBR1) of target address space.<br />
<br />
<source lang="C">SceInt32 sceKernelAddressSpaceChangeMMUContextForKernel(SceUID address_space);</source><br />
<br />
=== sceKernelAddressSpaceGetMMUContextForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || not present<br />
|-<br />
| 3.10-3.61 || 0x9894B9E1<br />
|-<br />
| 3.63 || 0xA7C91D62<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">int sceKernelGetAddressSpaceMMUContextForKernel(SceUID address_space, SceKernelMMUContext **ppCtx);</source><br />
<br />
=== SceSysmemForKernel_FBEF93AA ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || not present<br />
|-<br />
| 0.990-3.01 || 0xFBEF93AA<br />
|-<br />
| 3.10-3.74 || not present<br />
|}<br />
<br />
Maybe gets MMU context. Maybe was replaced by [[#sceKernelAddressSpaceGetMMUContextForKernel]].<br />
<br />
<source lang="C">int SceSysmemForKernel_FBEF93AA(SceUID address_space, void* pOut);</source><br />
<br />
=== sceKernelAddressSpaceGetTimerVbaseForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || not present<br />
|-<br />
| 0.996.090-3.610.011 || 0x7D92B2D3<br />
|-<br />
| 3.630.011-3.740.011 || 0xFA1A73DD<br />
|}<br />
<br />
<source lang="C">int sceKernelAddressSpaceGetTimerVbaseForKernel(SceUID address_space, void **ppBase);</source><br />
<br />
=== sceKernelGetAddressSpaceInfoForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.610.011 || 0x4492421F<br />
|-<br />
| 3.630.011-3.740.011 || 0xC3EF4055<br />
|}<br />
<br />
This is a guessed name..<br />
<br />
<source lang="C">int sceKernelGetAddressSpaceInfoForKernel(SceUID address_space, SceKernelAddressSpaceInfo *pInfo);</source><br />
<br />
=== sceKernelAddressSpaceGetMMUL1InfoForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || 0x671A3444<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
Gets information about a L1PT entry in the translation table of an address space. Pass the virtual address of the target entry maps as <code>addr</code>.<br />
<br />
<source lang="C">SceInt32 sceKernelAddressSpaceGetMMUL1InfoForKernel(SceUID address_space, const void *addr, SceKernelMMUL1Info *pInfo);</source><br />
<br />
=== sceKernelAddressSpaceGetMMUL2InfoForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0xCB6E1C80<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int sceKernelAddressSpaceGetMMUL2InfoForKernel(SceUID address_space, const void *addr, void *pInfo);</source><br />
<br />
=== sceKernelAddressSpaceGetMMUL1AllInfoForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || 0x1A898F2E<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C"><br />
typedef struct SceKernelAddressSpaceMMUL1AllInfo { // size is 0x400C on FW 0.931<br />
SceSize size; // Size of this structure<br />
char unk[0x4008];<br />
} SceKernelAddressSpaceMMUL1AllInfo;<br />
<br />
int sceKernelAddressSpaceGetMMUL1AllInfoForKernel(SceUID address_space, SceKernelAddressSpaceMMUL1AllInfo *pInfo);</source><br />
<br />
=== sceKernelAddressSpaceGetMMUL2AllInfoForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0x1E1AA29B<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C"><br />
typedef struct SceKernelAddressSpaceMMUL2AllInfo { // size is 0x404 on FW 0.931<br />
SceSize size; // Size of this structure<br />
char unk[0x400];<br />
} SceKernelAddressSpaceMMUL2AllInfo;<br />
<br />
int sceKernelAddressSpaceGetMMUL2AllInfoForKernel(SceUID address_space, const void *addr, SceKernelAddressSpaceMMUL2AllInfo *pInfo);</source><br />
<br />
=== sceKernelAddressSpaceGetMemoryTypeForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.61 || 0xCC7BB240<br />
|-<br />
| 3.63 || 0x0B5A3E93<br />
|}<br />
<br />
<source lang="C">int sceKernelAddressSpaceGetMemoryTypeForKernel(uint32_t *memory_type);</source><br />
<br />
=== sceKernelAddressSpaceVAtoPAForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.61 || 0xF2179820<br />
|-<br />
| 3.63 || 0x1BAF8C0B<br />
|}<br />
<br />
<source lang="C">int sceKernelAddressSpaceVAtoPAForKernel(SceAddressSpace *pAS, SceUInt32 mode, void *pVA, void **pPA);</source><br />
<br />
=== sceKernelAddressSpaceVARangeToPAVectorForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.61 || 0xF7250E6C<br />
|-<br />
| 3.63 || 0xA541E0CF<br />
|}<br />
<br />
<source lang="C">int sceKernelAddressSpaceVARangeToPAVectorForKernel(SceUID address_space, const SceKernelVARange *vRange, SceKernelPAVector *pPAV);</source><br />
<br />
=== sceKernelAddressSpaceGetPhyMemPartByIndexForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x3F74E45C<br />
|-<br />
| 3.63 || 0x47C55DCC<br />
|}<br />
<br />
<source lang="C">int sceKernelAddressSpaceGetPhyMemPartByIndexForKernel(SceUInt32 index, void **result);</source><br />
<br />
=== sceKernelAddressSpaceGetPartitionByIndexForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x210DB518<br />
|-<br />
| 3.63 || 0x1F84FE44<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">SceUIDPartitionObject *sceKernelAddressSpaceGetPartitionByIndexForKernel(void *pAS, int pindex);</source><br />
<br />
=== sceKernelAddressSpaceGetMemBlockInfoByAddrForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x46A5CB84<br />
|-<br />
| 3.63 || 0xC3F9607E<br />
|}<br />
<br />
<source lang="C">int sceKernelAddressSpaceGetMemBlockInfoByAddrForKernel(SceUID asid, int a2, int a3, int a4);</source><br />
<br />
=== sceKernelCheckAddressSpaceForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x8B07BB52<br />
|-<br />
| 3.63 || 0x16A54BFE<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">int sceKernelCheckAddressSpaceForKernel(void);</source><br />
<br />
=== sceKernelGetKernelAddressSpaceForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.500.151-3.610.011 || 0xC38B4D52<br />
|-<br />
| 3.630.011-3.740.011 || 0x2E5CC243<br />
|}<br />
<br />
<source lang="C">void* sceKernelGetKernelAddressSpaceForKernel(void);</source><br />
<br />
=== sceKernelCreatePhyMemPartForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.61 || 0x2E36E0C4<br />
|-<br />
| 3.63 || 0xA2DFA383<br />
|}<br />
<br />
Calls [[#sceKernelCreatePhyMemPartByPbaseForKernel]] with pbase = 0.<br />
<br />
<source lang="C">int sceKernelCreatePhyMemPartForKernel(const char *name, int type, SceSize psize, SceKernelPhyMemPart **pPhyMemPart);</source><br />
<br />
=== sceKernelCreatePhyMemPartByPbaseForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.61 || 0x63D83911<br />
|-<br />
| 3.63 || 0x5CC56F87<br />
|}<br />
<br />
<source lang="C"><br />
/*<br />
type<br />
<br />
ORed values:<br />
0x00002 : Shell<br />
0x00004 : Game<br />
0x00005 : PhyCont<br />
0x00060 : CDialog<br />
0x10000 : Lpddr2Main<br />
0x30000 : Cdram<br />
<br />
seen values:<br />
0x10002 : ShellLpddr2Main (shared)<br />
0x10004 : GameLpddr2Main<br />
0x10005 : PhyContLpddr2Main<br />
0x10064 : GameCDialogLpddr2Main<br />
<br />
0x30002 : ShellCdram<br />
0x30004 : GameCdram<br />
*/<br />
<br />
int sceKernelCreatePhyMemPartByPbaseForKernel(const char *name, int type, void *pbase, SceSize psize, SceKernelPhyMemPart **ppPhyMemPart);<br />
</source><br />
<br />
=== sceKernelDeletePhyMemPartForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.61 || 0x2AEA9E09<br />
|-<br />
| 3.63 || 0x3F72B2E7<br />
|}<br />
<br />
<source lang="C">int sceKernelDeletePhyMemPartForKernel(SceKernelPhyMemPart *pPhyMemPart);</source><br />
<br />
=== sceKernelGetPhyMemPartAllForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.61 || 0x2F6F9C2C<br />
|-<br />
| 3.63 || 0x021053DD<br />
|}<br />
<br />
<source lang="C">int sceKernelGetPhyMemPartAllForKernel(SceUInt32 vis_level, SceUID *pVector, SceSize vectorSize, SceUInt32 *ret_num);</source><br />
<br />
=== sceKernelGetPhyMemPartInfoForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || 0x67849418<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int sceKernelGetPhyMemPartInfoForKernel(SceKernelPhyMemPart *pPhyMemPart, SceKernelPhyMemPartInfo *pInfo);</source><br />
<br />
=== sceKernelGetPhyMemPartInfoByIDForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.61 || 0xF4FA0575<br />
|-<br />
| 3.63 || 0x029F5989<br />
|}<br />
<br />
<source lang="C"><br />
typedef struct SceKernelPhyMemPartInfo { // size is 0x44 on FW 0.931-0.990<br />
SceSize size; // Size of this structure<br />
uint32_t unk_4; // some size or address<br />
uint32_t unk_8; // some size or address<br />
char unk1[0xC];<br />
char *name; // name, maybe pointer or array<br />
char unk2[0x24];<br />
} SceKernelPhyMemPartInfo;<br />
<br />
int sceKernelGetPhyMemPartInfoByIDForKernel(SceUID guid, SceKernelPhyMemPartInfo *pInfo);<br />
</source><br />
<br />
=== sceKernelGetPhyMemPartInfoCoreForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || not present<br />
|-<br />
| 0.990-3.61 || 0x3650963F<br />
|-<br />
| 3.63-3.65 || 0xB9B69700<br />
|}<br />
<br />
<source lang="C">int sceKernelGetPhyMemPartInfoCoreForKernel(SceKernelPhyMemPart *pPhyMemPart, ScePhyMemPartInfoCore *pInfo);</source><br />
<br />
=== sceKernelGetPhyMemPartInfoForDebuggerForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-1.50 || not present<br />
|-<br />
| 3.60-3.61 || 0x54E85275<br />
|-<br />
| 3.63 || 0x73E03A38<br />
|}<br />
<br />
info size is 0xB0-bytes.<br />
<br />
<source lang="C">int sceKernelGetPhyMemPartInfoForDebuggerForKernel(SceKernelPhyMemPart *pPhyMemPart, void *pInfo);</source><br />
<br />
=== sceKernelGrowPhyMemPartForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.61 || 0x6B3F4102<br />
|-<br />
| 3.63 || 0x5B434019<br />
|}<br />
<br />
Calls sceKernelGrowPhyMemPartWithFlagsForKernel with flags = 0.<br />
<br />
<source lang="C">int sceKernelGrowPhyMemPartForKernel(SceKernelPhyMemPart *pPhyMemPart, SceSize psize);</source><br />
<br />
=== sceKernelGrowPhyMemPartByPbaseForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || not present<br />
|-<br />
| 3.60-3.61 || 0x775AA5E3<br />
|-<br />
| 3.63 || 0x36FDA794<br />
|}<br />
<br />
Temp name was sceKernelGrowPhyMemPartWithFlagsForKernel.<br />
<br />
Grows physical memory partition with pbase.<br />
<br />
<source lang="C">int sceKernelGrowPhyMemPartByPbaseForKernel(SceKernelPhyMemPart *pPMP, SceUIntPtr pbase, SceSize psize);</source><br />
<br />
=== sceKernelGetGrownPhyMemPartSizeForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || not present<br />
|-<br />
| 3.60-3.61 || 0x4D809B47<br />
|-<br />
| 3.63 || 0xBC36755F<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Returns a global variable. This global variable is either a size or offset or address and is incremented by sceKernelGrowPhyMemPartWithFlagsForKernel.<br />
<br />
<source lang="C">int sceKernelGetGrownPhyMemPartSizeForKernel(void);</source><br />
<br />
=== SceSysmemForKernel_153A08A0 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.61 || 0x153A08A0<br />
|-<br />
| 3.63 || 0x6D563733<br />
|}<br />
<br />
Adds 1 to <code>pPhyMemPart->nClient</code> using [[SceSysmem#sceKernelCpuAtomicAddAndGet32ForDriver]], and returns its new value.<br />
<br />
<source lang="C">SceUInt32 SceSysmemForKernel_153A08A0(SceKernelPhyMemPart* pPhyMemPart);</source><br />
<br />
=== sceKernelAllocPhyPageForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.61 || 0xD449547B<br />
|-<br />
| 3.63-3.74 || 0xB488C82E<br />
|}<br />
<br />
Temp name was sceKernelPhyMemPartAllocPhyPageForKernel.<br />
<br />
<source lang="C">int sceKernelAllocPhyPageForKernel(void *pPhyMemPart, SceSize size, void **ppPhyPage);</source><br />
<br />
=== sceKernelResetPhyMemPartForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xEEB85560<br />
|-<br />
| 3.65 || 0x9B7E673F<br />
|}<br />
<br />
Used by [[SceProcessmgr#sceKernelResetGameBudgetForKernel]].<br />
<br />
Called with same argument as [[#sceKernelSetPhyPartGameForKernel]].<br />
<br />
<source lang="C">int sceKernelResetPhyMemPartForKernel(SceKernelPhyMemPart *pPhyMemPart);</source><br />
<br />
=== sceKernelShowPhyMemPartForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x5C257482<br />
|-<br />
| 3.63-3.65 || 0x8F0B5536<br />
|}<br />
<br />
Prints information about a Physical Memory Partition.<br />
<br />
Only implemented in sysdbg build.<br />
<br />
<source lang="C">SceInt32 sceKernelShowPhyMemPartForKernel(SceKernelPhyMemPart *pPMP);</source><br />
<br />
=== sceKernelFreePhyPageForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.61 || 0x00BC5B4A<br />
|-<br />
| 3.63 || 0x193A9D2F<br />
|}<br />
<br />
<source lang="C">int sceKernelFreePhyPageForKernel(void *pPhyMemPart, void *pPage);</source><br />
<br />
=== sceKernelSetPhyMemPartHookForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x17F1AA22<br />
|-<br />
| 3.63 || 0x31FA81B5<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Only implemented in sysdbg build.<br />
<br />
<source lang="C">int sceKernelSetPhyMemPartHookForKernel(void *pHook);</source><br />
<br />
=== sceKernelSetPhyMemPartLogCallbackForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x72E7BFAC<br />
|-<br />
| 3.63 || 0x93D0A183<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Only implemented in sysdbg build.<br />
<br />
<source lang="C">int sceKernelSetPhyMemPartLogCallbackForKernel(void *pCallbacks);</source><br />
<br />
=== sceKernelAllocKernelHeapForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || 0x432EADA6<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int sceKernelAllocKernelHeapForKernel(SceSize size);</source><br />
<br />
=== sceKernelGetHeapInfoForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.61 || 0x91733EF4<br />
|-<br />
| 3.63 || 0x17DB1A0A<br />
|}<br />
<br />
<source lang="C"><br />
// 0.931-0.990:<br />
int sceKernelGetHeapInfoForKernel(SceUID heapid, SceKernelHeapInfo *pInfo);<br />
<br />
// 3.60:<br />
int sceKernelGetHeapInfoForKernel(SceUID heapid, SceUInt32 level, SceKernelHeapInfo *pInfo);<br />
</source><br />
<br />
=== sceKernelGetHeapInfoAllForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.61 || 0x48D87E17<br />
|-<br />
| 3.63 || 0x1380E144<br />
|}<br />
<br />
This is a guessed namee.<br />
<br />
<source lang="C">int sceKernelGetHeapInfoAllForKernel(SceUInt32 vis_level, void *pInfo, SceSize infoSize, SceUInt32 *pnInfo);</source><br />
<br />
=== sceKernelGetHeapInfoAllChunkForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || 0xAC4C0EB1<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int sceKernelGetHeapInfoAllChunkForKernel(SceUID heapid, SceKernelHeapInfo *pInfo);</source><br />
<br />
=== sceKernelGetHeapInfoByPtrForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || not present<br />
|-<br />
| 3.60-3.61 || 0x68451777<br />
|-<br />
| 3.63 || 0x80A75187<br />
|}<br />
<br />
Temp name was sceKernelGetHeapInfoByPointerForKernel.<br />
<br />
<source lang="C">int sceKernelGetHeapInfoByPtrForKernel(void *pObject, SceKernelHeapInfo *pInfo);</source><br />
<br />
=== sceKernelReallocHeapMemoryForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0xFDC0EA11<br />
|-<br />
| 3.63 || 0x8EE8B917<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">void *sceKernelReallocHeapMemoryForKernel(SceUID heapid, void *ptr, SceSize size);</source><br />
<br />
=== sceKernelHeapEnableModeForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0xF1433852<br />
|-<br />
| 3.63 || 0x0B36F7F9<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">int sceKernelHeapEnableModeForKernel(SceUID heapid, SceUInt32 mode);</source><br />
<br />
=== sceKernelHeapDiableModeForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x71869119<br />
|-<br />
| 3.63 || 0x6E82D5A0<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">int sceKernelHeapDiableModeForKernel(SceUID heapid, SceUInt32 mode);</source><br />
<br />
=== sceKernelHeapMemoryGetAllocateSizeForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x60735311<br />
|-<br />
| 3.63 || 0xD124075A<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">SceSize sceKernelHeapMemoryGetAllocateSizeForKernel(void *ptr);</source><br />
<br />
=== sceKernelPrintHeapSegmentListForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x2EE50533<br />
|-<br />
| 3.63 || 0x82059651<br />
|}<br />
<br />
Only implemented in sysdbg build.<br />
<br />
<source lang="C">int sceKernelPrintHeapSegmentListForKernel(SceUID heap_guid);</source><br />
<br />
=== sceKernelGetKernelFixedHeapForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.610.011 || 0x68CB9266<br />
|-<br />
| 3.630.000-3.740.011 || 0x3717C322<br />
|}<br />
<br />
Temp name was sceKernelGetFixedHeapBySizeForKernel.<br />
<br />
<source lang="C">SceUIDFixedHeapObject *sceKernelGetKernelFixedHeapForKernel(SceSize size);</source><br />
<br />
=== sceKernelGetFixedHeapInfoForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.610.011 || 0x4FA4A624<br />
|-<br />
| 3.630.000-3.740.011 || 0x890D9160<br />
|}<br />
<br />
<source lang="C">int sceKernelGetFixedHeapInfoForKernel(SceUID heapid, SceKernelFixedHeapInfo *pInfo);</source><br />
<br />
=== sceKernelGetFixedHeapInfoByPointerForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.610.011 || 0x219E90FD<br />
|-<br />
| 3.630.000-3.740.011 || 0xA24D2C8D<br />
|}<br />
<br />
<source lang="C">int sceKernelGetFixedHeapInfoByPointerForKernel(SceUIDFixedHeapObject *pFixedHeap, SceKernelFixedHeapInfo *pInfo);</source><br />
<br />
=== sceKernelFixedHeapSetHookForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.06 || not present<br />
|-<br />
| 1.500.151-3.610.011 || 0x8C8E2DD1<br />
|-<br />
| 3.630.000-3.740.011 || 0xD4511A52<br />
|}<br />
<br />
<source lang="C">int sceKernelFixedHeapSetHookForKernel(SceUID heapid, void *hookdata);</source><br />
<br />
=== sceKernelFixedHeapAllocObjectForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.610.011 || 0xC8672A3D<br />
|-<br />
| 3.630.000-3.740.011 || 0xABA5313C<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">void *sceKernelFixedHeapAllocObjectForKernel(SceUIDFixedHeapObject *pFixedHeap);</source><br />
<br />
=== sceKernelFixedHeapFreeObjectForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.610.011 || 0x571660AA<br />
|-<br />
| 3.630.000-3.740.011 || 0x93344755<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">int sceKernelFixedHeapFreeObjectForKernel(SceUIDFixedHeapObject *pFixedHeap, void *pObject);</source><br />
<br />
=== sceKernelFixedHeapSetHookByPointerForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.12 || not present<br />
|-<br />
| 2.500.071-3.610.011 || 0x3EC2345B<br />
|-<br />
| 3.630.000-3.740.011 || 0x811C452B<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">int sceKernelFixedHeapSetHookByPointerForKernel(SceUIDFixedHeapObject *pFixedHeap, void *a2);</source><br />
<br />
=== sceKernelNameHeapInsertForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.61 || 0x08AB3DAE<br />
|-<br />
| 3.63 || 0xB628B46B<br />
|}<br />
<br />
<source lang="C">int sceKernelNameHeapInsertForKernel(const char *name, int flags, char **result);</source><br />
<br />
=== sceKernelNameHeapDeleteForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.61 || 0x9C7B62AB<br />
|-<br />
| 3.63 || 0x634D0D0C<br />
|}<br />
<br />
name max length is 31 characters.<br />
<br />
<source lang="C">int sceKernelNameHeapDeleteForKernel(const char *name, SceUInt32 flag);</source><br />
<br />
=== sceKernelNameHeapLinkForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0xEC1293D2<br />
|-<br />
| 3.63 || 0x40965FD1<br />
|}<br />
<br />
<source lang="C">int sceKernelNameHeapLinkForKernel(const char *name, int flags, void **result);</source><br />
<br />
=== sceKernelNameHeapFindForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0xB543A23C<br />
|-<br />
| 3.63 || 0x9F1A9AA6<br />
|}<br />
<br />
<source lang="C">int sceKernelNameHeapFindForKernel(const char *name, int flags, void **result);</source><br />
<br />
=== sceKernelNameHeapGetKeyForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x942D15FC<br />
|-<br />
| 3.63 || 0xEB48682E<br />
|}<br />
<br />
This is a guessed name. Computes MurmurHash. Used to get UID by name.<br />
<br />
<source lang="C">SceUInt32 sceKernelNameHeapGetKeyForKernel(const char *key, SceSize len, SceUInt32 seed);</source><br />
<br />
=== sceKernelNameHeapGetInfoForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.990 || not present<br />
|-<br />
| 0.996.090-3.610.011 || 0xE443253B<br />
|-<br />
| 3.630.000-3.740.011 || 0x01194C2E<br />
|}<br />
<br />
<source lang="C">int sceKernelNameHeapGetInfoForKernel(void *pInfo);</source><br />
<br />
=== sceKernelCreateObjectHeapForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x36830F46<br />
|-<br />
| 3.63 || 0x9D8F3BE8<br />
|}<br />
<br />
<source lang="C">int sceKernelCreateObjectHeapForKernel(SceUID pid, SceBool a2, SceFixedHeapHook *pHeapHook, SceKernelObjectHeap **ppObjectHeap);</source><br />
<br />
=== sceKernelCreateObjectHeapWithHeapForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x7FD757FE<br />
|-<br />
| 3.63 || 0x660DC18A<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">int sceKernelCreateObjectHeapWithHeapForKernel(SceKernelObjectHeap *pObjectHeap, SceUID pid, SceUID heapid);</source><br />
<br />
=== sceKernelDeleteObjectHeapForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x080BA2F3<br />
|-<br />
| 3.63 || 0x2F526AB8<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">int sceKernelDeleteObjectHeapForKernel(SceKernelObjectHeap *pObjectHeap);</source><br />
<br />
=== sceKernelObjectHeapAllocForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x7FDF483A<br />
|-<br />
| 3.63 || 0xEBFC8E10<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">void *sceKernelObjectHeapAllocForKernel(SceKernelObjectHeap *pObjectHeap, SceSize size);</source><br />
<br />
=== sceKernelObjectHeapFreeForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x131CEF52<br />
|-<br />
| 3.63 || 0x17D3D4BD<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">int sceKernelObjectHeapFreeForKernel(SceKernelObjectHeap *pObjectHeap, SceSize size, void *pObject);</source><br />
<br />
=== sceKernelObjectHeapSetResourceLimitForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x98E6905B<br />
|-<br />
| 3.63 || 0xDFA1EB57<br />
|}<br />
<br />
<source lang="C">int sceKernelObjectHeapSetResourceLimitForKernel(int a1, int a2, int a3, int a4, int a5);</source><br />
<br />
=== sceKernelObjectHeapSetResourceLimitAllForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x5409397F<br />
|-<br />
| 3.63 || 0x067F2550<br />
|}<br />
<br />
<source lang="C">int sceKernelObjectHeapSetResourceLimitAllForKernel(SceKernelObjectHeap *pObjectHeap, int a2, int a3);</source><br />
<br />
=== sceKernelObjectHeapSetSizeForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x6427560F<br />
|-<br />
| 3.63 || 0xB591E49F<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">int sceKernelObjectHeapSetSizeForKernel(SceUInt32 index, SceUInt32 size);</source><br />
<br />
=== sceKernelGetObjectHeapForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x3B75CBED<br />
|-<br />
| 3.63 || 0x857408DA<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">SceKernelObjectHeap *sceKernelGetObjectHeapForKernel(void);</source><br />
<br />
=== sceKernelGetSharedObjectHeapForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0xBF0294E4<br />
|-<br />
| 3.63 || 0x791D6205<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">SceKernelObjectHeap *sceKernelGetSharedObjectHeapForKernel(void);</source><br />
<br />
=== SceSysmemForKernel_B8D769C6 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0xB8D769C6<br />
|-<br />
| 3.63 || 0xDBEACE2C<br />
|}<br />
<br />
<source lang="C">int SceSysmemForKernel_B8D769C6(SceKernelObjectHeap *pObjectHeap, void *info);</source><br />
<br />
=== sceUIDCreateEntryHeapForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x19CAEF35<br />
|-<br />
| 3.65 || 0x89BEF058<br />
|}<br />
<br />
<source lang="C">int sceUIDCreateEntryHeapForKernel(SceUID pid, SceUID heap_guid);</source><br />
<br />
=== sceUIDDeleteEntryHeapForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xF0C3FCFC<br />
|-<br />
| 3.65 || 0xF6D09BD9<br />
|}<br />
<br />
<source lang="C">int sceUIDDeleteEntryHeapForKernel(SceUID guid);</source><br />
<br />
=== sceUIDRegisterForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || 0x59162CD7<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
Calls [[#sceGUIDRegisterForKernel]].<br />
<br />
<source lang="C">int sceUIDRegisterForKernel(SceClass *pClass, const char *name, SceKernelObject *pObject);</source><br />
<br />
=== sceUIDObjectSetClassForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || 0x226DE851<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int sceUIDObjectSetClassForKernel(SceKernelObject *pObject, SceClass *pClass);</source><br />
<br />
=== sceUIDGetUIDVectorByClassForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.060.031 || 0xA2F03233<br />
|-<br />
| 1.500.151-3.740.011 || not present<br />
|}<br />
<br />
Calls [[#sceGUIDGetUIDVectorByClassForKernel]].<br />
<br />
=== sceUIDGetProcUIDVectorByClassForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-1.060.031 || 0x51C08396<br />
|-<br />
| 1.500.151-3.740.011 || not present<br />
|}<br />
<br />
=== sceUIDReferObjectWithLevelForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || 0xF79B52B2<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int sceUIDReferObjectWithLevelForKernel(SceUID uid, SceUInt32 level, SceKernelObject **ppEntry);</source><br />
<br />
=== sceUIDGetObjectForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || 0xC4893914<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
Calls [[#sceGUIDGetObjectForDriver]].<br />
<br />
<source lang="C">int sceUIDGetObjectForKernel(SceUID uid, SceKernelObject **ppEntry);</source><br />
<br />
=== sceUIDtoObjectForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xED221825<br />
|-<br />
| 3.65 || 0xFA6C098C<br />
|}<br />
<br />
Calls [[SceSysmem#sceGUIDGetObjectForDriver]].<br />
<br />
<source lang="C">SceKernelObject *sceUIDtoObjectForKernel(SceUID uid);</source><br />
<br />
=== sceUIDClassIsSubclassForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-1.691 || not present (in ForDriver)<br />
|-<br />
| 3.60-3.61 || 0x48750A5A<br />
|-<br />
| 3.63 || 0x7F7D5C4A<br />
|}<br />
<br />
This is a guessed name. Temp name was sceUIDClassIsWithinSubclassChainForKernel.<br />
<br />
<source lang="C">SceBool sceUIDClassIsSubclassForKernel(SceClass *pClass, SceClass *pTargetClass);</source><br />
<br />
=== sceUIDEntryHeapCloseAllPUIDForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0xFAF96C1F<br />
|-<br />
| 3.65 || 0x133024A5<br />
|}<br />
<br />
<source lang="C">int sceUIDEntryHeapCloseAllPUIDForKernel(SceUID guid);</source><br />
<br />
=== sceKernelUIDEntryHeapGetInfoForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || not present<br />
|-<br />
| 3.60-3.61 || 0x686AA15C<br />
|-<br />
| 3.63 || 0xCCD47B97<br />
|}<br />
<br />
Official name may also be sceUIDEntryHeapGetInfoForKernel (seen in 4.00).<br />
<br />
<source lang="C"><br />
typedef struct SceUIDEntryHeapInfo {<br />
SceSize size; //<! Size of this structure (0x18)<br />
SceSize objectSize;<br />
SceSize totalHeapSize;<br />
SceSize totalItemCount;<br />
SceSize unk10;<br />
SceSize unk14;<br />
} SceUIDEntryHeapInfo;<br />
<br />
SceInt32 sceKernelUIDEntryHeapGetInfoForKernel(SceUID entryHeapId, SceUIDEntryHeapInfo *pInfo);<br />
</source><br />
<br />
=== sceUIDEntryHeapSetHookForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0xCD985AEB<br />
|-<br />
| 3.63 || 0x666C878F<br />
|}<br />
<br />
?Implemented in internal system software.? Not implemented in external system software.<br />
<br />
<source lang="C">int sceUIDEntryHeapSetHookForKernel(SceUID guid, void *pHook);</source><br />
<br />
=== sceUIDEntryGetNameForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x114E6476<br />
|-<br />
| 3.63 || 0x5FD15C6E<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">char *sceUIDEntryGetNameForKernel(SceUIDEntry *pEntry);</source><br />
<br />
=== sceUIDEntryGetLevelForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0xC2F7D8A4<br />
|-<br />
| 3.63 || 0x797C858B<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">SceUInt16 sceUIDEntryGetLevelForKernel(SceUIDEntry *pEntry);</source><br />
<br />
=== sceUIDEntryGetAttrForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x8FB73A29<br />
|-<br />
| 3.63 || 0x17F12DCE<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">SceUInt32 sceUIDEntryGetAttrForKernel(SceUIDEntry *pEntry);</source><br />
<br />
=== sceUIDEntryGetLinkCountForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x876A7F44<br />
|-<br />
| 3.63 || 0xF3DB2D71<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">SceUInt8 sceUIDEntryGetLinkCountForKernel(SceUIDEntry *pEntry);</source><br />
<br />
=== sceUIDEntryGetUIDForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x6BB6AF94<br />
|-<br />
| 3.63 || 0x03A2CAF0<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">SceUID sceUIDEntryGetUIDForKernel(SceUIDEntry *pEntry);</source><br />
<br />
=== sceGUIDRegisterForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.61 || 0xAF42AAD5<br />
|-<br />
| 3.63 || 0x6DB44A42<br />
|}<br />
<br />
<source lang="C">SceUID sceGUIDRegisterForKernel(SceClass *pClass, const char *name, SceKernelObject *pObject);</source><br />
<br />
=== sceGUIDUnregisterForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || 0xE79BBCF2<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int sceGUIDUnregisterForKernel(SceUID uid);</source><br />
<br />
=== sceGUIDOpenByGUIDForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.61 || 0xCF53EEE4<br />
|-<br />
| 3.63 || 0x89D33DF0<br />
|}<br />
<br />
<source lang="C">SceUID sceGUIDOpenByGUIDForKernel(SceUID guid);</source><br />
<br />
=== sceGUIDNameForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-1.060.031 || 0x250EE289<br />
|-<br />
| 1.50-3.740.011 || not present<br />
|}<br />
<br />
<source lang="C">char *sceGUIDNameForKernel(SceUID uid);</source><br />
<br />
=== sceGUIDtoClassForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.61 || 0x66636970<br />
|-<br />
| 3.63 || 0x368F1C36<br />
|}<br />
<br />
<source lang="C">SceClass *sceGUIDtoClassForKernel(SceUID guid);</source><br />
<br />
=== sceGUIDGetObjectWithClassForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.61 || 0x7ABFA9A7<br />
|-<br />
| 3.63 || 0x0E43E113<br />
|}<br />
<br />
Possible name are sceUIDGetObjectWithClassForKernel or sceUIDtoProcessForKernel.<br />
<br />
<source lang="C">int sceGUIDGetObjectWithClassForKernel(SceUID uid, SceClass *pClass, SceKernelObject **obj);</source><br />
<br />
=== sceGUIDGetUIDVectorByClassForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.600.011 || 0xEC7D36EF<br />
|-<br />
| 3.630.011-3.740.011 || 0x52137FA3<br />
|}<br />
<br />
Copy UIDs to <code>pVector</code> by referring to all objects created by <code>pClass</code>.<br />
<br />
<source lang="C"><br />
/*<br />
* nVector - maximum number of copied UIDs<br />
* ret_num - number of retrieved UIDs<br />
*/<br />
int sceGUIDGetUIDVectorByClassForKernel(SceClass *pClass, SceUInt32 vis_level, SceUID *pVector, SceUInt32 nVector, SceUInt32 *ret_num);<br />
</source><br />
<br />
=== sceGUIDGetUIDVectorWeakByClassForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.060.031 || not present<br />
|-<br />
| 1.500.151-3.610.011 || 0x59F577E8<br />
|-<br />
| 3.630.011-3.740.011 || 0xE9957329<br />
|}<br />
<br />
Copy UIDs to <code>pVector</code> by referring to all objects created by <code>pClass</code>.<br />
<br />
<source lang="C"><br />
/*<br />
* nVector - maximum number of copied UIDs<br />
* ret_num - number of retrieved UIDs<br />
*/<br />
int sceGUIDGetUIDVectorWeakByClassForKernel(SceClass *pClass, SceUInt32 vis_level, SceUID *pVector, SceUInt32 nVector, SceUInt32 *ret_num);<br />
</source><br />
<br />
=== sceGUIDGetEntryForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x45F2A59C<br />
|-<br />
| 3.63 || 0xFF464A49<br />
|}<br />
<br />
<source lang="C">int sceGUIDGetEntryForKernel(SceUID guid, SceUIDEntry **ppEntry);</source><br />
<br />
=== sceGUIDGetEntryInfoAllForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.610.011 || 0x2A79C51C<br />
|-<br />
| 3.630.011-3.740.011 || 0x3BF0DE65<br />
|}<br />
<br />
<source lang="C">int sceGUIDGetEntryInfoAllForKernel(SceUInt32 vis_level, SceUID guid, SceUID *pVector, SceUInt32 nVector, void *pInfo);</source><br />
<br />
=== sceGUIDGetEntryInfoClassForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.610.011 || 0xE90CFD62<br />
|-<br />
| 3.630.011-3.740.011 || 0x71E934DB<br />
|}<br />
<br />
<source lang="C">int sceGUIDGetEntryInfoClassForKernel(SceUID guid, SceClass *pClass, SceUInt32 vis_level, void *pInfoVector, SceUInt32 nVector, SceUInt32 *ret_num);</source><br />
<br />
=== sceGUIDKernelCreateForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || 0xE6FAD50A<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
Create a GUID with default attribute (0x30000).<br />
<br />
<source lang="C">int sceGUIDKernelCreateForKernel(SceClass *pClass, const char *name, SceKernelObject **ppEntry);</source><br />
<br />
=== sceGUIDKernelCreateWithAttrForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.61 || 0x53E1FFDE<br />
|-<br />
| 3.63 || 0x6D26B066<br />
|}<br />
<br />
Create a GUID with the specified attribute.<br />
<br />
<source lang="C">int sceGUIDKernelCreateWithAttrForKernel(SceClass *pClass, const char *name, SceUInt32 attr, SceKernelObject **ppEntry);</source><br />
<br />
=== sceGUIDKernelCreateWithOptForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-0.995 || not present<br />
|-<br />
| 0.996-3.60 || 0xDF0288D7<br />
|-<br />
| 3.65 || 0xFB6390CE<br />
|}<br />
<br />
This is a guessed name. Temp name was sceKernelCreateUidObjForKernel, scePUIDKernelCreateWithAttrForKernel.<br />
<br />
<source lang="c"><br />
typedef struct SceGUIDKernelCreateOpt { // size is at least 0x20 on FW 3.60<br />
SceUInt32 attr;<br />
SceUInt32 field_4;<br />
SceUID uid;<br />
SceUID pid;<br />
SceUInt32 field_10;<br />
SceUInt32 classAttr;<br />
SceUInt32 uidAttr;<br />
SceUID pid2;<br />
} SceGUIDKernelCreateOpt;<br />
<br />
SceUID sceGUIDKernelCreateWithOptForKernel(SceClass *pClass, const char *name, SceGUIDKernelCreateOpt *pOpt, SceKernelObject **ppEntry);<br />
</source><br />
<br />
=== sceGUIDGetVisibilityLevelForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0xC69666C3<br />
|-<br />
| 3.63 || 0x4E923101<br />
|}<br />
<br />
<source lang="C">SceUInt32 sceGUIDGetVisibilityLevelForKernel(SceUID guid);</source><br />
<br />
=== sceGUIDSetVisibilityLevelForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0xCB8D03C0<br />
|-<br />
| 3.63 || 0xE8CC2166<br />
|}<br />
<br />
Sets visibilityLevel into guid's GUIDEntry.<br />
<br />
<source lang="C">int sceGUIDSetVisibilityLevelForKernel(SceUID guid, int visibilityLevel);</source><br />
<br />
=== sceGUIDFindByObjectForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.61 || 0x95ABFDC3<br />
|-<br />
| 3.63 || 0xEC90AA11<br />
|}<br />
<br />
<source lang="C">SceUID sceGUIDFindByObjectForKernel(void *pObject);</source><br />
<br />
=== sceGUIDFindByNameForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0xCEBA8031<br />
|-<br />
| 3.63 || 0xBDE00106<br />
|}<br />
<br />
<source lang="C">SceUID sceGUIDFindByNameForKernel(const char *name);</source><br />
<br />
=== sceGUIDFindByNameAllForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x4B5C85AC<br />
|-<br />
| 3.63 || 0xF49C0BE8<br />
|}<br />
<br />
<source lang="C"><br />
// return value: to reverse, should be either SceUID guid or void* pObj<br />
SceUID sceGUIDFindByNameAllForKernel(const char *name);<br />
</source><br />
<br />
=== sceGUIDGetPIDForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0xCF5A2311<br />
|-<br />
| 3.63 || 0xBD42A0FC<br />
|}<br />
<br />
Returns Process ID for guid.<br />
<br />
<source lang="C">SceUID sceGUIDGetPIDForKernel(SceUID guid);</source><br />
<br />
=== sceGUIDSetPIDForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x812E7A53<br />
|-<br />
| 3.63 || 0x46DF8C8A<br />
|}<br />
<br />
Sets Process ID for guid.<br />
<br />
<source lang="C">int sceGUIDSetPIDForKernel(SceUID guid, SceUID pid);</source><br />
<br />
=== sceGUIDSetCNOAForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x8D6AF468<br />
|-<br />
| 3.63 || 0x5EDDEEB5<br />
|}<br />
<br />
Setting Class Name Object Attr.<br />
<br />
<source lang="C">int sceGUIDSetCNOAForKernel(SceUID guid, SceClass *pClass, const char *name, void *pObject, SceUInt32 attr);</source><br />
<br />
=== sceGUIDSetForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.61 || 0xD7B323EB<br />
|-<br />
| 3.63 || 0xBF275C5A<br />
|}<br />
<br />
Re setting the GUID on an object that already has a uid assigned may cause the system to malfunction.<br />
<br />
<source lang="C">int sceGUIDSetForKernel(SceUID guid, SceClass *pClass, const char *name, SceKernelObject *pObject);</source><br />
<br />
=== scePUIDGetEntryInfoAllForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.692.000 || not present<br />
|-<br />
| 1.800.071-3.610.011 || 0x2770A7D7<br />
|-<br />
| 3.630.011-3.740.011 || 0x3C3005EE<br />
|}<br />
<br />
<source lang="C">int scePUIDGetEntryInfoAllForKernel(SceUID pid, SceClass *pClass, SceUInt32 vis_level, SceUID *pVector, SceUInt32 nVector, void *pInfo);</source><br />
<br />
=== scePUIDGetAttrForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x86E83C0D<br />
|-<br />
| 3.63 || 0x96BD47D1<br />
|}<br />
<br />
<source lang="C">int scePUIDGetAttrForKernel(SceUID pid, SceUID puid, SceUInt32 *pAttr);</source><br />
<br />
=== scePUIDReleaseObjectForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.61 || 0x3FCA782B<br />
|-<br />
| 3.63 || 0xCE561224<br />
|}<br />
<br />
<source lang="C">int scePUIDReleaseObjectForKernel(SceUID pid, SceUID puid);</source><br />
<br />
=== scePUIDGetInfoForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || not present<br />
|-<br />
| 3.60-3.61 || 0x12ED88AE<br />
|-<br />
| 3.63 || 0x857701D4<br />
|}<br />
<br />
<source lang="C"><br />
// pInfo size is 0x14 bytes<br />
int scePUIDGetInfoForKernel(SceUID pid, SceUID puid, void *pInfo);<br />
</source><br />
<br />
=== scePUIDtoGUIDWithDebugForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0xB3E2AA7A<br />
|-<br />
| 3.63 || 0x188C8742<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">SceUID scePUIDtoGUIDWithDebugForKernel(SceUID pid, SceUID puid);</source><br />
<br />
=== scePUIDReferObjectForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.61 || 0x620E00E7<br />
|-<br />
| 3.63 || 0x2C15615F<br />
|}<br />
<br />
<source lang="C">int scePUIDReferObjectForKernel(SceUID pid, SceUID puid, SceObject **ppObject);</source><br />
<br />
=== scePUIDOpenByNameWithOptForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x22F79E82<br />
|-<br />
| 3.63 || 0x201E970B<br />
|}<br />
<br />
<source lang="C">SceUID scePUIDOpenByNameWithOptForKernel(ScePID pid, const char *name, void *pOpt);</source><br />
<br />
=== scePUIDGetPUIDVectorByGUIDForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.06 || not present<br />
|-<br />
| 2.100.081-3.610.011 || 0xBF04FC83<br />
|-<br />
| 3.630.011-3.740.011 || 0xCE16AD91<br />
|}<br />
<br />
<source lang="C">int scePUIDGetPUIDVectorByGUIDForKernel(SceUID pid, SceUID guid, SceUInt32 vis_level, SceUID *pVector, SceUInt32 nVector, SceUInt32 *ret_num);</source><br />
<br />
=== scePUIDGetUIDVectorByClassForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.610.011 || 0xB16D5136<br />
|-<br />
| 3.630.000-3.740.011 || 0x08C05493<br />
|}<br />
<br />
Similar to [[#sceGUIDGetUIDVectorByClassForKernel]].<br />
<br />
<source lang="C">int scePUIDGetUIDVectorByClassForKernel(SceUID pid, SceClass *pClass, SceUInt32 vis_level, SceUID *pVector, SceUInt32 nVector, SceUInt32 *ret_num);</source><br />
<br />
=== scePUIDReferObjectWithClassForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x9C53F457<br />
|-<br />
| 3.63 || 0x9C23DFF7<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">int scePUIDReferObjectWithClassForKernel(SceUID pid, SceUID puid, SceClass *pClass, void **ppObject);</source><br />
<br />
=== scePUIDOpenByGUIDWithOptForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x53A2E272<br />
|-<br />
| 3.63 || 0x1FF2749A<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">SceUID scePUIDOpenByGUIDWithOptForKernel(SceUID pid, SceUID guid, void *pOpt);</source><br />
<br />
=== scePUIDGetGUIDVectorForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x3203AE64<br />
|-<br />
| 3.63 || 0x66489B4B<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">int scePUIDGetGUIDVectorForKernel(SceUID pid, SceUInt32 vis_level, SceUID *pVector, SceUInt32 nVector, SceUInt32 *ret_num);</source><br />
<br />
=== sceKernelGetPhyPartKernelForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.61 || 0x4D38F861<br />
|-<br />
| 3.63-3.65 || 0x0164D817<br />
|}<br />
<br />
return gpPhyPartKernel;<br />
<br />
<source lang="C">void *sceKernelGetPhyPartKernelForKernel(void);</source><br />
<br />
=== sceKernelGetPhyPartToolForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.61 || 0xF8E95A5A<br />
|-<br />
| 3.63-3.65 || 0x0B1B4ACA<br />
|}<br />
<br />
<source lang="C">void *sceKernelGetPhyPartToolForKernel(void);</source><br />
<br />
=== sceKernelGetPhyPartGameForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0xB60568F9<br />
|-<br />
| 3.63-3.65 || 0x62800A6B<br />
|}<br />
<br />
<source lang="C">void *sceKernelGetPhyPartGameForKernel(void);</source><br />
<br />
=== sceKernelSetPhyPartGameForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x77876A8D<br />
|-<br />
| 3.63-3.65 || 0x3753C584<br />
|}<br />
<br />
<source lang="C">void sceKernelSetPhyPartGameForKernel(void *pPhyPart);</source><br />
<br />
=== sceKernelSetPhyPartCdramForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x07FEBBCA<br />
|-<br />
| 3.63 || 0xDCEF10B2<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">void sceKernelSetPhyPartCdramForKernel(void *pPhyPart);</source><br />
<br />
=== sceKernelPhyMemLowAllocForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.61 || 0x5E169FEF<br />
|-<br />
| 3.63 || 0xEA98CCE1<br />
|}<br />
<br />
Allocate a range of physically contiguous "pages" from a PhyMemLow object.<br />
<br />
<source lang="C"><br />
// type must be one of SCE_KERNEL_PHYMEMLOW_TYPE (0x10001, 0x10002 or 0x20001)<br />
// size and alignment must be aligned to the target PHYMEMLOW granularity<br />
// On success, *pOut contains the base physical address of a range with the provided size<br />
SceInt32 sceKernelPhyMemLowAllocForKernel(SceUInt32 type, SceSize size, SceSize alignment, SceUIntPAddr* pOut);<br />
</source><br />
<br />
=== sceKernelPhyMemLowPA2VAForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.61 || 0x0FD6B756<br />
|-<br />
| 3.63 || 0x2CFD8C9A<br />
|}<br />
<br />
<source lang="C"><br />
// type must be 0x10002<br />
int sceKernelPhyMemLowPA2VAForKernel(int type, void *PA, void **pVA);<br />
</source><br />
<br />
=== sceKernelGetPhyMemLowInfoForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || 0x06A4DA6C<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C"><br />
// type must be one of SCE_KERNEL_PHYMEMLOW_TYPE (0x10001, 0x10002 or 0x20001)<br />
SceInt32 sceKernelGetPhyMemLowInfoForKernel(SceUInt32 type, SceKernelPhyMemLowInfo *info);<br />
</source><br />
<br />
=== sceKernelPhyMemLowFreeForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.61 || 0x18B99FDD<br />
|-<br />
| 3.63 || 0x844DF3DA<br />
|}<br />
<br />
Free a range of physical "pages" from a PhyMemLow object.<br />
<br />
<source lang="C"><br />
// type must be one of SCE_KERNEL_PHYMEMLOW_TYPE (0x10001, 0x10002 or 0x20001)<br />
SceInt32 sceKernelPhyMemLowFreeForKernel(SceUInt32 type, SceUIntPAddr pbase, SceSize size);<br />
</source><br />
<br />
=== sceKernelSetPhyMemLowHookForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x2658EE0A<br />
|-<br />
| 3.63 || 0x2C7B8D65<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Only implemented in sysdbg build.<br />
<br />
<source lang="C">int sceKernelSetPhyMemLowHookForKernel(void *pHook);</source><br />
<br />
=== sceKernelAllocMemBlockByCommandForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0xCA91B9D5<br />
|-<br />
| 3.63 || 0x455B0A4C<br />
|}<br />
<br />
<source lang="C"><br />
typedef struct SceKernelMemBlockAllocCommand { // size is 0x94 on FW 3.65<br />
SceSize size; // Size of this structure<br />
SceUInt32 code;<br />
char* name;<br />
char unk_8[0x74];<br />
void* typeInfo;<br />
char unk_0x84[0x10];<br />
} SceKernelMemBlockAllocCommand;<br />
<br />
int sceKernelAllocMemBlockByCommandForKernel(SceKernelMemBlockAllocCommand *pCommand);<br />
</source><br />
<br />
=== sceKernelAllocSimpleMemBlockForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.61 || 0xF81F4672<br />
|-<br />
| 3.63 || 0x814CDCC5<br />
|}<br />
<br />
<source lang="C"><br />
typedef struct SceKernelSimpleMemBlock {<br />
char unk_0[0x14];<br />
void *base;<br />
char unk_18[0x14];<br />
void *PhyPage;<br />
SceSize size;<br />
} SceKernelSimpleMemBlock;<br />
<br />
int sceKernelAllocSimpleMemBlockForKernel(const char *name, SceKernelMemBlockType type, SceSize vsize, SceKernelSimpleMemBlock *smb);<br />
</source><br />
<br />
=== sceKernelFreeSimpleMemBlockForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.61 || 0xA1FFA2C9<br />
|-<br />
| 3.63 || 0xA4DB88E1<br />
|}<br />
<br />
<source lang="C">int sceKernelFreeSimpleMemBlockForKernel(void *a1);</source><br />
<br />
=== sceKernelGetSimpleMemBlockBaseForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.61 || 0x0A8D14EC<br />
|-<br />
| 3.63 || 0x39D5A3B7<br />
|}<br />
<br />
<source lang="C">int sceKernelGetSimpleMemBlockBaseForKernel(SceKernelSimpleMemBlock *smb, void **base);</source><br />
<br />
=== sceKernelSimpleMemBlockGetFIFOForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x43DFCE89<br />
|-<br />
| 3.63 || 0xBD625136<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">int sceKernelSimpleMemBlockGetFIFOForKernel(void *pResult);</source><br />
<br />
=== sceKernelGetMemBlockInfoAllForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0xFEF54604<br />
|-<br />
| 3.63 || 0x1D19C864<br />
|}<br />
<br />
<source lang="C">int sceKernelGetMemBlockInfoAllForKernel(void *pPart, int a2, int a3, int a4, int a5, SceUInt32 level, void *pInfoBuffer, int a8, SceUInt32 *a9);</source><br />
<br />
=== sceKernelGetMemBlockInfoSimpleForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.61 || 0x2364A170<br />
|-<br />
| 3.63 || 0xBA441FD0<br />
|}<br />
<br />
<source lang="C">int sceKernelGetMemBlockInfoSimpleForKernel(SceUID uid, SceKernelMemBlockInfoSimple *pInfo);</source><br />
<br />
=== sceKernelGetMemBlockTypeForKernel ===<br />
<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x289BE3EC<br />
|-<br />
| 3.63 || 0xD44FE44B<br />
|}<br />
<br />
<source lang="c"><br />
/***<br />
* Gets the memory block type of a memory block<br />
*<br />
* @param[in] uid - SceUID of the memory block<br />
* @param[out] type - Type of the memory block identified by uid<br />
*<br />
* @return 0 on success, < 0 on error.<br />
*/<br />
int sceKernelGetMemBlockTypeForKernel(SceUID uid, unsigned int *type);</source><br />
<br />
=== sceKernelRemapMemBlockForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-1.05 || 0x8D332AE1<br />
|-<br />
| 1.50-3.60 || not present. Moved to ForDriver<br />
|}<br />
<br />
Temp name was sceKernelRemapBlockForKernel.<br />
<br />
See [[SceSysmem#sceKernelRemapMemBlockForDriver|sceKernelRemapMemBlockForDriver]].<br />
<br />
=== sceKernelSetMemBlockDebugCallbackForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x01DE3AB7<br />
|-<br />
| 3.63 || 0xF57A97A0<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Only implemented in sysdbg build.<br />
<br />
<source lang="C">int sceKernelSetMemBlockDebugCallbackForKernel(void *pCallbacks);</source><br />
<br />
=== sceKernelMemBlockAssocPhyPageForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0xA88F6D88<br />
|-<br />
| 3.63 || 0x441E6BE9<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">int sceKernelMemBlockAssocPhyPageForKernel(SceUID guid, const SceUIntPtr *a2);</source><br />
<br />
=== sceKernelAllocPartitionStackMemBlockForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x64133268<br />
|-<br />
| 3.63 || 0x40870E74<br />
|}<br />
<br />
Temp name was sceKernelAllocStackBlockForKernel.<br />
<br />
<source lang="C">SceUID sceKernelAllocPartitionStackMemBlockForKernel(const char *name, SceSize size, int a3);</source><br />
<br />
=== sceKernelMemBlockGetCodeForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x61C2AA52<br />
|-<br />
| 3.63 || 0x48D2E408<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">SceUint32 sceKernelMemBlockGetCodeForKernel(SceUint32 type);</source><br />
<br />
=== sceKernelAllocPartitionMemBlockForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x5FFE4B79<br />
|-<br />
| 3.65 || 0x6DB46017<br />
|}<br />
<br />
Temp name was sceKernelAllocSystemCallTableForKernel.<br />
<br />
<source lang="C"><br />
SceUID sceKernelAllocPartitionMemBlockForKernel(SceUID part, const char *name, SceKernelMemBlockType type, SceSize size, const struct SceKernelAllocMemBlockOptKernel *pOpt);<br />
</source><br />
<br />
=== sceKernelPartitionGetInfoForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x7BE4D3D1<br />
|-<br />
| 3.63 || 0xFB101B86<br />
|}<br />
<br />
<source lang="C">int sceKernelPartitionGetInfoForKernel(SceUID part_id, void *pInfo);</source><br />
<br />
=== sceKernelGetPhyPageResetForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.61 || 0xEB350679<br />
|-<br />
| 3.63 || 0x8FD11E02<br />
|}<br />
<br />
<source lang="C">void *sceKernelGetPhyPageResetForKernel(void);</source><br />
<br />
=== SceSysmemForKernel_BD33EDDF ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0xBD33EDDF<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
Gets thread's name. Returns 0 on success.<br />
<br />
<source lang="C">int SceSysmemForKernel_BD33EDDF(int maybe_thid, char **pThreadName);</source><br />
<br />
=== sceKernelAllocForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xC0A4D2F3<br />
|-<br />
| 3.65 || 0x85571907<br />
|}<br />
<br />
<source lang="C">void *sceKernelAllocForKernel(SceSize len);</source><br />
<br />
=== sceKernelAllocWithOptForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0xA2CD1697<br />
|-<br />
| 3.63 || 0xCF3C3F7A<br />
|}<br />
<br />
<source lang="C"><br />
<br />
typedef struct SceAllocOpt {<br />
SceSize size; // 0x14<br />
SceSize data04; // maybe len align?<br />
SceSize align;<br />
int data0C;<br />
int data10; <br />
} SceAllocOpt;<br />
<br />
void *sceKernelAllocWithOptForKernel(SceSize len, SceAllocOpt *pOpt);<br />
<br />
</source><br />
<br />
=== sceKernelFreeForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xABAB0FAB<br />
|-<br />
| 3.65 || 0x4233C16D<br />
|}<br />
<br />
<source lang="C">int sceKernelFreeForKernel(void *ptr);</source><br />
<br />
=== sceKernelSetAllocFreeHookForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0xBC2E2B2B<br />
|-<br />
| 3.63 || 0x42834422<br />
|}<br />
<br />
Only implemented in sysdbg build.<br />
<br />
<source lang="C">int sceKernelSetAllocFreeHookForKernel(void *pHook);</source><br />
<br />
=== SceSysmemForKernel_C38D61FC ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || 0xC38D61FC<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
Calls [[#SceSysmemForDriver_89A44858]].<br />
<br />
=== SceSysmemForKernel_7C797940 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || 0x7C797940<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
Calls [[#SceSysmemForKernel_620E00E7]] or [[#sceGUIDReferObjectForDriver]].<br />
<br />
=== sceKernelVSlotMapProcMemoryForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0xFAD03241<br />
|-<br />
| 3.63 || 0x14D3807B<br />
|}<br />
<br />
<source lang="C">int sceKernelVSlotMapProcMemoryForKernel(SceUID pid, void *addr, SceSize size, SceUInt32 flag, SceKernelVSlot *pVslot, int *pBaseAddrOrOffset);</source><br />
<br />
=== sceKernelVSlotUnmapProcMemoryForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x789CD5BF<br />
|-<br />
| 3.63 || 0x4EEF69C7<br />
|}<br />
<br />
<source lang="C">int sceKernelVSlotUnmapProcMemoryForKernel(SceKernelVSlot *pVslot);</source><br />
<br />
=== SceSysmemForKernel_ECF9435A ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0xECF9435A<br />
|-<br />
| 3.63 || 0xFCB5745A<br />
|}<br />
<br />
Writes <code>nWords</code> times the 4-byte <code>ch</code> starting at usermode address <code>u_dst</code>. Write is performed with the <code>STRT</code> instruction and <code>DACR=0x15450FC3</code> (same as [[SceSysmem#sceKernelCopyToUserTextDomainForKernel||sceKernelCopyToUserTextDomain]] - required because NID tables are in RX segments).<br />
<br />
Used by [[SceKernelModulemgr]] to overwrite NID tables once a module's imports are bound with a random value from Bigmac RNG. This overwrite was called [[Kernel#NID_Poisoning|"NID Poisoning"]] by Team Molecule.<br />
<br />
<source lang="C">int SceSysmemForKernel_ECF9435A(void *u_dst, SceUInt32 ch, SceUInt32 nWords);</source><br />
<br />
=== SceSysmemForKernel_ECC68E7B ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0xECC68E7B<br />
|-<br />
| 3.63 || 0x05822B82<br />
|}<br />
<br />
<source lang="C">int SceSysmemForKernel_ECC68E7B(SceUInt32 phymem_type, SceUInt32 *result);</source><br />
<br />
=== SceSysmemForKernel_E68A9F1B ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0xE68A9F1B<br />
|-<br />
| 3.63 || 0x1DE4953F<br />
|}<br />
<br />
<source lang="C">int SceSysmemForKernel_E68A9F1B(int a1, SceClass **ppClass);</source><br />
<br />
=== sceKernelCheckOpenVMDomainForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 2.000.081-3.610.011 || 0xD514BB56<br />
|-<br />
| 3.630.000-3.740.011 || 0x4E6D8BC3<br />
|}<br />
<br />
Returns 2 if Virtual Machine is open, 0 else. Returns 0x80027101 on error.<br />
<br />
<source lang="C">SceUInt32 sceKernelCheckOpenVMDomainForKernel(void);</source><br />
<br />
=== sceeKernelSetNameHeapHookForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x1E11F41D<br />
|-<br />
| 3.63 || 0x6DBDA03B<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Not implemented in sysdbg build either. Probably only implemented during real development.<br />
<br />
Only return 0.<br />
<br />
<source lang="C">int sceeKernelSetNameHeapHookForKernel(void *pHook);</source><br />
<br />
=== SceSysmemForKernel_22708F14 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x22708F14<br />
|-<br />
| 3.63 || 0x456ECB54<br />
|}<br />
<br />
<source lang="C">SceUInt32 SceSysmemForKernel_22708F14(void *a1, int a2);</source><br />
<br />
=== SceSysmemForKernel_22A26637 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x22A26637<br />
|-<br />
| 3.63 || 0xAD19285A<br />
|}<br />
<br />
<source lang="C">int SceSysmemForKernel_22A26637(void *a1, int a2, int a3, int a4, int a5, int a6, void *a7);</source><br />
<br />
=== SceSysmemForKernel_C6F04370 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0xC6F04370<br />
|-<br />
| 3.63 || 0x02DAD732<br />
|}<br />
<br />
init budget data in sysmem.<br />
<br />
<source lang="C">int SceSysmemForKernel_C6F04370(void);</source><br />
<br />
=== SceSysmemForKernel_B339A865 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0xB339A865<br />
|-<br />
| 3.63 || 0x320E907F<br />
|}<br />
<br />
Returns 0.<br />
<br />
<source lang="C">int SceSysmemForKernel_B339A865(void);</source><br />
<br />
=== SceSysmemForKernel_AD5A83E3 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0xAD5A83E3<br />
|-<br />
| 3.63 || 0xBF70207B<br />
|}<br />
<br />
<source lang="C">int SceSysmemForKernel_AD5A83E3(SceUID guid, SceUInt32 vis_level, SceUInt32 a3, int *a4);</source><br />
<br />
=== SceSysmemForKernel_A504BA60 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0xA504BA60<br />
|-<br />
| 3.63 || 0xCAB15F74<br />
|}<br />
<br />
=== SceSysmemForKernel_7DC46969 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.61 || 0x7DC46969<br />
|-<br />
| 3.63 || 0x8450BFF7<br />
|}<br />
<br />
Returns 1.<br />
<br />
<source lang="C">int SceSysmemForKernel_7DC46969(void);</source><br />
<br />
== SceSysmemForDriver ==<br />
<br />
=== sceKernelProcessGetContextForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.80-3.74 || 0x2ECF7944<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="c">int sceKernelProcessGetMMUContextForDriver(SceUID pid, SceKernelMMUContext **ppCtx);</source><br />
<br />
=== sceKernelProcessSwitchContextForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.74 || 0x2D711589<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="c">int sceKernelProcessSwitchMMUContextForDriver(SceKernelMMUContext *new_context, SceKernelMMUContext *prev_context);</source><br />
<br />
=== scePUIDOpenByGUIDForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0xBF209859<br />
|}<br />
<br />
Temp name was sceKernelCreateUserUidForDriver.<br />
<br />
<source lang="c">SceUID scePUIDOpenByGUIDForDriver(SceUID pid, SceUID guid);</source><br />
<br />
=== scePUIDOpenByGUIDWithFlagsForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xCED1547B<br />
|}<br />
<br />
Temp name was sceKernelCreateUserUidForClassForDriver.<br />
<br />
<source lang="c">SceUID scePUIDOpenByGUIDWithFlagsForDriver(SceUID pid, SceUID guid, SceUInt32 flags);</source><br />
<br />
=== scePUIDOpenByNameForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x513B9DDD<br />
|}<br />
<br />
Temp name was sceKernelCreateUserUidForNameForDriver.<br />
<br />
<source lang="c">SceUID scePUIDOpenByNameForDriver(SceUID pid, const char *name);</source><br />
<br />
=== scePUIDOpenByNameWithClassForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x8DA0BCA5<br />
|}<br />
<br />
Equivalent to [[SceSysmem#scePUIDOpenByNameForDriver|scePUIDOpenByNameForDriver]], but object's class is checked to be a subclass of provided <code>pClass</code> before opening.<br />
<br />
<source lang="c">SceUID scePUIDOpenByNameWithClassForDriver(ScePID pid, const char *name, SceClass *pClass);</source><br />
<br />
=== scePUIDOpenByNameWithExactClassForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.010.031 || 0xB800123C<br />
|-<br />
| 3.10-3.740.011 || not present<br />
|}<br />
<br />
This is a guessed name. Temp name was <code>add_heap</code>.<br />
<br />
Equivalent to [[SceSysmem#scePUIDOpenByNameWithClassForDriver|scePUIDOpenByNameWithClass]], but the object's class must match exactly the provided <code>pClass</code>.<br />
<br />
<source lang="C">SceUID scePUIDOpenByNameWithExactClassForDriver(ScePID pid, const char *name, const SceClass *pClass);</source><br />
<br />
=== scePUIDCloseForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x84A4AF5E<br />
|}<br />
<br />
Temp name was sceKernelDeleteUserUidForDriver.<br />
<br />
<source lang="c">int scePUIDCloseForDriver(SceUID pid, SceUID puid);</source><br />
<br />
=== scePUIDSetNameForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x12624884<br />
|}<br />
<br />
Temp name was sceKernelSetNameForPidForUidForDriver.<br />
<br />
<source lang="c">int scePUIDSetNameForDriver(SceUID pid, SceUID puid, const char *name);</source><br />
<br />
=== scePUIDGetObjectForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xFE6D7FAE<br />
|}<br />
<br />
Temp name was sceKernelGetObjectForPidForUidForDriver.<br />
<br />
<source lang="c">int scePUIDGetObjectForDriver(SceUID pid, SceUID uid, SceKernelObject **ppEntry);</source><br />
<br />
=== scePUIDtoGUIDForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x45D22597<br />
|}<br />
<br />
Temp name was sceKernelKernelUidForUserUidForDriver.<br />
<br />
Returns the Global UID of a process based on its Process UID.<br />
<br />
<source lang="c">SceUID scePUIDtoGUIDForDriver(SceUID pid, SceUID puid);</source><br />
<br />
=== scePUIDtoGUIDWithClassForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || not present<br />
|-<br />
| 3.60 || 0x184172B1<br />
|}<br />
<br />
Temp name was sceKernelKernelUidForUserUidForClassForDriver.<br />
<br />
<source lang="c">SceUID scePUIDtoGUIDWithClassForDriver(SceUID pid, SceUID puid, SceClass *pClass);</source><br />
<br />
=== scePUIDGetNameForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x09896EB7<br />
|}<br />
<br />
Temp name was sceKernelGetNameForPidByUidForDriver, scePUIDGetEntryHeapNameForDriver <br />
<br />
<source lang="C">int scePUIDGetNameForDriver(SceUID pid, SceUID puid, char **pName);</source><br />
<br />
=== scePUIDGetClassForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xE9728A12<br />
|}<br />
<br />
Temp name was sceKernelGetClassForPidForUidForDriver.<br />
<br />
<source lang="c">int scePUIDGetClassForDriver(SceUID pid, SceUID puid, SceClass **ppClass);</source><br />
<br />
=== sceUIDKernelCreateForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-1.060.031 || 0x7FC849B1<br />
|-<br />
| 1.50-3.740.011 || not present<br />
|}<br />
<br />
Calls [[#sceGUIDKernelCreateForKernel]].<br />
<br />
Create a UID with default attribute (0x30000).<br />
<br />
<source lang="C">int sceUIDKernelCreateForDriver(SceClass *pClass, const char *name, SceKernelObject **ppEntry);</source><br />
<br />
=== sceGUIDKernelCreateForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || not present<br />
|-<br />
| 1.000.071-3.740.011 || 0x56A13E90<br />
|}<br />
<br />
Temp name was sceUIDKernelCreate2ForDriver, sceKernelCreateUidObj2ForDriver.<br />
<br />
Create a UID with default attribute (0x30000).<br />
<br />
<source lang="c">SceUID sceGUIDKernelCreateForDriver(SceClass *pClass, const char *name, SceKernelObject **ppEntry);</source><br />
<br />
=== sceUIDOpenByNameForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || 0x796881D6<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
Calls [[#sceGUIDOpenByNameForDriver]].<br />
<br />
<source lang="c">SceUID sceUIDOpenByNameForDriver(const char *name);</source><br />
<br />
=== sceUIDCloseForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || 0x32C5F628<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
if (flag_or_addr_or_pid & 0x40000000) == 0 calls [[#sceGUIDCloseForDriver]] else [[#scePUIDCloseForDriver]].<br />
<br />
<source lang="C">int sceUIDCloseForDriver(SceUID uid, SceUInt32 flag_or_addr_or_pid);</source><br />
<br />
=== SceSysmemForDriver_F09A7D09 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || 0xF09A7D09<br />
|-<br />
| 3.60-3.74 || not present<br />
|}<br />
<br />
Calls [[#sceGUIDCloseForDriver]].<br />
<br />
<source lang="C">int SceSysmemForDriver_F09A7D09(SceUID uid);</source><br />
<br />
=== sceUIDGetDefaultClassForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || 0xFE28F5EB<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">SceClass *sceUIDGetDefaultClassForDriver(void);</source><br />
<br />
=== sceUIDtoObjectForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || 0xAB7AC3D1<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Calls [[#sceUIDtoObjectForKernel]].<br />
<br />
<source lang="C">SceKernelObject *sceUIDtoObjectForDriver(SceUID uid);</source><br />
<br />
=== sceUIDtoClassForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || 0x65B9B393<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
Calls [[#sceGUIDtoClassForKernel]].<br />
<br />
<source lang="C">SceClass *sceUIDtoClassForDriver(SceUID uid);</source><br />
<br />
=== sceUIDClassInitForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || 0xE6D75E99<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
Renamed to [[SceSysmem#sceUIDClassInitClassForDriver|sceUIDClassInitClassForDriver]].<br />
<br />
<source lang="C">int sceUIDClassInitForDriver(SceClass *pClass, const char *name, uint32_t uid_class, SceSize item_size, void *constructor, void *destructor);</source><br />
<br />
=== sceUIDClassInitClassForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || not present<br />
|-<br />
| 3.60 || 0x61317102<br />
|}<br />
<br />
Temp name was sceKernelCreateClassForDriver.<br />
<br />
<source lang="c">int sceUIDClassInitClassForDriver(SceClass *cls, const char *name, const SceClass *group, SceSize item_size, SceClassCallback create, SceClassCallback destroy);</source><br />
<br />
=== sceUIDGetClassInfoAllForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || 0x3EF32C6C<br />
|-<br />
| 3.60 || not present. Moved to ForKernel<br />
|}<br />
<br />
See [[SceSysmem#sceUIDClassGetClassInfoAllForKernel|sceUIDClassGetClassInfoAllForKernel]]<br />
<br />
=== sceGUIDCreateForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x89A44858<br />
|}<br />
<br />
Temp name was sceKernelCreateUidObjForUidForDriver.<br />
<br />
Create a GUID with default attribute (0x30000) for the specified UID.<br />
<br />
<source lang="c">SceUID sceGUIDCreateForDriver(SceClass *pClass, const char *name, SceUID guid, SceKernelObject **ppEntry);</source><br />
<br />
=== sceGUIDOpenByNameForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0xD76E7452<br />
|}<br />
<br />
Temp name was sceKernelOpenUidForNameForDriver.<br />
<br />
<source lang="c">SceUID sceGUIDOpenByNameForDriver(const char *name);</source><br />
<br />
=== sceGUIDCloseForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x047D32F2<br />
|}<br />
<br />
Temp name was sceKernelDeleteUidForDriver.<br />
<br />
<source lang="C">int sceGUIDCloseForDriver(SceUID guid);</source><br />
<br />
=== sceGUIDGetClassForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xC74B0152<br />
|}<br />
<br />
Temp name was sceKernelGetClassForUidForDriver.<br />
<br />
<source lang="c">int sceGUIDGetClassForDriver(SceUID guid, SceClass **ppClass);</source><br />
<br />
=== sceGUIDSetNameForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.50-3.60 || 0x4CFA4100<br />
|}<br />
<br />
Temp name was sceKernelSetObjectForUidForDriver. Wrongfully named scePUIDSetNameForDriver.<br />
<br />
Calls the same routine as [[SceSysmem#sceGUIDSetForKernel|sceGUIDSetForKernel]], but passes NULL for pClass and pObject.<br />
<br />
<source lang="c">SceInt32 sceGUIDSetNameForDriver(SceUID guid, const char *name);</source><br />
<br />
=== sceGUIDNameForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || 0xB2BB6216<br />
|-<br />
| 3.60 || 0xE655852F<br />
|}<br />
<br />
Temp name was sceKernelGetNameForUid2ForDriver.<br />
<br />
<source lang="C">char* sceGUIDNameForDriver(SceUID guid);</source><br />
<br />
=== sceGUIDGetNameForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xA78755EB<br />
|}<br />
<br />
Temp name was sceKernelGetNameForUidForDriver.<br />
<br />
<source lang="C">int sceGUIDGetNameForDriver(SceUID guid, char **pName);</source><br />
<br />
=== sceGUIDGetObjectForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x0FC24464<br />
|}<br />
<br />
Temp name was sceKernelGUIDGetObjectForDriver.<br />
<br />
<source lang="c">int sceGUIDGetObjectForDriver(SceUID uid, SceKernelObject **ppEntry);</source><br />
<br />
=== sceGUIDReferObjectForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x0F5C84B7<br />
|}<br />
<br />
Temp name was sceKernelGetObjectForUidForDriver.<br />
<br />
<source lang="c">int sceGUIDReferObjectForDriver(SceUID uid, SceKernelObject **ppEntry);</source><br />
<br />
=== sceGUIDReferObjectWithLevelForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || not present<br />
|-<br />
| 3.60 || 0xF6DB54BA<br />
|}<br />
<br />
Temp name was sceKernelGetObjectForUidForAttrForDriver.<br />
<br />
<source lang="c">int sceGUIDReferObjectWithLevelForDriver(SceUID uid, SceUInt32 level, SceKernelObject **pEntry);</source><br />
<br />
=== sceGUIDReferObjectWithClassLevelForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x77066FD1<br />
|}<br />
<br />
<source lang="c">int sceGUIDReferObjectWithClassLevelForDriver(SceUID guid, SceClass *pClass, SceUInt32 level, SceKernelObject **ppEntry);</source><br />
<br />
=== sceGUIDReferObjectWithClassForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x00ED6C14<br />
|}<br />
<br />
Temp name was sceKernelGetObjForUidForDriver.<br />
<br />
<source lang="c">int sceGUIDReferObjectWithClassForDriver(SceUID uid, SceClass *pClass, SceKernelObject **ppEntry);</source><br />
<br />
=== sceGUIDReferObjectWithSubclassForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x72A98D17<br />
|}<br />
<br />
Temp name was sceKernelGetObjectForUidForClassTreeForDriver.<br />
<br />
<source lang="c">int sceGUIDReferObjectWithSubclassForDriver(SceUID guid, SceClass *pClass, SceKernelObject **ppEntry);</source><br />
<br />
=== sceGUIDReleaseObjectForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x149885C4<br />
|}<br />
<br />
Temp name was sceKernelUidReleaseForDriver.<br />
<br />
<source lang="c">int sceGUIDReleaseObjectForDriver(SceUID uid);</source><br />
<br />
=== sceKernelGetUIDClassForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x85336A1C<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">SceClass *sceKernelGetUIDClassForDriver(void);</source><br />
<br />
=== sceKernelIsSubclassForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || 0x6484D03E<br />
|-<br />
| 1.691 || 0x55F4826F<br />
|-<br />
| 3.60 || not present. Moved to ForKernel<br />
|}<br />
<br />
See [[SceSysmem#sceUIDClassIsSubclassForKernel|sceUIDClassIsSubclassForKernel]]<br />
<br />
=== SceSysmemForDriver_6F2ACDAE ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x6F2ACDAE<br />
|-<br />
| 1.80-3.74 || not present<br />
|}<br />
<br />
Temp name was switch_ttb_for_pid.<br />
<br />
Changes the TTBR to point to the tables for a given PID.<br />
<br />
<source lang="c">int SceSysmemForDriver_6F2ACDAE(SceUID pid);</source><br />
<br />
=== sceKernelAllocMemBlockForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.65 || 0xC94850C9<br />
|}<br />
<br />
The interface is the same as the usermode version of this function, however more types can be specified and more options are in the pOpt argument.<br />
<br />
To allocate a kernel RW block of memory, specify <code>type = SCE_KERNEL_MEMBLOCK_TYPE_KERNEL_TMP_RW</code>.<br />
<br />
To allocate a block of memory with a specific physical address, specify <code>type = SCE_KERNEL_MEMBLOCK_TYPE_KERNEL_IO_SO_RW</code> or <code>type = SCE_KERNEL_MEMBLOCK_TYPE_KERNEL_IO_RW</code>, <code>pOpt->attr = 2</code>, and <code>pOpt->pbase = physical address</code>.<br />
<br />
To allocate a block of memory that is kernel executable, specify <code>type = SCE_KERNEL_MEMBLOCK_TYPE_KERNEL_RX</code>.<br />
<br />
To allocate a block of memory that is physically contiguous, specify <code>type = 0x30808006</code>, <code>pOpt->attr = 0x200004</code> and an alignment to <code>pOpt->alignment</code>.<br />
<br />
To allocate a block of memory inside the CDRAM, specify <code>type = 0x40404006</code>.<br />
<br />
<source lang="c">SceUID sceKernelAllocMemBlockForDriver(const char *name, SceKernelMemBlockType type, SceSize vsize, const struct SceKernelAllocMemBlockOptKernel *pOpt);</source><br />
<br />
=== sceKernelAllocMemBlockForDebuggerForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940-1.50 || 0x59F3159C<br />
|}<br />
<br />
Same as [[#sceKernelAllocMemBlockForDriver]] but authorizes null pOpt.<br />
<br />
<source lang="c">SceUID sceKernelAllocMemBlockForDebuggerForDriver(const char *name, SceKernelMemBlockType type, SceSize vsize, SceKernelAllocMemBlockOptKernel *pOpt);</source><br />
<br />
=== sceKernelAllocMemBlockWithInfoForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xD44F464D<br />
|}<br />
<br />
Temp name was sceKernelAllocMemBlockExtForDriver.<br />
<br />
<source lang="c">SceUID sceKernelAllocMemBlockWithInfoForDriver(const char *name, SceKernelMemBlockType type, SceSize vsize, const struct SceKernelAllocMemBlockOptKernel *pOpt, SceKernelMemBlockInfo *pInfo);</source><br />
<br />
=== sceKernelFreeMemBlockForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.65 || 0x009E1C61<br />
|}<br />
<br />
<source lang="C">int sceKernelFreeMemBlockForDriver(SceUID uid);</source><br />
<br />
=== sceKernelFindMemBlockByAddrForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x8A1742F6<br />
|}<br />
<br />
<source lang="c">SceUID sceKernelFindMemBlockByAddrForDriver(const void *addr, SceSize size);</source><br />
<br />
=== sceKernelFindProcMemBlockByAddrForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x857F1D5A<br />
|}<br />
<br />
Temp name was sceKernelFindMemBlockByAddrForPidForDriver.<br />
<br />
<source lang="c">SceUID sceKernelFindProcMemBlockByAddrForDriver(SceUID pid, const void *addr, SceSize size);</source><br />
<br />
=== sceKernelGetMemBlockAllocSizeForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-2.120.011 || 0x63E5754B<br />
|-<br />
| 2.500.071-3.740.011 || not present<br />
|}<br />
<br />
This function was replaced since System Software version 2.500.071 by [[#sceKernelGetMemBlockAllocMapSizeForDriver]].<br />
<br />
<source lang="C">int sceKernelGetMemBlockAllocSizeForDriver(SceUID memid, SceSize *pAllocSize);</source><br />
<br />
=== sceKernelGetMemBlockAllocMapSizeForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.120.011 || not present<br />
|-<br />
| 2.500.071-3.740.011 || 0x78337B62<br />
|}<br />
<br />
Temp name was sceKernelMemBlockGetSomeSizeForDriver.<br />
<br />
This function is a replacement since System Software version 2.500.071 of [[#sceKernelGetMemBlockAllocSizeForDriver]].<br />
<br />
<source lang="C">int sceKernelGetMemBlockAllocMapSizeForDriver(SceUID memid, SceSize *pAllocMapSize);</source><br />
<br />
=== sceKernelGetMemBlockMemtypeByAddrForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xF3BBE2E1<br />
|}<br />
<br />
Temp name was sceKernelFindMemBlockByAddrForDefaultSizeForDriver.<br />
<br />
<source lang="c">SceKernelMemoryType sceKernelGetMemBlockMemtypeByAddrForDriver(const void *addr);</source><br />
<br />
=== sceKernelGetMemBlockPARangeForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x98C15666<br />
|}<br />
<br />
Temp name was sceKernelGetMemBlockAddrPairForUidForDriver.<br />
<br />
Returns the physical address and size (pRange) of the memory block if it is physically continuous.<br />
<br />
<source lang="c">int sceKernelGetMemBlockPARangeForDriver(SceUID uid, SceKernelPARange *pRange);</source><br />
<br />
=== sceKernelGetMemBlockBaseForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.74 || 0xA841EDDA<br />
|}<br />
<br />
<source lang="C"><br />
/**<br />
* @brief Get mapped base address of memory block.<br />
*<br />
* Get base address of memory block.<br />
* @param[in] uid block id<br />
* @param[out] ppBase base address of memory block<br />
* @retval SCE_OK success<br />
* @retval <SCE_OK Error<br />
*/<br />
int sceKernelGetMemBlockBaseForDriver(SceUID uid, void **ppBase);<br />
</source><br />
<br />
=== sceKernelGetMemBlockVBaseForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xB81CF0A3<br />
|}<br />
<br />
Temp name was sceKernelGetMemBlockKernelPageForDriver.<br />
<br />
<source lang="c">int sceKernelGetMemBlockVBaseForDriver(SceUID uid, void **kernel_page);</source><br />
<br />
=== sceKernelGetMemBlockMappedBaseForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x0B1FD5C3<br />
|}<br />
<br />
<source lang="c">int sceKernelGetMemBlockMappedBaseForDriver(SceUID uid, void **basep);</source><br />
<br />
=== sceKernelGetMemBlockPAVectorForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x19A51AC7<br />
|}<br />
<br />
Temp name was sceKernelGetMemBlockPaddrListForUidForDriver.<br />
<br />
<source lang="c">int sceKernelGetMemBlockPAVectorForDriver(SceUID uid, SceKernelPAVector *pPAV);</source><br />
<br />
=== sceKernelGetMemBlockInfoForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xA73CFFEF<br />
|}<br />
<br />
Temp name was sceKernelMemBlockGetInfoExForVisibilityLevelForDriver.<br />
<br />
<source lang="c">int sceKernelGetMemBlockInfoForDriver(SceUID uid, uint32_t level, SceKernelMemBlockInfoEx *pInfo);</source><br />
<br />
=== sceKernelGetMemBlockInfoExForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x24A99FFF<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="c">int sceKernelGetMemBlockInfoExForDriver(SceUID uid, SceKernelMemBlockInfoEx *pInfo);</source><br />
<br />
=== sceKernelDecRefCountMemBlockForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xF50BDC0C<br />
|}<br />
<br />
Temp name was sceKernelMemBlockDecRefCounterAndReleaseUidForDriver.<br />
<br />
<source lang="c">int sceKernelDecRefCountMemBlockDriver(SceUID uid);</source><br />
<br />
=== sceKernelIncRefCountMemBlockForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xEAF3849B<br />
|}<br />
<br />
Temp name was sceKernelMemBlockIncRefCounterAndReleaseUidForDriver.<br />
<br />
<source lang="c">int sceKernelIncRefCountMemBlockForDriver(SceUID uid);</source><br />
<br />
=== sceKernelMemBlockType2MemtypeForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x20C811FA<br />
|}<br />
<br />
<source lang="c">int sceKernelMemBlockType2MemtypeForDriver(SceKernelMemBlockType type);</source><br />
<br />
=== sceKernelMemBlockTypeGetPrivilegesForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x6A0792A3<br />
|}<br />
<br />
<source lang="c">int sceKernelMemBlockTypeGetPrivilegesForDriver(SceKernelMemBlockType type);</source><br />
<br />
=== sceKernelMemBlockType2SourceMemTypeForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xCB0F3A33<br />
|}<br />
<br />
This is a guessed name. Temp name was sceKernelMemBlockTypeGetUnknownForDriver.<br />
<br />
<source lang="c"><br />
#define SCE_KERNEL_SOURCE_MEMORY_TYPE_IO 0x100000<br />
#define SCE_KERNEL_SOURCE_MEMORY_TYPE_LPDDR 0x200000<br />
#define SCE_KERNEL_SOURCE_MEMORY_TYPE_CDRAM 0x400000<br />
<br />
int sceKernelMemBlockType2SourceMemTypeForDriver (SceKernelMemBlockType type);<br />
</source><br />
<br />
=== sceKernelMapMemBlockForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x58D21746<br />
|}<br />
<br />
Temp name was sceKernelMapBlockUserVisibleForDriver, sceKernelPartitionMapMemBlockForDriver.<br />
<br />
<source lang="c">int sceKernelMapMemBlockForDriver(SceUID uid);</source><br />
<br />
=== sceKernelMapMemBlockWithFlagForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x04059C4B<br />
|}<br />
<br />
This is a guessed name. Temp name was sceKernelMapBlockUserVisibleWithFlagForDriver.<br />
<br />
<source lang="c"><br />
/**<br />
* Map a memblock.<br />
*<br />
* @param[in] uid - GUID of the memblock to map.<br />
* @param[in] flag - Set to 1 to prevent DCache invalidation before mapping.<br />
*<br />
* @return 0 on success, < 0 on error.<br />
*/<br />
int sceKernelMapMemBlockWithFlagForDriver(SceUID uid, int flag);<br />
</source><br />
<br />
=== sceKernelRemapMemBlockForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-1.06 || not present<br />
|-<br />
| 1.500.151-3.740.011 || 0xDFE2C8CB<br />
|}<br />
<br />
Temp name was sceKernelRemapBlockForDriver, sceKernelPartialRemapMemBlockForDriver.<br />
<br />
This can be used to remap RW memory as RX. To do this, first allocate a memory block of type <code>SCE_KERNEL_MEMBLOCK_TYPE_KERNEL_RW</code>. After you are done writing, call sceKernelRemapMemBlockForDriver with type <code>SCE_KERNEL_MEMBLOCK_TYPE_KERNEL_RX</code>.<br />
<br />
<source lang="c">int sceKernelRemapMemBlockForDriver(SceUID uid, SceKernelMemBlockType type);</source><br />
<br />
=== sceKernelUnmapMemBlockForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xFFCD9B60<br />
|}<br />
<br />
<source lang="c">int sceKernelUnmapMemBlockForDriver(SceUID uid);</source><br />
<br />
=== sceKernelGetPhysicalMemoryTypeForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x0AAA4FDD<br />
|}<br />
<br />
Temp name was sceKernelVaddrMaybeGetSectionTypeForDriver<br />
<br />
<source lang="c">int sceKernelGetPhysicalMemoryTypeForDriver(void *vaddr);</source><br />
<br />
=== sceKernelGetPhyMemInfoForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x89475192<br />
|}<br />
<br />
<source lang="c"><br />
typedef struct SceKernelPhyMemInfo { // Size is 0xC on 0.931-3.60<br />
SceSize size; // Size of this structure<br />
void* pbase; // Base physical address<br />
SceSize psize; // Physical size<br />
} SceKernelPhyMemInfo;<br />
<br />
// as of FW 0.931-0.990, pindex must be one of these values: 1 PhyPartKernel, 8 PageVenezia, 9 PageVIP<br />
#define SCE_KERNEL_PHYMEMPART_KERNEL_INDEX 1<br />
#define SCE_KERNEL_PHYMEMPART_LPDDR2MAIN_KERNEL_INDEX 6<br />
#define SCE_KERNEL_PAGE_VENEZIA_INDEX 8<br />
#define SCE_KERNEL_PAGE_VIP_INDEX 9<br />
<br />
SceInt32 sceKernelGetPhyMemInfoForDriver(SceUInt32 pindex, SceKernelPhyMemInfo *pInfo);<br />
</source><br />
<br />
=== sceKernelPartialAllocMemBlockForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x16713BE8<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="c"><br />
/**<br />
* Allocates PhyPages for a partial range of a memblock.<br />
*<br />
* @param[in] uid - GUID of the memblock.<br />
* @param[in] vbase - Start of the range.<br />
* @param[in] vsize - Size of the range.<br />
* @param[in] check - SCE_KERNEL_MEMBLOCK_PARTIAL_CHECK_[FREE|NONE]<br />
* <br />
* @return 0 on success, < 0 on error.<br />
*/<br />
int sceKernelPartialAllocMemBlockForDriver(SceUID uid, void* vbase, SceSize vsize, SceUInt32 opCheck);<br />
</source><br />
<br />
=== sceKernelPartialFreeMemBlockForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x8C43B052<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="c"><br />
/**<br />
* Unmaps and frees PhyPages for a partial range of a memblock.<br />
*<br />
* @param[in] uid - GUID of the memblock.<br />
* @param[in] vbase - Start of the range.<br />
* @param[in] vsize - Size of the range.<br />
* @param[in] check - SCE_KERNEL_MEMBLOCK_PARTIAL_CHECK_[ALLOCATED|NONE]<br />
* <br />
* @return 0 on success, < 0 on error.<br />
*/<br />
int sceKernelPartialFreeMemBlockForDriver(SceUID uid, void* vbase, SceSize vsize, SceUInt32 check);<br />
</source><br />
<br />
=== sceKernelPartialMapMemBlockForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x13805CA8<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="c"><br />
/**<br />
* Maps PhyPages for a partial range of a memblock.<br />
*<br />
* @param[in] uid - GUID of the memblock.<br />
* @param[in] vbase - Start of the range.<br />
* @param[in] vsize - Size of the range.<br />
* @param[in] check - SCE_KERNEL_MEMBLOCK_PARTIAL_CHECK_[ALLOCATED|FREE|ALLOCNOMAP|NONE]<br />
* <br />
* @return 0 on success, < 0 on error.<br />
*/<br />
int sceKernelPartialMapMemBlockForDriver (SceUID uid, void* vbase, SceSize vsize, SceUInt32 check);<br />
</source><br />
<br />
=== sceKernelPartialRemapMemBlockForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x4C584B29<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="c"><br />
/**<br />
* Remaps PhyPages for a partial range of a memblock.<br />
*<br />
* @param[in] uid - GUID of the memblock.<br />
* @param[in] vbase - Start of the range.<br />
* @param[in] vsize - Size of the range.<br />
* @param[in] op - SCE_KERNEL_MEMBLOCK_PARTIAL_OP_[REMAP_RO|REMAP_RW] | SCE_KERNEL_MEMBLOCK_PARTIAL_CHECK_[MAPPED_RW|MAPPED_RO|NONE]<br />
* <br />
* @return 0 on success, < 0 on error.<br />
*/<br />
int sceKernelPartialRemapMemBlockForDriver(SceUID uid, void* vbase, SceSize vsize, SceUInt32 op);<br />
</source><br />
<br />
=== sceKernelPartialUnmapMemBlockForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x6C76AD89<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="c"><br />
/**<br />
* Unmaps PhyPages for a partial range of a memblock.<br />
*<br />
* @param[in] uid - GUID of the memblock.<br />
* @param[in] vbase - Start of the range.<br />
* @param[in] vsize - Size of the range.<br />
* @param[in] check - SCE_KERNEL_MEMBLOCK_PARTIAL_CHECK_[MAPPED|NONE]<br />
* <br />
* @return 0 on success, < 0 on error.<br />
*/<br />
int sceKernelPartialUnmapMemBlockForDriver(SceUID uid, void* vbase, SceSize vsize, SceUInt32 check);<br />
</source><br />
<br />
=== sceKernelGetMemBlockProcessForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x1EFC96EA<br />
|}<br />
<br />
<source lang="c">int sceKernelGetMemBlockProcessForDriver(SceUID uid);</source><br />
<br />
=== sceKernelMemBlockToPARangeForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x64DBE472<br />
|}<br />
<br />
This is a guessed name. Temp name was sceKernelMemBlockGetVirPageForDriver.<br />
<br />
Gets a single PARange from the memblock. Returns an error if the memblock has more than one PARange.<br />
<br />
<source lang="c">int sceKernelMemBlockToPARangeForDriver(SceUID uid, SceKernelPARange *pRange);</source><br />
<br />
=== sceKernelMemBlockToPAVectorForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x987EE587<br />
|}<br />
<br />
<source lang="c">int sceKernelMemBlockToPAVectorForDriver(SceUID uid, SceKernelPAVector *pPAV);</source><br />
<br />
=== sceKernelCreateHeapForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x9328E0E8<br />
|}<br />
<br />
The heap pool is thread safe.<br />
<br />
has list "SCE_KERNEL_HEAP_HAS_HEAPCB".<br />
<br />
<source lang="C"><br />
// pOpt can be NULL<br />
SceUID sceKernelCreateHeapForDriver(const char *name, SceSize size, SceKernelHeapCreateOpt *pOpt);<br />
</source><br />
<br />
=== sceKernelDeleteHeapForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940-3.60 || 0xD6437637<br />
|}<br />
<br />
<source lang="c">int sceKernelDeleteHeapForDriver(SceUID uid);</source><br />
<br />
=== sceKernelVerifyHeapForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xC50A9C0D<br />
|}<br />
<br />
<source lang="c">int sceKernelVerifyHeapForDriver(SceUID uid, void *ptr);</source><br />
<br />
=== sceKernelShrinkHeapForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x856FA2E3<br />
|}<br />
<br />
<source lang="c">int sceKernelShrinkHeapForDriver(SceUID heapid);</source><br />
<br />
=== sceKernelAllocHeapMemoryForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x7B4CB60A<br />
|}<br />
<br />
Temp name was sceKernelMemPoolAlloc. Official name might also be sceUIDKernelCreateForDriver.<br />
<br />
Calls [[SceSysmem#sceKernelAllocHeapMemoryWithOptionForDriver|sceKernelAllocHeapMemoryWithOptionForDriver]] with a3 = 0.<br />
<br />
<source lang="c">void *sceKernelAllocHeapMemoryForDriver(SceUID uid, SceSize size);</source><br />
<br />
=== sceKernelAllocUncacheHeapMemoryForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x7750CEA7<br />
|}<br />
<br />
Temp name was sceKernelAllocHeapMemoryFromGlobalHeapForDriver.<br />
<br />
Calls [[SceSysmem#sceKernelAllocHeapMemoryForDriver|sceKernelAllocHeapMemoryForDriver]] with uncache heap.<br />
<br />
<source lang="c">void* sceKernelAllocUncacheHeapMemoryForDriver(SceSize size);</source><br />
<br />
=== sceKernelAllocUncacheHeapMemoryWithOptionForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x0B4ED16A<br />
|}<br />
<br />
Temp name was sceKernelAllocHeapMemoryFromGlobalHeapWithOptForDriver.<br />
<br />
Calls [[SceSysmem#sceKernelAllocHeapMemoryWithOptionForDriver|sceKernelAllocHeapMemoryWithOptionForDriver]] with uncache heap.<br />
<br />
<source lang="c">void* sceKernelAllocUncacheHeapMemoryWithOptionForDriver(SceSize size, SceKernelHeapMemoryOpt *pOpt);</source><br />
<br />
=== sceKernelAllocHeapMemoryWithOptForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xB415B5A8<br />
|}<br />
<br />
Temp name was sceKernelAllocHeapMemoryWithOpt1ForDriver.<br />
<br />
Same as <code>sceKernelAllocHeapMemoryForDriver</code> but uses <code>pOpt</code>.<br />
<br />
<source lang="c">void* sceKernelAllocHeapMemoryWithOptForDriver(SceUID uid, SceSize size, SceKernelHeapMemoryOpt *pOpt);</source><br />
<br />
=== sceKernelAllocHeapMemoryWithOptionForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x49D4DD9B<br />
|}<br />
<br />
Temp name was sceKernelAllocHeapMemoryWithOpt2ForDriver.<br />
<br />
Same as <code>sceKernelAllocHeapMemoryForDriver</code> but uses <code>pOpt</code>.<br />
<br />
<source lang="c">void* sceKernelAllocHeapMemoryWithOptionForDriver(SceUID uid, SceSize size, SceKernelHeapMemoryOpt *pOpt);</source><br />
<br />
=== sceKernelFreeHeapMemoryForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x3EBCE343<br />
|}<br />
<br />
Temp name was sceKernelMemPoolFreeForDriver.<br />
<br />
<source lang="c">int sceKernelFreeHeapMemoryForDriver(SceUID uid, void *ptr);</source><br />
<br />
=== sceKernelFreeUncacheHeapMemoryForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xFB817A59<br />
|}<br />
<br />
Temp name was sceKernelFreeHeapMemoryFromGlobalHeapForDriver.<br />
<br />
<source lang="c">int sceKernelFreeUncacheHeapMemoryForDriver(void *ptr);</source><br />
<br />
=== sceKernelCountFillValueFromUserForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xBDA6E42B<br />
|}<br />
<br />
Temp name was sceKernelFirstDifferentBlock32UserForDriver.<br />
<br />
<source lang="c">int sceKernelCountFillValueFromUserForDriver(unsigned int *ptr, int value, int byte_size);</source><br />
<br />
=== sceKernelCountFillValueFromUserProcForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x8334454F<br />
|}<br />
<br />
Temp name was sceKernelFirstDifferentBlock32UserForPidForDriver.<br />
<br />
<source lang="c">int sceKernelCountFillValueFromUserProcForDriver(SceUID pid, unsigned int *ptr, int value, int byte_size);</source><br />
<br />
=== sceKernelCountFillValue64FromUserForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.120.011 || not present<br />
|-<br />
| 2.500.071-3.740.011 || 0xBB3B02C2<br />
|}<br />
<br />
Temp name was sceKernelFirstDifferentBlock64UserForDriver.<br />
<br />
<source lang="c">int sceKernelCountFillValue64FromUserForDriver(unsigned long long *ptr, int unused, unsigned long long value, int byte_size);</source><br />
<br />
=== sceKernelCountFillValue64FromUserProcForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.120.011 || not present<br />
|-<br />
| 2.500.071-3.740.011 || 0xE83855FD<br />
|}<br />
<br />
Temp name was sceKernelFirstDifferentBlock64UserForPidForDriver.<br />
<br />
<source lang="c">int sceKernelCountFillValue64FromUserProcForDriver(SceUID pid, unsigned long long *ptr, unsigned long long value, int byte_size);</source><br />
<br />
=== sceKernelVAtoPAForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x8D160E65<br />
|}<br />
<br />
Temp name was sceKernelGetPaddrForDriver.<br />
<br />
This will write the physical address for a virtual address <code>pVA</code> to memory pointed to by <code>pPA</code>.<br />
<br />
Returns <0 on error, values >=0 indicate success.<br />
<br />
<source lang="c">int sceKernelVAtoPAForDriver(ScePVoid pVA, SceUIntPtr *pPA);</source><br />
<br />
=== sceKernelVAtoPABySWForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x65419BD3<br />
|}<br />
<br />
Temp name was sceKernelGetPaddrWithSectionTypeCheckForDriver, sceKernelAddressSpaceVAtoPABySWForDriver.<br />
<br />
<source lang="c">int sceKernelVAtoPABySWForDriver(void *pVA, void **pPA);</source><br />
<br />
=== sceKernelProcVAtoPAForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-2.120.011 || 0xC51934BD<br />
|-<br />
| 2.500.071-3.740.011 || not present<br />
|}<br />
<br />
<source lang="c">int sceKernelProcVAtoPAForDriver(SceUID pid, void *pVA, void **pPA);</source><br />
<br />
=== sceKernelProcModeVAtoPAForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x61A67D32<br />
|}<br />
<br />
Temp name was sceKernelGetPaddrForPidForDriver.<br />
<br />
<source lang="c">int sceKernelProcModeVAtoPAForDriver(SceUID pid, SceUInt32 mode, void *pVA, void **pPA);</source><br />
<br />
=== sceKernelVARangeToPAVectorForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xE68BEEBD<br />
|}<br />
<br />
Temp name was sceKernelGetPaddrListForDriver.<br />
<br />
This function writes into <code>pVector->output_buffer</code> an array of <code>vRange</code> that encompasses the block of memory specified in the input. <code>pVector->ret_count</code> will contain the number of entries written. If <code>pVector->output_buffer</code> is null, it will just write the count.<br />
<br />
<source lang="c">int sceKernelVARangeToPAVectorForDriver(const SceKernelVARange *vRange, SceKernelPAVector *pPAV);</source><br />
<br />
=== sceKernelVARangeToPAVectorBySWForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.06 || not present<br />
|-<br />
| 1.500.151-3.740.011 || 0x08A8A7E8<br />
|}<br />
<br />
This is a guessed name. Temp name was sceKernelGetPaddrListForLargePageForDriver.<br />
<br />
<source lang="c">int sceKernelVARangeToPAVectorBySWForDriver(const SceKernelVARange *vRange, SceKernelPAVector *pPAV);</source><br />
<br />
=== sceKernelVARangeToPAVectorByHWForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.06 || not present<br />
|-<br />
| 1.500.151-3.740.011 || 0x16844CE6<br />
|}<br />
<br />
Temp name was sceKernelGetPaddrListForSmallPageForDriver.<br />
<br />
<source lang="c">int sceKernelVARangeToPAVectorByHWForDriver(const SceKernelVARange *vRange, SceKernelPAVector *pPAV);</source><br />
<br />
=== sceKernelVARangeToPARangeForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940-3.740.011 || 0xAE36C775<br />
|}<br />
<br />
Temp name was sceKernelGetPaddrPairForDriver.<br />
<br />
<source lang="c">int sceKernelVARangeToPARangeForDriver(const SceKernelVARange *vRange, SceKernelPARange *pRange);</source><br />
<br />
=== sceKernelVARangeToPARangeBySWForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.06 || not present<br />
|-<br />
| 1.500.151-3.740.011 || 0x32257A24<br />
|}<br />
<br />
This is a guessed name. Temp name was sceKernelGetPaddrPairForLargePageForDriver.<br />
<br />
<source lang="c">int sceKernelVARangeToPARangeBySWForDriver(SceKernelVARange *vRange, SceKernelPARange *pRange);</source><br />
<br />
=== sceKernelVARangeToPARangeByHWForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.06 || not present<br />
|-<br />
| 1.500.151-3.740.011 || 0xB3575090<br />
|}<br />
<br />
This is a guessed name. Temp name was sceKernelGetPaddrPairForSmallPageForDriver.<br />
<br />
<source lang="c">int sceKernelVARangeToPARangeByHWForDriver(SceKernelVARange *vRange, SceKernelPARange *pRange);</source><br />
<br />
=== sceKernelIsAccessibleRangeForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x9C78064C<br />
|}<br />
<br />
Temp name was sceKernelFindMemBlockForDriver.<br />
<br />
Also exported as [[#sceKernelIsAccessibleRangeForDebugger]].<br />
<br />
?Returns 0 on success (if is accessible range)?<br />
<br />
<source lang="c">int sceKernelIsAccessibleRangeForDriver(SceUInt32 permission_type, const void *pVA, SceSize len);</source><br />
<br />
=== sceKernelIsAccessibleRangeProcForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x9F6E45E3<br />
|}<br />
<br />
Temp name was sceKernelFindMemBlockForPidForDriver.<br />
<br />
Also exported as [[#sceKernelIsAccessibleRangeProcForDebugger]].<br />
<br />
?Returns 0 on success (if is accessible range)?<br />
<br />
<source lang="C">int sceKernelIsAccessibleRangeProcForDriver(SceUID pid, SceUInt32 permission_type, const void *pVA, SceSize len);</source><br />
<br />
=== sceKernelIsEqualAccessibleRangeProcBySWForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.800.071-3.740.011 || 0xF4AD89D8<br />
|}<br />
<br />
Temp name was sceKernelProcIsPAWithinSameSection, sceKernelIsPaddrWithinSameSectionForUidForDriver.<br />
<br />
<source lang="C">int sceKernelIsEqualAccessibleRangeProcBySWForDriver(SceUID pid, int permission_type, void *pVA, SceSize len);</source><br />
<br />
=== sceKernelGetDebugPADramRangeForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.800.071-3.740.011 || 0xC9928F5E<br />
|}<br />
<br />
This is a guessed name. Temp name was sceKernelGetUnknownValidPhysAddressSpaceForDriver.<br />
<br />
<source lang="C">int sceKernelGetDebugPADramRangeForDriver(SceUIntPtr *address, SceSize *length);</source><br />
<br />
=== sceKernelIsVAWithinDebugPADramRangeForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.800.071-3.740.011 || 0xA7C0D1FC<br />
|}<br />
<br />
This is a guessed and bad name. Temp name was sceKernelIsPaddrWithinUnknownValidPhysAddressSpaceForDriver.<br />
<br />
<source lang="C">int sceKernelIsVAWithinDebugPADramRangeForDriver(const void *pVA);</source><br />
<br />
=== sceKernelUserMapForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x278BC201<br />
|}<br />
<br />
Temp name was sceKernelMapUserBlockDefaultTypeForDriver.<br />
<br />
Assigns type 0.<br />
<br />
<source lang="C">SceUID sceKernelUserMapForDriver(const char *name, SceKernelMemoryRefPerm permission, const void *user_buf, SceSize size, void **kernel_page, SceSize *kernel_size, SceUInt32 *kernel_offset);</source><br />
<br />
=== sceKernelProcUserMapForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.36 || not present<br />
|-<br />
| 3.500.000-3.740.011 || 0x0091D74D<br />
|}<br />
<br />
Temp name was sceKernelMapUserBlockForDefaultTypeForPidForDriver. sceKernelProcUserMapForDriver is certainly the real name.<br />
<br />
Assigns type 0.<br />
<br />
<source lang="C">SceUID sceKernelProcUserMapForDriver(SceUID pid, const char *name, SceKernelMemoryRefPerm permission, const void *user_buf, SceSize size, void **kernel_page, SceSize *kernel_size, SceUInt32 *kernel_offset);</source><br />
<br />
=== sceKernelUserMapWithFlagsForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.030-1.060.031 || not present<br />
|-<br />
| 1.500.151-3.740.011 || 0x7D4F8B5F<br />
|}<br />
<br />
Temp name was sceKernelMapUserBlockForDriver.<br />
<br />
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.<br />
<br />
<source lang="c"><br />
// this signature is for FW 1.50-1.69<br />
int sceKernelUserMapWithFlagsForDriver(SceKernelMemoryRefPerm permission, int type, void *user_buf, int size, void **kernel_page, int *kernel_size, int *kernel_offset);<br />
<br />
// this signature is for FW 3.60 - it now allows to give a name<br />
int sceKernelUserMapWithFlagsForDriver(char *name, SceKernelMemoryRefPerm permission, int type, void *user_buf, int size, void **kernel_page, int *kernel_size, int *kernel_offset);<br />
</source><br />
<br />
=== sceKernelUserUnmapForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x00575B00<br />
|}<br />
<br />
Temp name was sceKernelMemBlockReleaseForDriver.<br />
<br />
<source lang="c">int sceKernelUserUnmapForDriver(SceUID uid);</source><br />
<br />
=== sceKernelUnlockRangeForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x75C70DE0<br />
|}<br />
<br />
Temp name was sceKernelMemRangeReleaseForDriver.<br />
<br />
<source lang="c">int sceKernelUnlockRangeForDriver(void *addr, SceSize size);</source><br />
<br />
=== sceKernelUnlockRangeProcForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xA8525B06<br />
|}<br />
<br />
Temp name was sceKernelMemRangeReleaseForPidForDriver.<br />
<br />
<source lang="c">int sceKernelUnlockRangeProcForDriver(SceUID pid, void *addr, SceSize size);</source><br />
<br />
=== sceKernelUnlockRangeWithModeForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x22CBE925<br />
|}<br />
<br />
Temp name was sceKernelMemRangeReleaseWithPermForDriver, sceKernelUnlockRangeWithPermForDriver.<br />
<br />
Decreases references to pages.<br />
<br />
<source lang="c">int sceKernelUnlockRangeWithModeForDriver(SceKernelLockMode mode, void *addr, SceSize size);</source><br />
<br />
=== sceKernelLockRangeForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x59A4402F<br />
|}<br />
<br />
Temp name was sceKernelMemRangeRetainForDriver.<br />
<br />
<source lang="c">int sceKernelLockRangeForDriver(void *addr, SceSize size);</source><br />
<br />
=== sceKernelLockRangeProcForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x659586BF<br />
|}<br />
<br />
Temp name was sceKernelMemRangeRetainForPidForDriver.<br />
<br />
<source lang="c">int sceKernelLockRangeProcForDriver(SceUID pid, void *addr, SceSize size);</source><br />
<br />
=== sceKernelLockRangeWithModeForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xBC0A1D60<br />
|}<br />
<br />
Temp name was sceKernelMemRangeRetainWithPermForDriver, sceKernelLockRangeWithPermForDriver.<br />
<br />
Increases references to pages.<br />
<br />
<source lang="c">int sceKernelLockRangeWithModeForDriver(SceKernelLockMode mode, const void *addr, SceSize size);</source><br />
<br />
=== sceKernelReadUserForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || 0xE08F3967<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int sceKernelReadUserForDriver(void *dst, const void *src, SceSize size);</source><br />
<br />
=== sceKernelCopyToUserForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x6D88EF8A<br />
|}<br />
<br />
Temp name was sceKernelMemcpyKernelToUserForDriver.<br />
<br />
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>.<br />
<br />
<source lang="c">SceInt32 sceKernelCopyToUserForDriver(void *uaddr, const void *kaddr, SceSize size);</source><br />
<br />
=== sceKernelCopyToUserProcForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x6B825479<br />
|}<br />
<br />
Temp name was sceKernelMemcpyKernelToUserForPidForDriver, sceKernelProcCopyToUserForDriver.<br />
<br />
Temporarily switches to specified process' address space for a call to [[SceSysmem#sceKernelCopyToUserForDriver|sceKernelCopyToUser]].<br />
<br />
<source lang="c">SceInt32 sceKernelProcCopyToUserForDriver(ScePID pid, void *uaddr, const void *kaddr, SceSize size);</source><br />
<br />
=== sceKernelCopyToUserProcDomainForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-1.69 || 0x571D2739<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
Temp name was sceKernelRoMemcpyKernelToUserForPidForDriver, sceKernelProcCopyToUserRoForDriver.<br />
<br />
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.<br />
<br />
<source lang="c">SceInt32 sceKernelCopyToUserProcDomainForDriver(SceUID pid, void *dst, const void *src, SceSize size);</source><br />
<br />
=== sceKernelCopyFromUserForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0xBC996A7A<br />
|}<br />
<br />
Temp name was sceKernelMemcpyUserToKernelForDriver.<br />
<br />
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>.<br />
<br />
<source lang="c">SceInt32 sceKernelCopyFromUserForDriver(void *kaddr, const void *uaddr, SceSize size);</source><br />
<br />
=== sceKernelCopyFromUserProcForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.60 || 0x605275F8<br />
|}<br />
<br />
Temp name was sceKernelMemcpyUserToKernelForPidForDriver, sceKernelProcCopyFromUserForDriver.<br />
<br />
Temporarily switches to specified process' address space for a call to [[SceSysmem#sceKernelCopyFromUserForDriver|sceKernelCopyFromUser]].<br />
<br />
<source lang="c">SceInt32 sceKernelCopyFromUserProcForDriver(SceUID pid, void *dst, void *src, SceSize size);</source><br />
<br />
=== sceKernelCopyFromToUserForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || not present<br />
|-<br />
| 1.50-3.60 || 0x1BD44DD5<br />
|}<br />
<br />
Temp name was sceKernelMemcpyUserToUserForDriver, sceKernelUserCopyForDriver.<br />
<br />
<source lang="C">int sceKernelCopyFromToUserForDriver(void *dst, const void *src, SceSize size);</source><br />
<br />
=== sceKernelCopyFromToUserProcForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || not present<br />
|-<br />
| 1.50-3.60 || 0x8E086C33<br />
|}<br />
<br />
Temp name was sceKernelMemcpyUserToUserForPidForDriver, sceKernelProcUserCopyForDriver.<br />
<br />
<source lang="c">int sceKernelCopyFromToUserProcForDriver(SceUID pid, void *dst, const void *src, SceSize size);</source><br />
<br />
=== sceKernelUserStrnlenForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || not present (in ForKernel)<br />
|-<br />
| 0.940-0.990 || 0xFF06898A<br />
|-<br />
| 1.50-3.60 || not present<br />
|}<br />
<br />
Temp name was sceKernelStrnlenFromUserForDriver.<br />
<br />
<source lang="C">SceSize sceKernelUserStrnlenForDriver(const char *s, SceSize maxlen);</source><br />
<br />
=== sceKernelStrnlenUserForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || not present<br />
|-<br />
| 1.50-3.60 || 0xB429D419<br />
|}<br />
<br />
<source lang="c">SceSize sceKernelStrnlenUserForDriver(const char *s, SceSize maxlen);</source><br />
<br />
=== sceKernelProcStrnlenUserForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || not present<br />
|-<br />
| 1.50-3.60 || 0x9929EB07<br />
|}<br />
<br />
<source lang="c">SceSize sceKernelProcStrnlenUserForDriver(SceUID pid, const char *s, SceSize maxlen);</source><br />
<br />
=== sceKernelProcUserStrcpyForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-1.50 || 0xEBCB3970<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int sceKernelProcUserStrcpyForDriver(SceUID pid, char *dst, const char *src);</source><br />
<br />
=== sceKernelStrncpyFromUserSpecialForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-1.50 || 0x7440BCDA<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int sceKernelStrncpyFromUserSpecialForDriver(char *dst, const char *src, SceSize maxlen, SceSize *dst_size);</source><br />
<br />
=== sceKernelStrncpyToUserSpecialForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-1.50 || 0x369355F1<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int sceKernelStrncpyToUserSpecialForDriver(char *dst, const char *src, SceSize maxlen, SceSize *dst_size);</source><br />
<br />
=== sceKernelUserStrncpyForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || not present. Present but not exported.<br />
|-<br />
| 0.940-0.990 || 0xE6D5EFE4<br />
|-<br />
| 1.50-3.60 || not present<br />
|}<br />
<br />
Returns 0 on success.<br />
<br />
<source lang="C">int sceKernelUserStrncpyForDriver(char *dst, const char *src, SceSize maxlen);</source><br />
<br />
=== sceKernelStrncpyFromUserForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || not present<br />
|-<br />
| 1.50-3.60 || 0xDB3EC244<br />
|}<br />
<br />
Temp name was sceKernelStrncpyUserToKernelForDriver.<br />
<br />
<source lang="c">int sceKernelStrncpyFromUserForDriver(char *dst, const char *src, SceSize maxlen);</source><br />
<br />
=== sceKernelProcStrncpyFromUserForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || not present<br />
|-<br />
| 1.50-3.60 || 0x75AAF178<br />
|}<br />
<br />
Temp name was sceKernelStrncpyUserForPidForDriver.<br />
<br />
<source lang="c">int sceKernelProcStrncpyFromUserForDriver(SceUID pid, char *dst, const char *src, SceSize maxlen);</source><br />
<br />
=== sceKernelStrncpyToUserForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || not present<br />
|-<br />
| 1.50-3.60 || 0x80BD6FEB<br />
|}<br />
<br />
Temp name was sceKernelStrncpyKernelToUserForDriver.<br />
<br />
<source lang="c">int sceKernelStrncpyToUserForDriver(char* dst, const char *src, SceSize maxlen);</source><br />
<br />
=== sceKernelProcStrncpyToUserForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || not present<br />
|-<br />
| 1.50-3.60 || 0xFED82F2D<br />
|}<br />
<br />
Temp name was sceKernelMemcpyKernelToUserForPidUncheckedForDriver.<br />
<br />
<source lang="c">int sceKernelProcStrncpyToUserForDriver(SceUID pid, char *dst, const char *src, SceSize maxlen);</source><br />
<br />
== SceSysmemForDebugger ==<br />
<br />
This library was removed on FW 1.80.<br />
<br />
=== sceKernelPhysicalAddressSpaceStartForDebugger ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0x6AE2188F<br />
|-<br />
| 1.691-3.60 || not present<br />
|}<br />
<br />
<source lang="C">int sceKernelPhysicalAddressSpaceStartForDebugger(void);</source><br />
<br />
=== sceKernelGetPhysicalAddressSpaceForDebugger ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0xE8905626<br />
|-<br />
| 1.691-3.60 || not present<br />
|}<br />
<br />
In FW 0.931, it calls sceKernelPhysicalAddressSpaceStartForDebugger.<br />
<br />
<source lang="C">void *sceKernelGetPhysicalAddressSpaceForDebugger(void);</source><br />
<br />
=== sceKernelIsAccessibleRangeProcForDebugger ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-1.692 || 0x01DFC193<br />
|-<br />
| 1.80-3.60 || not present. Exported as [[#sceKernelIsAccessibleRangeProcForDriver]].<br />
|}<br />
<br />
?Returns 0 on success (if is accessible range)?<br />
<br />
<source lang="C">int sceKernelIsAccessibleRangeProcForDebugger(SceUID pid, SceUInt32 mode, const void *pVA, SceSize size);</source><br />
<br />
=== sceKernelIsAccessibleRangeForDebugger ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-1.692 || 0xD027761F<br />
|-<br />
| 1.80-3.60 || not present. Exported as [[#sceKernelIsAccessibleRangeForDriver]].<br />
|}<br />
<br />
?Returns 0 on success (if is accessible range)?<br />
<br />
<source lang="C">int sceKernelIsAccessibleRangeForDebugger(SceUInt32 mode, const void *pVA, SceSize size);</source><br />
<br />
== SceSysmem ==<br />
<br />
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.<br />
<br />
=== sceKernelMapMemBlock ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-1.69 || 0x7B763A21<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
=== sceKernelRemapMemBlock ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-1.69 || 0x3B29E0F5<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
=== sceKernelPartialMapMemBlock ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || not present<br />
|-<br />
| 1.69 || 0xC0A59868<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
=== sceKernelUnmapMemBlock ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-1.69 || 0xEE30D976<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int sceKernelUnmapMemBlock(SceUID uid);</source><br />
<br />
=== sceKernelPartialUnmapMemBlock ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || not present<br />
|-<br />
| 1.69 || 0xCA99929B<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
=== sceKernelGetMemBlockInfoByRange ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || not present<br />
|-<br />
| 0.996-3.60 || 0x006F3DB4<br />
|}<br />
<br />
<source lang="c"><br />
/**<br />
* @brief Get memory block informaton by virtual address range<br />
<br />
* @param[in] vbase base address<br />
* @param[in] vsize size<br />
* @param[inout] pInfo information structure<br />
*/<br />
int sceKernelGetMemBlockInfoByRange(void *vbase, SceSize vsize, SceKernelMemBlockInfo *pInfo);<br />
</source><br />
<br />
=== sceKernelGetMemBlockInfoByAddr ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x4010AD65<br />
|}<br />
<br />
<source lang="c"><br />
/**<br />
* @brief Get memory block information.<br />
*<br />
* Get information about a memory block.<br />
* @param[in] vbase Base address<br />
* @param[inout] pInfo Information structure<br />
*/<br />
int sceKernelGetMemBlockInfoByAddr(void *vbase, SceKernelMemBlockInfo *pInfo);<br />
</source><br />
<br />
=== sceKernelGetSubbudgetInfo ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || not present<br />
|-<br />
| 1.69-3.60 || 0x832B4A65<br />
|}<br />
<br />
<source lang="c"><br />
#define SCE_KERNEL_SUBBUDGET_ID_MAIN (0)<br />
#define SCE_KERNEL_SUBBUDGET_ID_CDLG (1)<br />
<br />
typedef struct SceKernelSubbudgetInfo { // size is 0xC on FW 3.60<br />
int size; // Size of this structure<br />
SceUInt32 totalSize;<br />
SceUInt32 freeSize;<br />
} SceKernelSubbudgetInfo;<br />
<br />
/**<br />
* Get the subbudget info<br />
*<br />
* @param[in] subbudget - The subbudget ID <br />
* @param[out] pInfo - The subbudget info<br />
*<br />
* @return 0 on success, < 0 on error.<br />
*/<br />
int sceKernelGetSubbudgetInfo(SceInt subbudget, SceKernelSubbudgetInfo *pInfo);<br />
</source><br />
<br />
=== sceKernelGetFreeMemorySize ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x87CC580B<br />
|}<br />
<br />
<source lang="C"><br />
/**<br />
* Get free memory size<br />
*/<br />
int sceKernelGetFreeMemorySize(SceKernelFreeMemorySizeInfo *info);<br />
</source><br />
<br />
=== sceKernelOpenMemBlock ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x8EB8DFBB<br />
|}<br />
<br />
<source lang="c"><br />
// on FW <= 1.691, flags is not used<br />
SceUID sceKernelOpenMemBlock(const char *name, int flags);<br />
</source><br />
<br />
=== sceKernelFindMemBlockByAddr ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xA33B99D1<br />
|}<br />
<br />
<source lang="c"><br />
/**<br />
* Find memory block by virtual range (base address and size)<br />
* If size == 0, API returns a memory block which contains 'start'<br />
* If size > 0, API returns a memory block just fit range [start, start + size].<br />
* @param[in] vaddr base address<br />
* @param[in] size address size<br />
* @retval >=SCE_OK block id<br />
* @retval <SCE_OK error<br />
*/<br />
SceUID sceKernelFindMemBlockByAddr(void *vaddr, SceSize size);<br />
</source><br />
<br />
=== sceKernelFreeMemBlock ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xA91E15EE<br />
|}<br />
<br />
<source lang="c"><br />
/**<br />
* Free memory block.<br />
*<br />
* @param[in] uid block uid<br />
* @retval SCE_OK Success<br />
* @retval <SCE_OK Error code<br />
*/<br />
int sceKernelFreeMemBlock(SceUID uid);<br />
</source><br />
<br />
=== sceKernelFreeMemBlockForVM ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x4EA13FEA<br />
|}<br />
<br />
<source lang="c">int sceKernelFreeMemBlockForVM(SceUID uid);</source><br />
<br />
=== sceKernelCloseMemBlock ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xB680E3A0<br />
|}<br />
<br />
<source lang="c">int sceKernelCloseMemBlock(SceUID uid);</source><br />
<br />
=== sceKernelGetMemBlockBase ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.996-3.60 || 0xB8EF5818<br />
|}<br />
<br />
<source lang="C"><br />
/**<br />
* @brief Get mapped base address of memory block.<br />
*<br />
* Get base address of memory block.<br />
* @param[in] uid block id<br />
* @param[out] ppBase base address of memory block<br />
* @retval SCE_OK success<br />
* @retval <SCE_OK Error<br />
*/<br />
int sceKernelGetMemBlockBase(SceUID uid, void **ppBase);<br />
</source><br />
<br />
=== sceKernelAllocMemBlock ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xB9D5EBDE<br />
|}<br />
<br />
<source lang="c"><br />
/**<br />
* Reserve a new memory block.<br />
*<br />
* The memory types that can be specified for type are as follows.<br />
* - SCE_KERNEL_MEMBLOCK_TYPE_USER_RW<br />
* - SCE_KERNEL_MEMBLOCK_TYPE_USER_RW_UNCACHE<br />
* - SCE_KERNEL_MEMBLOCK_TYPE_USER_MAIN_PHYCONT_RW<br />
* - SCE_KERNEL_MEMBLOCK_TYPE_USER_MAIN_PHYCONT_NC_RW<br />
* - SCE_KERNEL_MEMBLOCK_TYPE_USER_CDRAM_RW<br />
*<br />
* Allocate a memory block.<br />
*<br />
* @param[in] name Memory block name<br />
* @param[in] vsize Memory block virtual size<br />
* @param[in] flags Options<br />
* @retval id UID of memory block<br />
* @retval <SCE_OK Error code<br />
*/<br />
SceUID sceKernelAllocMemBlock(const char *name, SceKernelMemBlockType type, SceSize vsize, const struct SceKernelAllocMemBlockOpt *pOpt);<br />
</source><br />
<br />
=== sceKernelAllocUnmapMemBlock ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xEC636BCB<br />
|}<br />
<br />
<source lang="c">int sceKernelAllocUnmapMemBlock(char *name, SceSize size);</source><br />
<br />
=== sceKernelOpenVMDomain ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x9CA3EB2B<br />
|}<br />
<br />
<source lang="c">int sceKernelOpenVMDomain();</source><br />
<br />
=== sceKernelSyncVMDomain ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x19D2A81A<br />
|}<br />
<br />
<source lang="c">int sceKernelSyncVMDomain(SceUID uid, void *data, SceSize size);</source><br />
<br />
=== sceKernelCloseVMDomain ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0xD6CA56CA<br />
|}<br />
<br />
<source lang="c">int sceKernelCloseVMDomain();</source><br />
<br />
=== sceKernelAllocMemBlockForVM ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0xE2D7E137<br />
|}<br />
<br />
<source lang="c">SceUID sceKernelAllocMemBlockForVM(const char *name, SceSize vsize);</source><br />
<br />
=== sceKernelCheckModelCapability ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.12 || not present<br />
|-<br />
| 2.500.071-3.570.011 || 0x0144FBD9<br />
|}<br />
<br />
Only bits 7 and 10 are supported.<br />
<br />
Returns 0x80020005 if <code>bit</code> is not supported.<br />
<br />
On success, returns SCE_TRUE if the model has capability, else SCE_FALSE.<br />
<br />
<source lang="c">int sceKernelCheckModelCapability(int bit);</source><br />
<br />
=== sceKernelGetModelForCDialog ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xA2CB322F<br />
|}<br />
<br />
<source lang="c">int sceKernelGetModelForCDialog();</source><br />
<br />
=== sceKernelGetModel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xD0D4F729<br />
|}<br />
<br />
<source lang="c">int sceKernelGetModel();</source><br />
<br />
=== sceKernelIsPSVitaTV ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x1453A5E5<br />
|}<br />
<br />
<source lang="c">int sceKernelIsPSVitaTV();</source><br />
<br />
== SceDipsw ==<br />
<br />
=== sceKernelCheckDipsw ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x1C783FB2<br />
|}<br />
<br />
=== sceKernelClearDipsw ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x800EDCC1<br />
|}<br />
<br />
=== sceKernelSetDipsw ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x817053D4<br />
|}<br />
<br />
== SceDipswForDriver ==<br />
<br />
=== sceKernelCheckDipswForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xA98FC2FD<br />
|}<br />
<br />
<source lang="C">int sceKernelCheckDipswForDriver(int no);</source><br />
<br />
=== sceKernelClearDipswForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xF1F3E9FE<br />
|}<br />
<br />
<source lang="C">void sceKernelClearDipswForDriver(int no);</source><br />
<br />
=== sceKernelSetDipswForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x82E45FBF<br />
|}<br />
<br />
<source lang="C">void sceKernelSetDipswForDriver(int no);</source><br />
<br />
=== sceKernelGetDipswInfoForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.800.071-3.740.011 || 0xB2AD48BE<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
All it does is:<br />
<source lang="C">return *(int *)(dipsw_addr + 4 * info_id);</source><br />
<br />
info_id possible values:<br />
* 0: CP timestamp 1<br />
* 1: CP Version, CP Board ID<br />
* 2: CP timestamp 2<br />
* 3: ASLR Seed<br />
<br />
See [[KBL Param#DIP Switches]].<br />
<br />
<source lang="C">int sceKernelGetDipswInfoForDriver(SceUInt32 info_id);</source><br />
<br />
== SceUartForKernel ==<br />
<br />
=== sceKernelUartChStartForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0xA9C74212<br />
|}<br />
<br />
Temp name was sceKernelUartInitForKernel, sceUartInitForKernel.<br />
<br />
It initializes the clock generator registers for the UART <code>channel</code>. See [[UART Registers]]. The default baud rate is 115200 for channels 0-5 and 250000 for channel 6.<br />
<br />
<source lang="C"><br />
// channel: 0-6<br />
int sceKernelUartChStartForKernel(SceUInt32 channel);<br />
</source><br />
<br />
=== sceKernelUartReadAvailableForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || not present<br />
|-<br />
| 3.60 || 0x38DB7629<br />
|}<br />
<br />
Temp name was sceUartReadAvailableForKernel.<br />
<br />
Returns the number of words available to read from the read FIFO.<br />
<br />
<source lang="c">int sceKernelUartReadAvailableForKernel(int channel);</source><br />
<br />
=== sceKernelUartReadForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x9BBF1255<br />
|}<br />
<br />
Temp name was sceUartReadForKernel.<br />
<br />
<source lang="c">int sceKernelUartReadForKernel(int channel);</source><br />
<br />
=== sceKernelUartWriteForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x41973874<br />
|}<br />
<br />
Temp name was sceUartWriteForKernel.<br />
<br />
<source lang="c">int sceKernelUartWriteForKernel(int channel, char c);</source><br />
<br />
=== sceKernelUartPutcharForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || 0xAF243C6A<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="c">int sceKernelUartPutcharForKernel(char c);</source><br />
<br />
== SceCpu ==<br />
<br />
=== sceKernelCpuId ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.000.071-3.740.011 || 0x2704CFEE<br />
|}<br />
<br />
Returns the CPU ID of the current core.<br />
<br />
<source lang="c">SceUInt sceKernelCpuId(void);</source><br />
<br />
== SceCpuForKernel ==<br />
<br />
=== sceKernelSendEventForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || 0x45885327<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">void sceKernelSendEventForKernel(void);</source><br />
<br />
=== sceKernelWaitForEventForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0xD2629465<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">void sceKernelWaitForEventForKernel(void);</source><br />
<br />
=== sceKernelPrintCpuModeForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0xDC99515C<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
=== sceKernelTlsKernelSetForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940 || 0x7A180AA4<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C"><br />
// thread_index must be < 8<br />
void *sceKernelTlsKernelSetForKernel(SceUInt32 thread_index, void *tls);<br />
</source><br />
<br />
=== sceKernelTlsKernelGetForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940 || 0x28E080BC<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C"><br />
// thread_index must be < 8<br />
void *sceKernelTlsKernelGetForKernel(SceUInt32 thread_index);<br />
</source><br />
<br />
=== sceKernelRoundupDCacheLineForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || 0xED512F50<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
Calls the function previously registered by [[SceSysmem#sceKernelSetRoundupDCacheLineFuncForKernel]].<br />
<br />
<source lang="C">int sceKernelRoundupDCacheLineForKernel(int a1);</source><br />
<br />
=== sceKernelSetRoundupDCacheLineFuncForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || 0x66C3AA93<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
Uses CTR and CTR-DMINLINE to determine which function to return.<br />
<br />
<source lang="C">(int sceKernelRoundupDCacheLineForKernel(int) *) sceKernelSetRoundupDCacheLineFuncForKernel(void);</source><br />
<br />
=== sceKernelReadUser8ForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || 0x942B92C3<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int sceKernelReadUser8ForKernel(uint8_t *dest, uint8_t *psrc);</source><br />
<br />
=== sceKernelReadUser16ForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || maybe present<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int sceKernelReadUser16ForKernel(uint16_t *dest, uint16_t *psrc);</source><br />
<br />
=== sceKernelReadUser32ForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || 0x6091086F<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int sceKernelReadUser32ForKernel(uint32_t *dest, uint32_t *psrc);</source><br />
<br />
=== sceKernelWriteUser8ForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || 0x13B7B151<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int sceKernelWriteUser8ForKernel(uint8_t *dest, uint8_t val);</source><br />
<br />
=== sceKernelWriteUser16ForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || maybe present<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int sceKernelWriteUser16ForKernel(uint16_t *dest, uint16_t val);</source><br />
<br />
=== sceKernelWriteUser32ForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || 0x101894E0<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int sceKernelWriteUser32ForKernel(uint32_t *dest, uint32_t val);</source><br />
<br />
=== sceKernelVMRead8ForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || 0xA2F0FE9D<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int sceKernelVMRead8ForKernel(uint8_t *dest, uint8_t *psrc);</source><br />
<br />
=== sceKernelVMRead16ForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || 0xF31D4D10<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int sceKernelVMRead16ForKernel(uint16_t *dest, uint16_t *psrc);</source><br />
<br />
=== sceKernelVMRead32ForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || 0x316574B1<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int sceKernelVMRead32ForKernel(uint32_t *dest, uint32_t *psrc);</source><br />
<br />
=== sceKernelVMWrite8ForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0xA3C65664<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int sceKernelVMWrite8ForKernel(uint8_t *dest, uint8_t val);</source><br />
<br />
=== sceKernelVMWrite16ForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0xBF38A460<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int sceKernelVMWrite16ForKernel(uint16_t *dest, uint16_t val);</source><br />
<br />
=== sceKernelVMWrite32ForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0x04D129B2<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int sceKernelVMWrite32ForKernel(uint32_t *dest, uint32_t val);</source><br />
<br />
=== sceKernelMMUIsValidMapForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0x4891F923<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int sceKernelMMUIsValidMapForKernel(SceKernelMMUContext *context, const void *vbase, SceSize size, const void *pbase);</source><br />
<br />
=== sceKernelMMUIsValidUnmapForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0x60EA8433<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int sceKernelMMUIsValidUnmapForKernel(SceKernelMMUContext *context, const void *vbase, SceSize size);</source><br />
<br />
=== sceKernelMMUL1GetInfoForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || 0x9D346F87<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
Parses a L1PT for information about a specific entry. Pass the address of the L1PT in <code>l1pt</code>. Used by [[SceSysmem#sceKernelAddressSpaceGetMMUL1InfoForKernel|sceKernelAddressSpaceGetMMUL1InfoForKernel]].<br />
<br />
<source lang="C">SceInt32 sceKernelMMUL1GetInfoForKernel(void* l1pt, const void *addr, SceKernelMMUL1Info *pInfo);</source><br />
<br />
=== sceKernelMMUL2GetInfoForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || 0x247629A7<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int sceKernelMMUL2GetInfoForKernel(int a1, void *addr, void *pInfo);</source><br />
<br />
=== sceKernelMMUMapSectionsForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || 0x868B471A<br />
|-<br />
| 3.60 || not present<br />
|-<br />
| 3.65 || Present, but not exported<br />
|}<br />
<br />
<source lang="C">SceInt32 sceKernelMMUMapSectionsForKernel(const void *ttbr, SceKernelMemoryType code, SceUInt32 domain, void *vaddr, SceSize vsize, void *paddr);</source><br />
<br />
=== sceKernelMMUMapSupersectionsForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || 0x0D9DA15F<br />
|-<br />
| 3.60 || not present<br />
|-<br />
| 3.65 || Present, but not exported<br />
|}<br />
<br />
<source lang="C">SceInt32 sceKernelMMUMapSupersectionsForKernel(const void *ttbr, SceKernelMemoryType code, SceUInt32 domain, void *vaddr, SceSize vsize, void *paddr);</source><br />
<br />
=== sceKernelMMUMapSmallPagesForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || 0xB953E022<br />
|-<br />
| 3.60 || not present<br />
|-<br />
| 3.65 || Present, but not exported<br />
|}<br />
<br />
<source lang="C">int sceKernelMMUMapSmallPagesForKernel(const void *table, SceKernelMemoryType code, void *vbase, SceUInt32 voffset, SceSize vsize, void *paddr);</source><br />
<br />
=== sceKernelMMUMapSmallPageForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || 0xCC7C16F8<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int sceKernelMMUMapSmallPageForKernel(const void *table, SceKernelMemoryType code, void *vbase, SceUInt32 voffset, void *paddr);</source><br />
<br />
=== sceKernelMMUMapLargePagesForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || 0x78D32D38<br />
|-<br />
| 3.60 || not present<br />
|-<br />
| 3.65 || Present, but not exported<br />
|}<br />
<br />
<source lang="C">int sceKernelMMUMapLargePagesForKernel(const void *table, SceKernelMemoryType code, void *vbase, SceUInt32 voffset, SceSize vsize, void *paddr);</source><br />
<br />
=== sceKernelMMUUnmapSectionsWithFlagsForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || 0xFC657FD1<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int sceKernelMMUUnmapSectionsWithFlagsForKernel(const void *table, uint32_t maybe_ttbr0, void *vbase, SceSize vsize, SceUInt32 flags);</source><br />
<br />
=== sceKernelMMUUnmapSupersectionsWithFlagsForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || 0x0E4D29C6<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int sceKernelMMUUnmapSupersectionsWithFlagsForKernel(const void *table, uint32_t maybe_ttbr0, void *vbase, SceSize vsize, SceUInt32 flags);</source><br />
<br />
=== sceKernelMMUUnmapSmallPagesWithFlagsForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || 0x11EBA8CE<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int sceKernelMMUUnmapSmallPagesWithFlagsForKernel(const void *table, uint32_t maybe_ttbr0, void *vbase, SceUInt32 voffset, SceSize vsize, SceUInt32 flags);</source><br />
<br />
=== sceKernelMMUUnmapLargePagesWithFlagsForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || 0x44319918<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int sceKernelMMUUnmapLargePagesWithFlagsForKernel(const void *table, uint32_t maybe_ttbr0, void *vbase, SceUInt32 voffset, SceSize vsize, SceUInt32 flags);</source><br />
<br />
=== sceKernelMMUL1VAtoPABySWForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || 0x8E4ECF17<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int sceKernelMMUL1VAtoPABySWForKernel(const void *table, void *pVA, void **pPA);</source><br />
<br />
=== sceKernelMMUSetL2PageTableForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || 0xAECA0820<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int sceKernelMMUSetL2PageTableForKernel(const void *ttbr, const void *map, const void *pbase);</source><br />
<br />
=== sceKernelMMUUnsetL2PageTableForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || 0xCB519DF3<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int sceKernelMMUUnsetL2PageTableForKernel(const void *ttbr, const void *PTE);</source><br />
<br />
=== SceCpuForKernel_CA4124DE ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || 0xCA4124DE<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
Returns 1, 2 or 6 based on some page/section properties.<br />
<br />
<source lang="C">int SceCpuForKernel_CA4124DE(const void *table, void *pVA, void **pPA);</source><br />
<br />
=== sceKernelMMUGetContextForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0x211B89DA<br />
|-<br />
| 1.03-3.60 || not present<br />
|}<br />
<br />
Temp name was sceKernelCpuSaveContextForKernel.<br />
<br />
<source lang="C">int sceKernelMMUGetContextForKernel(SceKernelMMUContext *context);</source><br />
<br />
=== sceKernelMMUChangeContextForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0x0A4F0FB9<br />
|-<br />
| 1.03-3.60 || not present<br />
|}<br />
<br />
Temp name was sceKernelCpuRestoreContextForKernel.<br />
<br />
<source lang="C">int sceKernelMMUChangeContextForKernel(SceKernelMMUContext *context);</source><br />
<br />
=== sceKernelMMUVAtoPAWithModeForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x67343A07<br />
|}<br />
<br />
Temp name was sceKernelCpuGetPaddrWithMaskForKernel.<br />
<br />
mode (maskPAR) is usually 0x33, sometimes 2.<br />
<br />
<source lang="c">int sceKernelMMUVAtoPAWithModeForKernel(int mode, void *pVA, void **ppPA);</source><br />
<br />
=== sceKernelMMUCheckRangeWithModeForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0xCCDA3B8C<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
Return 0 if all pages are valid, < 0 else.<br />
<br />
<source lang="C">int sceKernelMMUCheckRangeWithModeForKernel(int mode, void *start, SceSize size);</source><br />
<br />
=== sceKernelMMUVAtoPAForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x2A46E800<br />
|}<br />
<br />
Temp name was sceKernelCpuGetPaddrForKernel.<br />
<br />
Uses mode (maskPAR) 0x33.<br />
<br />
This will write the physical address for a virtual address <code>pVA</code> to memory pointed to by <code>pPA</code>.<br />
<br />
Returns <0 on error, values >=0 indicate success.<br />
<br />
<source lang="c">int sceKernelMMUVAtoPAForKernel(void *pVA, void **pPA);</source><br />
<br />
=== sceKernelCpuGetCONTEXTIDRForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x5B6B3274<br />
|}<br />
<br />
<source lang="C"><br />
return (SceUInt8)__mrc(15, 0, 13, 0, 1); // Read CONTEXTIDR (Context ID Register)<br />
</source><br />
<br />
<source lang="C">SceUInt8 sceKernelCpuGetCONTEXTIDRForKernel(void);</source><br />
<br />
=== sceKernelCpuUpdateSCTLRForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x04008CF7<br />
|}<br />
<br />
<source lang="C"><br />
int result;<br />
result = __mrc(15, 0, 1, 0, 0) | 0x1806; // Read SCTLR (System Control Register)<br />
__mcr(15, 0, result, 1, 0, 0); // Write SCTLR (System Control Register)<br />
return result;<br />
</source><br />
<br />
<source lang="C">void sceKernelCpuUpdateSCTLRForKernel(void); // SCTLR (System Control Register)</source><br />
<br />
=== sceKernelCpuBranchPredictorInvalidateAllISForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x1BB2BB8D<br />
|}<br />
<source lang="C">void sceKernelCpuBranchPredictorInvalidateAllISForKernel(void); // BPIALLIS, Branch predictor invalidate all (IS)</source><br />
<br />
=== sceKernelCpuBranchPredictorInvalidateAllForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x4C4C7D6B<br />
|}<br />
<source lang="C">void sceKernelCpuBranchPredictorInvalidateAllForKernel(void); // BPIALL, Branch predictor invalidate all</source><br />
<br />
=== sceKernelDcacheCleanInvalidateAllForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || 0x85A27F98<br />
|}<br />
<br />
Flushes PLE then cleans and invalidates L1 Dcache and L2 cache in this order.<br />
<br />
<source lang="C">void sceKernelDcacheCleanInvalidateAllForKernel(void);</source><br />
<br />
=== sceKernelL1DcacheInvalidateForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x470EAE1E<br />
|}<br />
<br />
Temp name was sceKernelCpuDcacheInvalidateMVACForKernel.<br />
<br />
<source lang="C">void sceKernelL1DcacheInvalidateForKernel(void* addr); // DCIMVAC, Data cache invalidate by MVA (PoC)</source><br />
<br />
=== sceKernelL1DcacheInvalidateRangeForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x583F30D1<br />
|}<br />
<br />
This is a guessed name. Temp name was sceKernelCpuDcacheInvalidateMVACRangeForKernel.<br />
<br />
<source lang="C">void sceKernelL1DcacheInvalidateRangeForKernel(void *addr, unsigned int size); // DCIMVAC, Data cache invalidate by MVA (PoC)</source><br />
<br />
=== sceKernelL1DcacheCleanInvalidateRangeForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x6BA2E51C<br />
|}<br />
<br />
This is a guessed name. Temp name was sceKernelCpuDcacheCleanInvalidateMVACRangeForKernel, sceKernelCpuDcacheWritebackInvalidateRangeForKernel, sceKernelDcacheWritebackInvalidateRangeForKernel.<br />
<br />
<source lang="C"><br />
// DCCIMVAC, Data cache clean and invalidate by MVA (PoC)<br />
void sceKernelL1DcacheCleanInvalidateRangeForKernel(const void *addr, unsigned int size);<br />
</source><br />
<br />
=== sceKernelL1DcacheInvalidateAllForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x2F3BF020<br />
|}<br />
<br />
This is a guessed name. Temp name was sceKernelCpuDcacheInvalidateSWForKernel.<br />
<br />
<source lang="C">void sceKernelL1DcacheInvalidateAllForKernel(void); // DCISW, Data cache invalidate by set/way (all the cache)</source><br />
<br />
=== sceKernelL1DcacheCleanAllForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x73A30DB2<br />
|}<br />
<br />
This is a guessed name. Temp name was sceKernelCpuDcacheCleanSWForKernel.<br />
<br />
<source lang="C">void sceKernelL1DcacheCleanAllForKernel(void); // DCCSW, Data cache clean by set/way (all the cache)</source><br />
<br />
=== sceKernelL1DcacheCleanInvalidateAllForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x76DAB4D0<br />
|}<br />
<br />
Guessed name was sceKernelCpuDcacheCleanInvalidateSWForKernel.<br />
<br />
<source lang="C">void sceKernelL1DcacheCleanInvalidateAllForKernel(void);</source><br />
<br />
=== sceKernelL1DcacheCleanForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xF7159B55<br />
|}<br />
<br />
Temp name was sceKernelCpuDcacheCleanMVACForKernel.<br />
<br />
<source lang="C">void sceKernelL1DcacheCleanForKernel(void* addr); // DCCMVAC, Data cache clean by MVA (PoC)</source><br />
<br />
=== sceKernelL1DcacheCleanRangeForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0xC5C1EE4E<br />
|}<br />
<br />
Guessed name was sceKernelCpuDcacheCleanMVACRangeForKernel.<br />
<br />
<source lang="C">void sceKernelL1DcacheCleanRangeForKernel(void *addr, unsigned int size); // DCCMVAC, Data cache clean by MVA (PoC)</source><br />
<br />
=== sceKernelL1DcacheCleanInvalidateForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xC8E8C9E9<br />
|}<br />
<br />
This is a guessed name. Temp name was sceKernelCpuDcacheCleanInvalidateMVACForKernel.<br />
<br />
<source lang="C">void sceKernelL1DcacheCleanInvalidateForKernel(void *start); // DCCIMVAC, Data cache clean and invalidate by MVA (PoC)</source><br />
<br />
=== sceKernelL1IcacheInvalidateEntireAllCoreForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x264DA250<br />
|-<br />
| 3.65 || 0x803C84BF<br />
|}<br />
<br />
Guessed name was sceKernelCpuIcacheInvalidateAllUISForKernel.<br />
<br />
Invalidates the L1 Icache for all cores.<br />
<br />
<source lang="C">void sceKernelL1IcacheInvalidateEntireAllCoreForKernel(void);</source><br />
<br />
=== sceKernelL1IcacheInvalidateEntireForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xAEE0B489<br />
|}<br />
<br />
This is a guessed name. Temp name was sceKernelCpuIcacheInvalidateAllUForKernel.<br />
<br />
Invalidates the entire L1 Icache of this core.<br />
<br />
<source lang="C">void sceKernelL1IcacheInvalidateEntireForKernel(void); // ICIALLU, Instruction cache invalidate all (PoU)</source><br />
<br />
=== sceKernelL1IcacheInvalidateRangeForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0xF4C7F578<br />
|}<br />
<br />
Temp name was sceKernelCpuIcacheInvalidateRangeForKernel, sceKernelCpuIcacheInvalidateMVAURange.<br />
<br />
Invalidates a range in L1 Icache of this core.<br />
<br />
<source lang="C"><br />
// ICIMVAU, Instruction cache invalidate by MVA (PoU)<br />
void sceKernelL1IcacheInvalidateRangeForKernel(void *start, SceSize size);<br />
</source><br />
<br />
=== sceKernelIcacheInvalidateRangeForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x19F17BD0<br />
|-<br />
| 3.65-3.68 || 0x73E895EA<br />
|}<br />
<br />
Temp name was sceKernelCpuIcacheAndL2InvalidateMVAURangeForKernel, sceKernelCpuIcacheAndL2WritebackInvalidateRangeForKernel.<br />
<br />
Cleans and invalidates range in L2 cache, then in L1 Icache of core.<br />
<br />
<source lang="c">int sceKernelIcacheInvalidateRangeForKernel(void *start, SceSize size);</source><br />
<br />
=== sceKernelPleFlushRequestForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xD0D85FF8<br />
|}<br />
<br />
Temp name was sceKernelCpuPreloadEngineKillForKernel.<br />
<br />
*NSACR (Non-Secure Access Control Register)<br />
*Test bit NS access to the Preload Engine resources<br />
*[>] PLEFF (Preload Engine FIFO flush operation)<br />
*[>] PLEKC (Preload Engine kill channel operation)<br />
*[<] PLEASR (Preload Engine Activity Status Register)<br />
<br />
<source lang="c">void sceKernelPleFlushRequestForKernel(void);</source><br />
<br />
=== sceKernelDomainTextMemcpyForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x8C683DEC<br />
|-<br />
| 3.63-3.65 || not present. Removed from library.<br />
|}<br />
<br />
Temp name was sceKernelCpuUnrestrictedMemcpyForKernel.<br />
<br />
Unrestricted memcpy by first setting the <code>DACR</code> register to <code>0xFFFF0000</code> then doing a memcpy.<br />
<br />
In FW 0.931, <code>DACR</code> is set to <code>0xFFFFFFFF</code> instead and interrupts are disabled for the operation.<br />
<br />
<source lang="c">int sceKernelDomainTextMemcpyForKernel(void *dest, const void *src, SceSize len);</source><br />
<br />
=== sceKernelMMUGetMemoryTypeForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x9B8173F4<br />
|}<br />
<br />
Return value can be:<br />
* 2<br />
* 8<br />
* 0x40<br />
* 0x80<br />
* 0xD0<br />
* 0x80022007 (SCE_KERNEL_ERROR_VA2PA_FAULT)<br />
<br />
<source lang="c">int sceKernelMMUGetMemoryTypeForKernel(void *vaddr);</source><br />
<br />
=== sceKernelCorelockUnlockForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xA5C9DBBA<br />
|}<br />
<br />
This is a guessed name. Temp name was sceKernelWaitCore3ForKernel.<br />
<br />
<source lang="c"><br />
typedef struct SceKernelCorelockContext {<br />
int lock;<br />
int16_t core_count;<br />
int16_t last_wait_core;<br />
} SceKernelCorelockContext;<br />
<br />
void sceKernelCorelockUnlockForKernel(SceKernelCorelockContext *pCtx);<br />
</source><br />
<br />
=== sceKernelCorelockLockForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x9D72DD1B<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="c">void sceKernelCorelockLockForKernel(SceKernelCorelockContext *pCtx, int core);</source><br />
<br />
=== sceKernelCorelockInitializeForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x4CD4D921<br />
|-<br />
| 3.65 || 0xA65F6F14<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">void sceKernelCorelockInitializeForKernel(SceKernelCorelockContext *pCtx);</source><br />
<br />
=== SceCpuForKernel_43CC6E20 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x43CC6E20<br />
|}<br />
<br />
DACR off<br />
<br />
Does some memory copies between the args.<br />
<br />
<source lang="c">int SceCpuForKernel_43CC6E20(void *addr, int a2, int a3, int a4);</source><br />
<br />
=== sceKernelDomainTextBzeroIntForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x76EB0DD4<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Temp name was sceCpuUnrestrictedBzeroIntForKernel.<br />
<br />
DACR off<br />
<br />
<source lang="c">int sceKernelDomainTextBzeroIntForKernel(int *addr);</source><br />
<br />
=== SceCpuForKernel_337473B5 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x337473B5<br />
|}<br />
<br />
DACR off<br />
<br />
If addr.unk_0 equals 0, changes addr.unk_0 to new_val, else increase addr.unk_4.<br />
<br />
<source lang="C">int SceCpuForKernel_337473B5(CpuUnkStruct *addr, unsigned int new_val);</source><br />
<br />
=== sceKernelAtomicSubIfGreater64ForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x37FBFD12<br />
|}<br />
<br />
DACR is not disabled<br />
<br />
<source lang="C">int sceKernelAtomicSubIfGreater64ForKernel(unsigned long long *a1, unsigned int a2);</source><br />
<br />
=== sceKernelAtomicLimit64ForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x6190A018<br />
|}<br />
<br />
DACR is not disabled<br />
<br />
<source lang="C">int sceKernelAtomicLimit64ForKernel(unsigned long long *result, int limit);</source><br />
<br />
=== sceKernelAtomicAdd32AndGet64InRangeForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xD8A7216C<br />
|}<br />
<br />
DACR is not disabled<br />
<br />
<source lang="C">int sceKernelAtomicAdd32AndGet64InRangeForKernel(unsigned long long *val, int add_val, int limit);</source><br />
<br />
=== sceKernelAtomicAdd32AndGet64InHiLoRangeForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xD37AABE5<br />
|}<br />
<br />
DACR is not disabled<br />
<br />
<source lang="C">int sceKernelAtomicAdd32AndGet64InHiLoRangeForKernel(unsigned long long *val, int add_val, int limit);</source><br />
<br />
=== sceKernelAtomicGet32AndSet64ForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || not present<br />
|-<br />
| 3.60 || 0x4553FBDE<br />
|}<br />
<br />
DACR is not disabled<br />
<br />
<source lang="c">int sceKernelAtomicGet32AndSet64ForKernel(unsigned long long *result, int src);</source><br />
<br />
=== sceKernelAtomicGet32AndSet64_2ForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || not present<br />
|-<br />
| 3.60 || 0x7FB4E7AC<br />
|}<br />
<br />
Exact same code as SceCpuForKernel_4553FBDE.<br />
<br />
DACR is not disabled<br />
<br />
<source lang="c">int sceKernelAtomicGet32AndSet64_2ForKernel(unsigned long long *result, int src);</source><br />
<br />
=== sceKernelAtomicDecIfLowPositive32ForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x8510FA52<br />
|}<br />
<br />
DACR is not disabled<br />
<br />
<source lang="c">int sceKernelAtomicDecIfLowPositive32ForKernel(unsigned int *addr);</source><br />
<br />
=== sceKernelAtomicIncrementHighwaterCounterForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.610.011 || 0x5F64E5ED<br />
|-<br />
| 3.630.011-3.740.011 || 0x9DA58A9E<br />
|}<br />
<br />
This is a guessed name. Temp name was sceKernelCpuAtomicHiLoAlgorithmForKernel.<br />
<br />
Atomically increments a highwater counter.<br />
<br />
Highwater counters are 32-bit values holding a <code>current</code> count in the low 16 bits, and a <code>highwater</code> count in the high 16 bits.<br />
<br />
This routine increments the <code>current</code> count, and the <code>highwater</code> count if the new <code>current</code> value is higher than <code>highwater</code>.<br />
<br />
DACR is not disabled.<br />
<br />
Returns the value of the counter after the increment.<br />
<br />
<source lang="C">SceUInt32 sceKernelAtomicIncrementHighwaterCounterForKernel(SceUInt32 *pCounter);</source><br />
<br />
=== sceKernelAtomicAddAndGetPositive32InRangeForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.100.081-3.610.011 || 0x98E91C1C<br />
|-<br />
| 3.630.011-3.740.011 || 0x8F40D0FD<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
DACR is not disabled<br />
<br />
If val is negative, returns 2 and does not override val.<br />
<br />
<source lang="C">int sceKernelAtomicAddAndGetPositive32InRangeForKernel(int* val, int add_val, int limit);</source><br />
<br />
=== SceCpuForKernel_6C7E7B57 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x6C7E7B57<br />
|}<br />
<br />
Set TTBR lower value (0x4A).<br />
<br />
<source lang="c">int SceCpuForKernel_6C7E7B57(uintptr_t ttbr);</source><br />
<br />
=== SceCpuForKernel_AED8F8D7 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0xAED8F8D7<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
Initialize TTBR.<br />
<br />
<source lang="C">int SceCpuForKernel_AED8F8D7(const void *ttbr);</source><br />
<br />
=== sceKernelGetVmaccessRangeForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.610.011 || 0x9A3281C0<br />
|-<br />
| 3.630.011-3.740.011 || 0xC32687D0<br />
|}<br />
<br />
Returns the start and end address of the Virtual Memory access range. Functions such as [[SceSysmem#sceKernelCopyFromUserForDriver|sceKernelCopyFromUserForDriver]] (i.e. kernel<->usermode transfer routines) are located in this range. All functions in the Virtual Memory access range run in ARM mode not in Thumb mode.<br />
<br />
See [[SceExcpmgr|the SceExcpmgr page]] for more information about how the values returned by this function are used.<br />
<br />
Note that the Virtual Memory access range excludes the endpoint. <code>*pRangeEnd</code> is not considered part of the range however <code>*pRangeStart</code> is.<br />
<br />
<source lang="C"><br />
// 0.931.010<br />
void sceKernelGetVmaccessRangeForKernel(SceUIntPtr *pRangeStart, SceUIntPtr *pRangeEnd);<br />
<br />
// 0.940-0.990<br />
void sceKernelGetVmaccessRangeForKernel(SceUIntPtr *pOldModelRangeStart, SceUIntPtr *pOldModelRangeEnd, SceUIntPtr *pNewModelRangeStart, SceUIntPtr *pNewModelRangeEnd)<br />
<br />
// 3.600.011-3.740.011<br />
void sceKernelGetVmaccessRangeForKernel(SceUIntPtr *pRangeStart, SceUIntPtr *pRangeEnd);<br />
</source><br />
<br />
=== SceCpuForKernel_9CB82EB0 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x9CB82EB0<br />
|}<br />
<br />
<source lang="C"><br />
return;<br />
</source><br />
<br />
<source lang="c">int SceCpuForKernel_9CB82EB0(void);</source><br />
<br />
== SceCpuForDriver ==<br />
<br />
=== SceCpuForDriver_9A9D9C94 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-0.996.090 || 0x9A9D9C94<br />
|-<br />
| 1.03-3.740.011 || not present<br />
|}<br />
<br />
=== SceCpuForDriver_A2E3E4EB ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-0.996.090 || 0xA2E3E4EB<br />
|-<br />
| 1.03-3.740.011 || not present<br />
|}<br />
<br />
=== sceKernelRoundupDCacheLine3ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.060.031 || 0xF0849812<br />
|-<br />
| 1.50-3.740.011 || not present<br />
|}<br />
<br />
<source lang="C">int sceKernelRoundupDCacheLine3ForDriver(int a1);</source><br />
<br />
=== sceKernelAbortForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.060.031 || 0x6DCA6903<br />
|-<br />
| 1.50-3.740.011 || not present<br />
|}<br />
<br />
<source lang="C">void sceKernelAbortForDriver(void);</source><br />
<br />
=== sceKernelCpuIdForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x5E4D5DE1<br />
|}<br />
<br />
Returns the CPU ID of the current core.<br />
<br />
<source lang="c">int sceKernelCpuIdForDriver(void);</source><br />
<br />
=== sceKernelAtomicAddAndGet8ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x1E850481<br />
|}<br />
<br />
<source lang="c">unsigned char sceKernelAtomicAddAndGet8ForDriver (unsigned char *addr, unsigned char val);</source><br />
<br />
=== sceKernelAtomicAddAndGet16ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x59F74E94<br />
|}<br />
<br />
<source lang="c">unsigned short sceKernelAtomicAddAndGet16ForDriver(unsigned short *addr, unsigned short val);</source><br />
<br />
=== sceKernelAtomicAddAndGet32ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x5F6A8743<br />
|}<br />
<br />
Adds <code>val</code> to <code>*addr</code> atomically, and returns the result.<br />
<br />
<source lang="c">unsigned int sceKernelAtomicAddAndGet32ForDriver(unsigned int *addr, unsigned int val);</source><br />
<br />
=== sceKernelAtomicAddAndGet64ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x4E459A03<br />
|}<br />
<br />
<source lang="c">unsigned long long sceKernelAtomicAddAndGet64ForDriver(unsigned long long *addr, int unused, unsigned long long val);</source><br />
<br />
<hr><br />
<br />
=== sceKernelAtomicAddUnless8ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x5CC62CEC<br />
|}<br />
<br />
<source lang="c">int sceKernelAtomicAddUnless8ForDriver(unsigned char *addr, unsigned char val, unsigned char cmp);</source><br />
<br />
=== sceKernelAtomicAddUnless16ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x0F84AFE9<br />
|}<br />
<br />
<source lang="c">int sceKernelAtomicAddUnless16ForDriver(unsigned short *addr, unsigned short val, unsigned short cmp);</source><br />
<br />
=== sceKernelAtomicAddUnless32ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x1F157DC3<br />
|}<br />
<br />
<source lang="c">int sceKernelAtomicAddUnless32ForDriver(unsigned int *addr, unsigned int val, unsigned int cmp);</source><br />
<br />
=== sceKernelAtomicAddUnless64ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x06CCFA4B<br />
|}<br />
<br />
<source lang="c">int sceKernelAtomicAddUnless64ForDriver(unsigned long long *addr, int unused, unsigned long long val, unsigned long long cmp);</source><br />
<br />
<hr><br />
<br />
=== sceKernelAtomicAndAndGet8ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x32B62B1A<br />
|}<br />
<br />
<source lang="c">unsigned char sceKernelAtomicAndAndGet8ForDriver(unsigned char *addr, unsigned char val);</source><br />
<br />
=== sceKernelAtomicAndAndGet16ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xB281D52A<br />
|}<br />
<br />
<source lang="c">unsigned short sceKernelAtomicAndAndGet16ForDriver(unsigned short *addr, unsigned short val);</source><br />
<br />
=== sceKernelAtomicAndAndGet32ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xDF899E4B<br />
|}<br />
<br />
<source lang="c">unsigned int sceKernelAtomicAndAndGet32ForDriver(unsigned int *addr, unsigned int val);</source><br />
<br />
=== sceKernelAtomicAndAndGet64ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xD18E7B54<br />
|}<br />
<br />
<source lang="c">unsigned long long sceKernelAtomicAndAndGet64ForDriver(unsigned long long *addr, int unused, unsigned long long val);</source><br />
<br />
<hr><br />
<br />
=== sceKernelAtomicClearAndGet8ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x8E538AB5<br />
|}<br />
<br />
<source lang="c">unsigned char sceKernelAtomicClearAndGet8ForDriver(unsigned char *addr, unsigned char val);</source><br />
<br />
=== sceKernelAtomicClearAndGet16ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x6B050D7C<br />
|}<br />
<br />
<source lang="c">unsigned short sceKernelAtomicClearAndGet16ForDriver(unsigned short *addr, unsigned short val);</source><br />
<br />
=== sceKernelAtomicClearAndGet32ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x78C1F148<br />
|}<br />
<br />
<source lang="c">unsigned int sceKernelAtomicClearAndGet32ForDriver(unsigned int *addr, unsigned int val);</source><br />
<br />
=== sceKernelAtomicClearAndGet64ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x2149CD4C<br />
|}<br />
<br />
<source lang="c">unsigned long long sceKernelAtomicClearAndGet64ForDriver(unsigned long long *addr, int unused, unsigned long long val);</source><br />
<br />
<hr><br />
<br />
=== sceKernelAtomicClearMask8ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x1B3336B0<br />
|}<br />
<br />
<source lang="c">void sceKernelAtomicClearMask8ForDriver(unsigned char *addr, unsigned char val);</source><br />
<br />
=== sceKernelAtomicClearMask16ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x1BE58599<br />
|}<br />
<br />
<source lang="c">void sceKernelAtomicClearMask16ForDriver(unsigned short *addr, unsigned short val);</source><br />
<br />
=== sceKernelAtomicClearMask32ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x4AE1BCC0<br />
|}<br />
<br />
<source lang="c">void sceKernelAtomicClearMask32ForDriver(unsigned int *addr, unsigned int val);</source><br />
<br />
=== sceKernelAtomicClearMask64ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x55760309<br />
|}<br />
<br />
<source lang="c">void sceKernelAtomicClearMask64ForDriver(unsigned long long *addr, int unused, unsigned long long val);</source><br />
<br />
<hr><br />
<br />
=== sceKernelAtomicCompareAndSet8ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x3627F4E0<br />
|}<br />
<br />
<source lang="c">unsigned char sceKernelAtomicCompareAndSet8ForDriver(unsigned char *addr, unsigned char cmp, unsigned char val);</source><br />
<br />
=== sceKernelAtomicCompareAndSet16ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x6F63F56D<br />
|}<br />
<br />
<source lang="c">unsigned short sceKernelAtomicCompareAndSet16ForDriver(unsigned short *addr, unsigned short cmp, unsigned short val);</source><br />
<br />
=== sceKernelAtomicCompareAndSet32ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xCDA96E81<br />
|}<br />
<br />
<source lang="c">unsigned int sceKernelAtomicCompareAndSet32ForDriver(unsigned int *addr, unsigned int cmp, unsigned int val);</source><br />
<br />
=== sceKernelAtomicCompareAndSet64ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x4B527009<br />
|}<br />
<br />
<source lang="c">unsigned long long sceKernelAtomicCompareAndSet64ForDriver(unsigned long long *addr, int unused, unsigned long long cmp, unsigned long long val);</source><br />
<br />
<hr><br />
<br />
=== sceKernelAtomicDecIfPositive8ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x45153D4E<br />
|}<br />
<br />
<source lang="c">unsigned char sceKernelAtomicDecIfPositive8ForDriver(unsigned char *addr);</source><br />
<br />
=== sceKernelAtomicDecIfPositive16ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x9A693F5B<br />
|}<br />
<br />
<source lang="c">unsigned short sceKernelAtomicDecIfPositive16ForDriver(unsigned short *addr);</source><br />
<br />
=== sceKernelAtomicDecIfPositive32ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x2A71B03C<br />
|}<br />
<br />
This is a guessed name. Official name might be sceKernelAddressSpaceReleaseForDriver.<br />
<br />
<source lang="c">unsigned int sceKernelAtomicDecIfPositive32ForDriver(unsigned int* addr);</source><br />
<br />
=== sceKernelAtomicDecIfPositive64ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x267D0B33<br />
|}<br />
<br />
<source lang="c">unsigned long long sceKernelAtomicDecIfPositive64ForDriver(unsigned long long *addr);</source><br />
<br />
<hr><br />
<br />
=== sceKernelAtomicGetAndAdd8ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xFCDCD4DE<br />
|}<br />
<br />
<source lang="c">unsigned char sceKernelAtomicGetAndAdd8ForDriver(unsigned char *addr, unsigned char val);</source><br />
<br />
=== sceKernelAtomicGetAndAdd16ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x225DF91A<br />
|}<br />
<br />
<source lang="c">unsigned short sceKernelAtomicGetAndAdd16ForDriver(unsigned short *addr, unsigned short val);</source><br />
<br />
=== sceKernelAtomicGetAndAdd32ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x341B6E81<br />
|}<br />
<br />
<source lang="c">unsigned int sceKernelAtomicGetAndAdd32ForDriver(unsigned int *addr, unsigned int val);</source><br />
<br />
=== sceKernelAtomicGetAndAdd64ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x043FD446<br />
|}<br />
<br />
<source lang="c">unsigned long long sceKernelAtomicGetAndAdd64ForDriver(unsigned long long *addr, int unused, unsigned long long val);</source><br />
<br />
<hr><br />
<br />
=== sceKernelAtomicGetAndAnd8ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xD8E675C0<br />
|}<br />
<br />
<source lang="c">unsigned char sceKernelAtomicGetAndAnd8ForDriver(unsigned char *a1, unsigned char a2);</source><br />
<br />
=== sceKernelAtomicGetAndAnd16ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x4A820BC5<br />
|}<br />
<br />
<source lang="c">unsigned short sceKernelAtomicGetAndAnd16ForDriver(unsigned short *addr, unsigned short val);</source><br />
<br />
=== sceKernelAtomicGetAndAnd32ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x10EB35EB<br />
|}<br />
<br />
<source lang="c">unsigned int sceKernelAtomicGetAndAnd32ForDriver(unsigned int *addr, unsigned int val);</source><br />
<br />
=== sceKernelAtomicGetAndAnd64ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x18A17E07<br />
|}<br />
<br />
<source lang="c">unsigned long long sceKernelAtomicGetAndAnd64ForDriver(unsigned long long *addr, int unused, unsigned long long val);</source><br />
<br />
<hr><br />
<br />
=== sceKernelAtomicGetAndClear8ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x382D1466<br />
|}<br />
<br />
<source lang="c">unsigned char sceKernelAtomicGetAndClear8ForDriver(unsigned char *addr, unsigned char val);</source><br />
<br />
=== sceKernelAtomicGetAndClear16ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x8E9C086D<br />
|}<br />
<br />
<source lang="c">unsigned short sceKernelAtomicGetAndClear16ForDriver(unsigned short *addr, unsigned short val);</source><br />
<br />
=== sceKernelAtomicGetAndClear32ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xE36F3A46<br />
|}<br />
<br />
<source lang="c">unsigned int sceKernelAtomicGetAndClear32ForDriver(unsigned int *addr, unsigned int val);</source><br />
<br />
=== sceKernelAtomicGetAndClear64ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x88BA6002<br />
|}<br />
<br />
<source lang="c">unsigned long long sceKernelAtomicGetAndClear64ForDriver(unsigned long long *addr, int unused, unsigned long long val);</source><br />
<br />
<hr><br />
<br />
=== sceKernelAtomicGetAndOr8ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xBDF6F8E4<br />
|}<br />
<br />
<source lang="c">unsigned char sceKernelAtomicGetAndOr8ForDriver(unsigned char *var, unsigned char value);</source><br />
<br />
=== sceKernelAtomicGetAndOr16ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x004F09D1<br />
|}<br />
<br />
<source lang="c">unsigned short sceKernelAtomicGetAndOr16ForDriver(unsigned short *addr, unsigned short val);</source><br />
<br />
=== sceKernelAtomicGetAndOr32ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x2A40BB93<br />
|}<br />
<br />
<source lang="c">unsigned int sceKernelAtomicGetAndOr32ForDriver(unsigned int *addr, unsigned int val);</source><br />
<br />
=== sceKernelAtomicGetAndOr64ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xCB73D6D5<br />
|}<br />
<br />
<source lang="c">unsigned long long sceKernelAtomicGetAndOr64ForDriver(unsigned long long *addr, int unused, unsigned long long val);</source><br />
<br />
<hr><br />
<br />
=== sceKernelAtomicGetAndSet8ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x29599FC8<br />
|}<br />
<br />
<source lang="c">unsigned char sceKernelAtomicGetAndSet8ForDriver(unsigned char *addr, unsigned char val);</source><br />
<br />
=== sceKernelAtomicGetAndSet16ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x085532C8<br />
|}<br />
<br />
<source lang="c">unsigned short sceKernelAtomicGetAndSet16ForDriver(unsigned short *addr, unsigned short val);</source><br />
<br />
=== sceKernelAtomicGetAndSet32ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x0EE04C03<br />
|}<br />
<br />
<source lang="c">unsigned int sceKernelAtomicGetAndSet32ForDriver(unsigned int *addr, unsigned int val);</source><br />
<br />
=== sceKernelAtomicGetAndSet64ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xD2DEE625<br />
|}<br />
<br />
<source lang="c">unsigned long long sceKernelAtomicGetAndSet64ForDriver(unsigned long long *addr, int unused, unsigned int lo_val, unsigned int hi_val);</source><br />
<br />
=== sceKernelAtomicGetAndSub8ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x7B43D0D7<br />
|}<br />
<br />
<source lang="c">unsigned char sceKernelAtomicGetAndSub8ForDriver (unsigned char *addr, unsigned char val);</source><br />
<br />
=== sceKernelAtomicGetAndSub16ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x3EE9B5B8<br />
|}<br />
<br />
<source lang="c">unsigned short sceKernelAtomicGetAndSub16ForDriver(unsigned short *addr, unsigned short val);</source><br />
<br />
=== sceKernelAtomicGetAndSub32ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xF891CF2A<br />
|}<br />
<br />
<source lang="c">unsigned int sceKernelAtomicGetAndSub32ForDriver(unsigned int *addr, unsigned int val);</source><br />
<br />
=== sceKernelAtomicGetAndSub64ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xA7585370<br />
|}<br />
<br />
<source lang="c">unsigned long long sceKernelAtomicGetAndSub64ForDriver(unsigned long long *addr, int unused, unsigned long long val);</source><br />
<br />
<hr><br />
<br />
=== sceKernelAtomicGetAndXor8ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xBAF47F7B<br />
|}<br />
<br />
<source lang="c">unsigned char sceKernelAtomicGetAndXor8ForDriver(unsigned char *addr, unsigned char val);</source><br />
<br />
=== sceKernelAtomicGetAndXor16ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x711801E6<br />
|}<br />
<br />
<source lang="c">unsigned short sceKernelAtomicGetAndXor16ForDriver(unsigned short *addr, unsigned short val);</source><br />
<br />
=== sceKernelAtomicGetAndXor32ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x77E34309<br />
|}<br />
<br />
<source lang="c">unsigned int sceKernelAtomicGetAndXor32ForDriver(unsigned int *addr, unsigned int val);</source><br />
<br />
=== sceKernelAtomicGetAndXor64ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xE212ECAD<br />
|}<br />
<br />
<source lang="c">unsigned long long sceKernelAtomicGetAndXor64ForDriver(unsigned long long *addr, int unused, unsigned long long val);</source><br />
<br />
<hr><br />
<br />
=== sceKernelAtomicOrAndGet8ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x5D515F1B<br />
|}<br />
<br />
<source lang="c">unsigned char sceKernelAtomicOrAndGet8ForDriver(unsigned char *addr, unsigned char val);</source><br />
<br />
=== sceKernelAtomicOrAndGet16ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xADD39B84<br />
|}<br />
<br />
<source lang="c">unsigned short sceKernelAtomicOrAndGet16ForDriver (unsigned short *addr, unsigned short val);</source><br />
<br />
=== sceKernelAtomicOrAndGet32ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xBC248C30<br />
|}<br />
<br />
<source lang="c">unsigned int sceKernelAtomicOrAndGet32ForDriver (unsigned int *addr, unsigned int val);</source><br />
<br />
=== sceKernelAtomicOrAndGet64ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x3E218AF7<br />
|}<br />
<br />
<source lang="c">unsigned long long sceKernelAtomicOrAndGet64ForDriver(unsigned long long *addr, int unused, long long val);</source><br />
<br />
<hr><br />
<br />
=== sceKernelAtomicSet8ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x0836537E<br />
|}<br />
<br />
<source lang="c">void sceKernelAtomicSet8ForDriver(unsigned char *addr, unsigned char val);</source><br />
<br />
=== sceKernelAtomicSet16ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x532CA3E8<br />
|}<br />
<br />
<source lang="c">void sceKernelAtomicSet16ForDriver(unsigned short *addr, unsigned short val);</source><br />
<br />
=== sceKernelAtomicSet32ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x3168BC57<br />
|}<br />
<br />
<source lang="c">void sceKernelAtomicSet32ForDriver(unsigned int *addr, unsigned int val);</source><br />
<br />
=== sceKernelAtomicSet64ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xC381CE8C<br />
|}<br />
<br />
<source lang="c">void sceKernelAtomicSet64ForDriver(unsigned long long *addr, int unused, unsigned long long val);</source><br />
<br />
<hr><br />
<br />
=== sceKernelAtomicSetIfGreaterGet8ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xC3868071<br />
|}<br />
<br />
<source lang="c">unsigned char sceKernelAtomicSetIfGreaterGet8ForDriver(unsigned char *addr, unsigned char val);</source><br />
<br />
=== sceKernelAtomicSetIfGreaterGet16ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x875B094D<br />
|}<br />
<br />
<source lang="c">unsigned short sceKernelAtomicSetIfGreaterGet16ForDriver(unsigned short *addr, unsigned short val);</source><br />
<br />
=== sceKernelAtomicSetIfGreaterGet32ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x26F71995<br />
|}<br />
<br />
<source lang="c">unsigned int sceKernelAtomicSetIfGreaterGet32ForDriver(unsigned int *a1, unsigned int val);</source><br />
<br />
<hr><br />
<br />
=== sceKernelAtomicSubAndGet8ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xEB085370<br />
|}<br />
<br />
<source lang="c">unsigned char sceKernelAtomicSubAndGet8ForDriver(unsigned char *addr, unsigned char val);</source><br />
<br />
=== sceKernelAtomicSubAndGet16ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x515682C9<br />
|}<br />
<br />
<source lang="c">unsigned short sceKernelAtomicSubAndGet16ForDriver(unsigned short *addr, unsigned short val);</source><br />
<br />
=== sceKernelAtomicSubAndGet32ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xA4884C4E<br />
|}<br />
<br />
<source lang="c">unsigned int sceKernelAtomicSubAndGet32ForDriver(unsigned int *addr, unsigned int val);</source><br />
<br />
=== sceKernelAtomicSubAndGet64ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xB5F8919C<br />
|}<br />
<br />
<source lang="c">unsigned long long sceKernelAtomicSubAndGet64ForDriver(unsigned long long *addr, int unused, unsigned long long val);</source><br />
<br />
<hr><br />
<br />
=== sceKernelAtomicXorAndGet8ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x03887992<br />
|}<br />
<br />
<source lang="c">unsigned char sceKernelAtomicXorAndGet8ForDriver (unsigned char *a1, unsigned char a2);</source><br />
<br />
=== sceKernelAtomicXorAndGet16ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x646003D6<br />
|}<br />
<br />
<source lang="c">unsigned short sceKernelAtomicXorAndGet16ForDriver (unsigned short *addr, unsigned short val);</source><br />
<br />
=== sceKernelAtomicXorAndGet32ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x4244BE65<br />
|}<br />
<br />
<source lang="c">unsigned int sceKernelAtomicXorAndGet32ForDriver(unsigned int *addr, unsigned int val);</source><br />
<br />
=== sceKernelAtomicXorAndGet64ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x692C51B3<br />
|}<br />
<br />
<source lang="c">unsigned long long sceKernelAtomicXorAndGet64ForDriver(unsigned long long *addr, int unused, unsigned long long val);</source><br />
<br />
<hr><br />
<br />
=== sceKernelDcacheInvalidateRangeForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x02796361<br />
|}<br />
<br />
Temp name was sceKernelDcacheInvalidateRange_1ForDriver, sceKernelCpuDcacheAndL2InvalidateMVACRange_1ForDriver, sceKernelCpuDcacheAndL2InvalidateRangeForDriver.<br />
<br />
<source lang="c">int sceKernelDcacheInvalidateRangeForDriver(const void *start, SceSize size);</source><br />
<br />
=== sceKernelDcacheInvalidateRangeForL2WBWAForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || 0x614C6698<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
Temp name was sceKernelDcacheInvalidateRange_0x10ForDriver, sceKernelCpuDcacheAndL2InvalidateMVACRange_10ForDriver.<br />
<br />
<source lang="c">int sceKernelDcacheInvalidateRangeForL2WBWAForDriver(const void *start, SceSize size);</source><br />
<br />
=== sceKernelDcacheInvalidateRangeForL1WBWAForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x8B4C26DF<br />
|}<br />
<br />
Temp name was sceKernelDcacheInvalidateRange_0x20ForDriver, sceKernelCpuDcacheInvalidateRangeForDriver, sceKernelCpuDcacheAndL2InvalidateMVACRange_20ForDriver.<br />
<br />
<source lang="c">int sceKernelDcacheInvalidateRangeForL1WBWAForDriver(const void *start, SceSize size);</source><br />
<br />
=== sceKernelDcacheCleanInvalidateRangeForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x364E68A4<br />
|}<br />
<br />
Temp name was sceKernelDcacheCleanInvalidateRange_1ForDriver, sceKernelCpuDcacheAndL2CleanInvalidateMVACRange_1ForDriver, sceKernelCpuDcacheAndL2WritebackInvalidateRangeForDriver, sceKernelDcacheCleanInvalidateRange_0x10ForDriver.<br />
<br />
Also have another name "sceKernelDcacheCleanInvalidateRangeForL2WBWAForDriver" in 0.990.<br />
<br />
<source lang="c">int sceKernelDcacheCleanInvalidateRangeForDriver(const void *start, SceSize size);</source><br />
<br />
=== sceKernelDcacheCleanInvalidateRangeForL1WBWAForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xE551F99B<br />
|}<br />
<br />
Temp name was sceKernelDcacheCleanInvalidateRange_0x20ForDriver, sceKernelCpuDcacheAndL2CleanInvalidateMVACRange_20ForDriver.<br />
<br />
<source lang="c">int sceKernelDcacheCleanInvalidateRangeForL1WBWAForDriver(const void *start, SceSize);</source><br />
<br />
=== sceKernelDcacheCleanRangeForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x103872A5<br />
|}<br />
<br />
Temp name was sceKernelDcacheCleanRange_1ForDriver, sceKernelCpuDcacheAndL2WritebackRangeForDriver, sceKernelCpuDcacheAndL2CleanMVACRange_1ForDriver.<br />
<br />
<source lang="c">int sceKernelDcacheCleanRangeForDriver(const void *start, SceSize size);</source><br />
<br />
=== sceKernelDcacheCleanRangeForL2WBWAForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.350.011 || 0x2A5344B7<br />
|-<br />
| 3.500.011-3.740.011 || not present<br />
|}<br />
<br />
Temp name was sceKernelDcacheCleanRange_0x10ForDriver.<br />
<br />
<source lang="c">int sceKernelDcacheCleanRangeForL2WBWAForDriver(const void *start, SceSize size);</source><br />
<br />
=== sceKernelDcacheCleanRangeForL1WBWAForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x9CB9F0CE<br />
|}<br />
<br />
Temp name was sceKernelCpuDcacheWritebackRangeForDriver, flush_dcache, sceKernelDcacheCleanRange_0x20ForDriver, sceKernelCpuDcacheAndL2CleanMVACRange_20ForDriver.<br />
<br />
<source lang="c">int sceKernelDcacheCleanRangeForL1WBWAForDriver(const void *start, SceSize size);</source><br />
<br />
=== SceCpuForDriver_E813EBB2 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xE813EBB2<br />
|}<br />
<br />
Cleans L2 memory? A name could be sceKernelWaitL2CacheReg.<br />
<br />
<source lang="C"><br />
#define SceL2CacheReg 0x1A002000<br />
__dsb();<br />
*(int *)(SceL2CacheReg + 0x730) = 0;<br />
while ( *(int *)(SceL2CacheReg + 0x730) & 1 )<br />
;<br />
__dmb();<br />
</source><br />
<br />
<source lang="c">int SceCpuForDriver_E813EBB2(void);</source><br />
<br />
=== sceKernelIsUncacheAddressInTmpFsGameForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x337CBDF3<br />
|}<br />
<br />
Temp name was sceKernelCpuIsVaddrMappedForDriver.<br />
<br />
<source lang="C"><br />
uint32_t vaddr_memory_type = sceKernelMMUGetMemoryTypeForKernel(vaddr);<br />
if (vaddr_memory_type != 8) {<br />
if (vaddr_memory_type <= 8) {<br />
if (vaddr_memory_type != 2)<br />
return 0;<br />
} else if (vaddr_memory_type != 0x40 && vaddr_memory_type != 0x80)<br />
return 0;<br />
}<br />
return 1;<br />
</source><br />
<br />
<source lang="C">SceBool sceKernelIsUncacheAddressInTmpFsGameForDriver(void *address);</source><br />
<br />
=== sceKernelCpuSuspendIntrForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.60-3.60 || 0x821FC0EE<br />
|}<br />
<br />
Temp name was sceKernelCpuDisableInterruptsForDriver.<br />
<br />
Disables IRQ (FIQ are not disabled, but they're routed to Secure state anyways...) and returns previous interrupt bit status (either 0 or 0x80).<br />
<br />
<source lang="c"><br />
//Return CPSR.I and disable IRQ.<br />
SceKernelIntrStatus sceKernelCpuSuspendIntrForDriver(void);<br />
</source><br />
<br />
=== sceKernelCpuResumeIntrForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.60-3.60 || 0xF5BAD43B<br />
|}<br />
<br />
Temp name was sceKernelCpuEnableInterruptsForDriver.<br />
<br />
Restore previous IRQ state. Pass the return value of the previous call to [[SceSysmem#sceKernelCpuSuspendIntrForDriver|sceKernelCpuSuspendIntrForDriver]].<br />
<br />
<source lang="c"><br />
//Enable IRQ if prev_state & 0x80.<br />
SceKernelIntrStatus sceKernelCpuResumeIntrForDriver(SceKernelIntrStatus prev_state);<br />
</source><br />
<br />
<hr><br />
'''Spinlock functions'''<br />
<br />
The following functions implement a simple mutal exclusion mechanism using atomic operation (LDREX/STREX). Spinlocks are owned by a single thread or CPU at a time. Unlike other lock/sync objects of the kernel, spinlocks can be used under any context. Use spinlocks if the data to protect may be accessed from an IRQ or exception handler.<br />
<br />
There are two version of the Spinlock functions: normal functions do not change the CPU state, while the <code>SuspendIntr</code> functions ensure the CPU cannot be interrupted while the lock is held.<br />
<br />
The same type of function must be used to lock and unlock a spinlock: for example, '''calling <code>sceKernelSpinlockLowLockCpuResumeIntr</code> followed by <code>sceKernelSpinlockLowUnlock</code> is an invalid usage of this API'''.<br />
<br />
Spinlocks can take two values: <code>0</code> means the spinlock is unlocked, and <code>1</code> means the spinlock is locked.<br />
<br />
<source lang="c"><br />
//Unofficial names<br />
typedef int SceKernelSpinlock;<br />
typedef int SceKernelRWSpinlock;<br />
typedef int SceKernelIntrStatus;<br />
<br />
//Sample usage:<br />
void function(Object* object) {<br />
sceKernelSpinlockLowLock(&object->lock);<br />
/* ... work on object ... */<br />
sceKernelSpinlockUnlock(&object->lock);<br />
}<br />
<br />
void trylock_function(Object* object) {<br />
int res = sceKernelSpinlockLowTrylock(&object->lock);<br />
if (res >= 0) {<br />
/* ... work on object ... */<br />
}<br />
}<br />
<br />
void uninterruptible_function(Object* object) {<br />
SceKernelIntrStatus status = sceKernelSpinlockLowLockCpuSuspendIntr(&object->lock);<br />
/* ... work on object ... */<br />
/* interrupts are disabled here */<br />
sceKernelSpinlockUnlock(&object->lock, status);<br />
}<br />
<br />
void uninterruptible_trylock_function(Object* object) {<br />
SceKernelIntrStatus status = sceKernelSpinlockLowTrylockCpuSuspendIntr(&object->lock);<br />
if (status >= 0) {<br />
/* ... work on object ... */<br />
/* interrupts are disabled here */<br />
sceKernelSpinlockLowUnlockCpuResumeIntr(&object->lock, status);<br />
}<br />
}<br />
</source><br />
<br />
=== sceKernelSpinlockLowLockForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.60-3.60 || 0xBF82DEB2<br />
|}<br />
<br />
Temp name was sceKernelCpuLockStoreLRForDriver.<br />
<br />
Acquires a spinlock.<br />
<br />
<source lang="c">void sceKernelSpinlockLowLockForDriver(SceKernelSpinlock *pLock);</source><br />
<br />
=== sceKernelSpinlockLowTrylockForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x5AC9D394<br />
|}<br />
<br />
This is a guessed name. Temp name was sceKernelCpuTryLockStoreLRForDriver, sceKernelSpinlockLowTryLockForDriver.<br />
<br />
Attempts to acquire a spinlock.<br />
<br />
<source lang="c"><br />
/**<br />
* @param pLock Pointer to the spinlock<br />
* @retval SCE_OK if the spinlock is acquired<br />
* @retval <0 if the spinlock could not be acquired<br />
*/<br />
int sceKernelSpinlockLowTrylockForDriver(SceKernelSpinlock *pLock);<br />
</source><br />
<br />
=== sceKernelSpinlockLowUnlockForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.60-3.60 || 0xD6ED0C46<br />
|}<br />
<br />
Temp name was sceKernelCpuUnlockStoreLRForDriver.<br />
<br />
Unlocks a spinlock previously acquired with either [[SceSysmem#sceKernelSpinlockLowLockForDriver|sceKernelSpinlockLowLockForDriver]] or [[SceSysmem#sceKernelSpinlockLowTrylockForDriver|sceKernelSpinlockLowTrylockForDriver]].<br />
<br />
<source lang="c">void sceKernelSpinlockLowUnlockForDriver(SceKernelSpinlock *pLock);</source><br />
<br />
=== sceKernelSpinlockLowLockCpuSuspendIntrForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xD32ACE9E<br />
|}<br />
<br />
Temp name was sceKernelCpuSuspendIntrForDriver, sceKernelCpuLockSuspendIntrStoreLRForDriver.<br />
<br />
Acquires a spinlock and suspend interrupts if necessary.<br />
<br />
<source lang="c"><br />
/**<br />
* @param pLock Pointer to the spinlock<br />
* @return An opaque value describing the interrupt state<br />
*/<br />
SceKernelIntrStatus sceKernelSpinlockLowLockCpuSuspendIntrForDriver(SceKernelSpinlock *pLock);<br />
</source><br />
<br />
=== sceKernelSpinlockLowTrylockCpuSuspendIntrForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x27C0B340<br />
|}<br />
<br />
Temp name was sceKernelCpuTryLockSuspendIntrStoreLRForDriver.<br />
<br />
Attempts to acquire a spinlock. If successfully acquired, suspends interrupts if necessary.<br />
<br />
<source lang="c"><br />
/**<br />
* @param pLock Pointer to the spinlock<br />
* @retval >=0 if the spinlock is acquired - opaque value describing the interrupt state<br />
* @retval <0 if the spinlock could not be acquired<br />
*/<br />
SceKernelIntrStatus sceKernelSpinlockLowTrylockCpuSuspendIntrForDriver(SceKernelSpinlock *pLock);<br />
</source><br />
<br />
=== sceKernelSpinlockLowUnlockCpuResumeIntrForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x7BB9D5DF<br />
|}<br />
<br />
Temp name was sceKernelCpuUnlockResumeIntrStoreLRForDriver, sceKernelCpuResumeIntrForDriver.<br />
<br />
Unlocks a spinlock previously acquired with either [[SceSysmem#sceKernelSpinlockLowLockCpuSuspendIntrForDriver|sceKernelSpinlockLowLockCpuSuspendIntrForDriver]] or [[SceSysmem#sceKernelSpinlockLowTrylockCpuSuspendIntrForDriver|sceKernelSpinlockLowTrylockCpuSuspendIntrForDriver]] and resumes interrupts if necessary.<br />
<br />
If interrupts were disabled before acquiring the spinlock, they will remain disabled after this call.<br />
<br />
<source lang="c">void sceKernelSpinlockLowUnlockCpuResumeIntrForDriver(SceKernelSpinlock *pLock, SceKernelIntrStatus prev_state);<br />
</source><br />
<br />
<hr><br />
'''RW Spinlock functions'''<br />
<br />
The following functions implement RW spinlocks. This variant of the spinlock allows multiple threads/CPUs to access data at the same time as long as only reads are performed. When acquired for writing, a single thread at a time can access the data and is thus free to modify it. Like regular spinlocks, the RW spinlocks can be used under any context. Use RW spinlocks if the data to protect may be accessed from an IRQ or exception handler.<br />
<br />
Like for regular spinlocks, all RWSpinlock functions are available in a normal and <code>SuspendIntr</code> version. Additionally, every function exists in <code>Read</code> and <code>Write</code> variants, depending on whether the caller wants to read or write to the object protected by the lock.<br />
<br />
Like for regular spinlocks, the same type of function must be used to lock and unlock a RW spinlock.<br />
'''Calling <code>sceKernelRWSpinlockLowReadLock</code> followed by <code>sceKernelRWSpinlockLowWriteUnlock</code> is an invalid usage of this API'''. '''Calling <code>sceKernelRWSpinlockLowReadLockCpuSuspendIntr</code> followed by <code>sceKernelRWSpinlockLowReadUnlockCpu</code> is also an invalid usage of this API'''.<br />
<br />
RW Spinlocks can take three kind of values: <code>0</code> means the spinlock is unlocked, <code>-0x80000000</code> means the spinlock is write-locked, and a positive value <code>x</code> means that <code>x</code> readers have read-locked the spinlock.<br />
<br />
=== sceKernelRWSpinlockLowReadLockForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xCAC9AE80<br />
|}<br />
<br />
This is a guessed name. Temp name was sceKernelCpuSpinLockStoreLRForDriver.<br />
<br />
Acquires a RW spinlock for reading data. '''Modifying the data protected by the spinlock is not allowed'''.<br />
<br />
<source lang="c">void sceKernelRWSpinlockLowReadLockForDriver(SceKernelRWSpinlock *pRWLock);</source><br />
<br />
=== sceKernelRWSpinlockLowTryReadLockForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x093925BD<br />
|}<br />
<br />
This is a guessed name. Temp name was sceKernelCpuTrySpinLockStoreLRForDriver.<br />
<br />
Attempts to acquire a RW spinlock for reading data.<br />
<br />
'''Even if the spinlock is acquired, modifying the data protected by the spinlock is not allowed'''.<br />
<br />
<source lang="c"><br />
/**<br />
* @param pLock Pointer to the spinlock<br />
* @retval SCE_OK if the spinlock is acquired<br />
* @retval <0 if the spinlock could not be acquired<br />
*/<br />
int sceKernelRWSpinlockLowTryReadLockForDriver(SceKernelRWSpinlock *pRWLock);<br />
</source><br />
<br />
=== sceKernelRWSpinlockLowReadUnlockForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xF5FD5676<br />
|}<br />
<br />
Temp name was sceKernelCpuSpinUnlockStoreLRForDriver.<br />
<br />
Unlocks a RW spinlock previously acquired with either [[SceSysmem#sceKernelRWSpinlockLowReadLockForDriver|sceKernelRWSpinlockLowReadLockForDriver]] or [[SceSysmem#sceKernelRWSpinlockLowTryReadLockForDriver|sceKernelRWSpinlockLowTryReadLockForDriver]].<br />
<br />
<source lang="c">void sceKernelRWSpinlockLowReadUnlockForDriver(SceKernelRWSpinlock *pRWLock);</source><br />
<br />
=== sceKernelRWSpinlockLowWriteLockForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x3F42B434<br />
|}<br />
<br />
This is a guessed name. Temp name was sceKernelCpuLockStoreFlagForDriver.<br />
<br />
Acquires a RW spinlock for writing data.<br />
<br />
<source lang="c">void sceKernelRWSpinlockLowWriteLockForDriver(SceKernelRWSpinlock *pRWLock);</source><br />
<br />
=== sceKernelRWSpinlockLowTryWriteLockForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x4F7790B4<br />
|}<br />
<br />
This is a guessed name. Temp name was sceKernelCpuTryLockStoreFlagForDriver.<br />
<br />
Attempts to acquire a RW spinlock for writing data.<br />
<br />
<source lang="c"><br />
/**<br />
* @param pLock Pointer to the spinlock<br />
* @retval SCE_OK if the spinlock is acquired<br />
* @retval <0 if the spinlock could not be acquired<br />
*/<br />
int sceKernelRWSpinlockLowTryWriteLockForDriver(SceKernelRWSpinlock *pRWLock);<br />
</source><br />
<br />
=== sceKernelRWSpinlockLowWriteUnlockForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xCB8ABDF0<br />
|}<br />
<br />
Temp name was sceKernelCpuUnlockStoreFlagForDriver.<br />
<br />
Unlocks a RW spinlock previously acquired with either [[SceSysmem#sceKernelRWSpinlockLowWriteLockForDriver|sceKernelRWSpinlockLowWriteLockForDriver]] or [[SceSysmem#sceKernelRWSpinlockLowTryWriteLockForDriver|sceKernelRWSpinlockLowTryWriteLockForDriver]].<br />
<br />
<source lang="c">void sceKernelRWSpinlockLowWriteUnlockForDriver(SceKernelRWSpinlock *pRWLock);</source><br />
<br />
=== sceKernelRWSpinlockLowReadLockCpuSuspendIntr ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xEC53D007<br />
|}<br />
<br />
This is a guessed name. Temp name was sceKernelCpuSpinLockSuspendIntrStoreLRForDriver, sceKernelCpuSpinLockIrqSaveForDriver.<br />
<br />
Acquires a RW spinlock for reading data and suspends interrupts if necessary.<br />
<br />
<source lang="c"><br />
/**<br />
* @param pLock Pointer to the spinlock<br />
* @return An opaque value describing the interrupt state<br />
*/<br />
SceKernelIntrStatus sceKernelRWSpinlockLowReadLockCpuSuspendIntrForDriver(SceKernelRWSpinlock *pRWLock);<br />
</source><br />
<br />
=== sceKernelRWSpinlockLowTryReadLockCpuSuspendIntrForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xF02467D1<br />
|}<br />
<br />
This is a guessed name. Temp name was sceKernelCpuTrySpinLockSuspendIntrStoreLRForDriver.<br />
<br />
Attempts to acquire a RW spinlock for reading data. If successfully acquired, suspends interrupts if necessary.<br />
<br />
<source lang="c"><br />
/**<br />
* @param pLock Pointer to the spinlock<br />
* @retval >=0 if the spinlock is acquired - opaque value describing the interrupt state<br />
* @retval <0 if the spinlock could not be acquired<br />
*/<br />
SceKernelIntrStatus sceKernelRWSpinlockLowTryReadLockCpuSuspendIntrForDriver(SceKernelRWSpinlock *pRWLock);<br />
</source><br />
<br />
=== sceKernelRWSpinlockLowReadUnlockCpuResumeIntrForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x740A0750<br />
|}<br />
<br />
Temp name was sceKernelCpuSpinUnlockResumeIntrStoreLRForDriver, sceKernelCpuSpinLockIrqRestoreForDriver.<br />
<br />
Unlocks a RW spinlock previously acquired with either [[SceSysmem#sceKernelRWSpinlockLowReadLockCpuSuspendIntrForDriver|sceKernelRWSpinlockLowReadLockCpuSuspendIntrForDriver]] or [[SceSysmem#sceKernelRWSpinlockLowTryReadLockCpuSuspendIntrForDriver|sceKernelRWSpinlockLowTryReadLockCpuSuspendIntrForDriver]], and resumes interrupts if necessary.<br />
<br />
If interrupts were disabled before acquiring the spinlock, they will remain disabled after this call.<br />
<br />
<source lang="c">void sceKernelRWSpinlockLowReadUnlockCpuResumeIntrForDriver(SceKernelRWSpinlock *pRWLock, SceKernelIntrStatus prev_state);</source><br />
<br />
=== sceKernelRWSpinlockLowWriteLockCpuSuspendIntrForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x4C38CE4D<br />
|}<br />
<br />
This is a guessed name. Temp name was sceKernelCpuLockSuspendIntrStoreFlagForDriver.<br />
<br />
Acquires a RW spinlock for writing data and suspends interrupts if necessary.<br />
<br />
<source lang="c"><br />
/**<br />
* @param pLock Pointer to the spinlock<br />
* @return An opaque value describing the interrupt state<br />
*/<br />
SceKernelIntrStatus sceKernelRWSpinlockLowWriteLockCpuSuspendIntrForDriver(SceKernelRWSpinlock *pRWLock);<br />
</source><br />
<br />
=== sceKernelRWSpinlockLowTryWriteLockCpuSuspendIntrForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xDE6482C6<br />
|}<br />
<br />
This is a guessed name. Temp name was sceKernelCpuTryLockSuspendIntrStoreFlagForDriver.<br />
<br />
Attempts to acquire a RW spinlock for writing data. If successfully acquired, suspends interrupts if necessary.<br />
<br />
<source lang="c"><br />
/**<br />
* @param pLock Pointer to the spinlock<br />
* @retval >=0 if the spinlock is acquired - opaque value describing the interrupt state<br />
* @retval <0 if the spinlock could not be acquired<br />
*/<br />
SceKernelIntrStatus sceKernelRWSpinlockLowTryWriteLockCpuSuspendIntrForDriver(SceKernelRWSpinlock *pRWLock);<br />
</source><br />
<br />
=== sceKernelRWSpinlockLowWriteUnlockCpuResumeIntrDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x9EC91017<br />
|}<br />
<br />
Temp name was sceKernelCpuUnlockResumeIntrStoreFlagForDriver.<br />
<br />
Unlocks a RW spinlock previously acquired with either [[SceSysmem#sceKernelRWSpinlockLowWriteLockCpuSuspendIntrForDriver|sceKernelRWSpinlockLowWriteLockCpuSuspendIntrForDriver]] or [[SceSysmem#sceKernelRWSpinlockLowTryWriteLockCpuSuspendIntrForDriver|sceKernelRWSpinlockLowTryWriteLockCpuSuspendIntrForDriver]], and resumes interrupts if necessary.<br />
<br />
If interrupts were disabled before acquiring the spinlock, they will remain disabled after this call.<br />
<br />
<source lang="c">void sceKernelRWSpinlockLowWriteUnlockCpuResumeIntrDriver(SceKernelRWSpinlock *pRWLock, SceKernelIntrStatus prev_state);</source><br />
<br />
== SceSysclibForKernel ==<br />
<br />
This library was removed on FW 1.80.<br />
<br />
=== __prnt ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-1.50 || 0xE38E7605<br />
|-<br />
| 1.80-3.60 || not present. Moved to ForDriver.<br />
|}<br />
<br />
This is a guessed name. from PSP.<br />
<br />
=== SceSysclibForKernel_F7E34376 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.50 || 0xF7E34376<br />
|}<br />
<br />
=== SceSysclibForKernel_FA746181 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990-1.50 || 0xFA746181<br />
|}<br />
<br />
return a1 * (- 0x6e19295b) - 0x6e19295b;<br />
<br />
In SceSysmem, it is used internally to modify a global variable, like a multiplication hash function would do.<br />
<br />
<source lang="C">int SceSysclibForKernel_FA746181(int a1);</source><br />
<br />
== SceSysclibForDriver ==<br />
<br />
The C standard library for use in kernel only. Usermode has access to [[SceLibKernel]], which confusingly is usermode only.<br />
<br />
Includes standard string functions (no insecure variants like <code>strcpy</code>).<br />
<br />
=== memset2 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-1.69 || 0x502B000D<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
=== sortof_vsnprintf ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || 0x589BAF6B<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
=== sortof_vsnprintf_2 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || 0x658EA38E<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
=== SceSysclibForDriver_33388DBC ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || 0x33388DBC<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
Calculates xor of a1 and a2, then does some calculation with a3.<br />
<br />
=== SceSysclibForDriver_72429909 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || 0x72429909<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
=== SceSysclibForDriver_32373DF7 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || 0x32373DF7<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
Helper for strtol in base 10.<br />
<br />
<source lang="C">int SceSysclibForDriver_32373DF7(char *__nptr, long *plResult);</source><br />
<br />
=== __aeabi_idiv ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x2518CD9E<br />
|}<br />
<br />
=== __aeabi_idivmod ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xAC86B4BA<br />
|}<br />
<br />
=== __aeabi_lcmp ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x709077A1<br />
|}<br />
<br />
=== __aeabi_lmul ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xFEE5E751<br />
|}<br />
<br />
=== __aeabi_uidiv ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xA9FF1205<br />
|}<br />
<br />
=== __aeabi_uidivmod ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xA46CB7DE<br />
|}<br />
<br />
=== __aeabi_ldivmod ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x7554AB04<br />
|}<br />
<br />
=== __aeabi_uldivmod ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x9D148CDE<br />
|}<br />
<br />
Returns the 64-bit quotient of the division of dividend by divisor.<br />
<br />
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).<br />
<br />
<source lang="C"><br />
// ex: __aeabi_uldivmod(tick[0] + 0xd44000, (tick[1] - 0xdcbfff) + (uint)(0xff2bbfff < tick[0]), 1000000, 0);<br />
SceUInt64 __aeabi_uldivmod(SceUInt32 dividend_low, SceUInt32 dividend_hi, SceUInt32 divisor_low, SceUInt32 divisor_hi);<br />
</source><br />
<br />
=== __aeabi_ulcmp ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0xFE900DE8<br />
|}<br />
<br />
=== __aeabi_llsr ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0xE46C47E6<br />
|}<br />
<br />
=== __aeabi_llsl ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x72D31F9D<br />
|}<br />
<br />
=== __aeabi_lasr ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x1D89F6C0<br />
|}<br />
<br />
Temp name was rshift.<br />
<br />
=== __memcpy_chk ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x8A0B0815<br />
|}<br />
<br />
=== __memmove_chk ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x35DBB110<br />
|}<br />
<br />
=== __memset_chk ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x1A30BB28<br />
|}<br />
<br />
=== __stack_chk_fail ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.50-3.60 || 0xB997493D<br />
|}<br />
<br />
=== __stack_chk_guard ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x99EEBD1F<br />
|}<br />
<br />
This is a variable.<br />
<br />
=== __strlcat_chk ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x224BE33F<br />
|}<br />
<br />
=== __strlcpy_chk ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xCF86EA38<br />
|}<br />
<br />
=== __strncat_chk ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x33EE298B<br />
|}<br />
<br />
=== __strncpy_chk ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x96268C53<br />
|}<br />
<br />
=== __snprintf_chk ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x7DBE7007<br />
|}<br />
<br />
=== __vsnprintf_chk ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || not present<br />
|-<br />
| 3.60 || 0xCBF64DF6<br />
|}<br />
<br />
=== __prnt ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || not present. Present in ForKernel.<br />
|-<br />
| 3.60 || 0xE38E7605<br />
|}<br />
<br />
This is a guessed name. from PSP.<br />
<br />
<source lang="C">void __prnt(void (* cb)(void *argp, int ch), void *argp, const char *fmt, va_list list);</source><br />
<br />
Supported formats:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Format !! Description<br />
|-<br />
| \x20 || maybe space fill<br />
|-<br />
| # || unknown<br />
|-<br />
| * || unknown<br />
|-<br />
| - || Left align<br />
|-<br />
| + || unknown<br />
|-<br />
| . || unknown<br />
|-<br />
| 0 || Padding number and Enter zero padding<br />
|-<br />
| 1~9 || Padding number<br />
|-<br />
| D || unknown (maybe with long?)<br />
|-<br />
| L || unknown (maybe with long?)<br />
|-<br />
| O || unknown (maybe with long?)<br />
|-<br />
| U || unknown (maybe with long?)<br />
|-<br />
| X || print hex number as uppercase<br />
|-<br />
| c || print char<br />
|-<br />
| d || print decimal number<br />
|-<br />
| h || unknown<br />
|-<br />
| l || long<br />
|-<br />
| o || unknown<br />
|-<br />
| p || print pointer as lowercase<br />
|-<br />
| s || print strings<br />
|-<br />
| u || unsigned number<br />
|-<br />
| x || print hex number as lowercase<br />
|}<br />
<br />
=== vsnprintf ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x3DDBE2E1<br />
|}<br />
<br />
<source lang="C">int vsnprintf(char *s, size_t n, const char *fmt, va_list arg);</source><br />
<br />
=== get_ctype_table ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || 0x0614B013<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
=== look_ctype_table ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xCDF7F155<br />
|}<br />
<br />
<source lang="C"><br />
typedef enum SceCTypeFlag {<br />
SCE_CTYPE_NONE = 0,<br />
SCE_CTYPE_UPPERCASE = 1,<br />
SCE_CTYPE_LOWERCASE = 2,<br />
SCE_CTYPE_NUMBER = 4,<br />
SCE_CTYPE_CONTROL = 8,<br />
SCE_CTYPE_SYMBOL = 0x10,<br />
SCE_CTYPE_INVISIBLE = 0x20,<br />
SCE_CTYPE_HEX_CASE = 0x40<br />
} SceCTypeFlag;<br />
<br />
char look_ctype_table(char ch);<br />
</source><br />
<br />
=== memchr ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x60DAEA30<br />
|}<br />
<br />
=== timingsafe_memcmp ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xB5A4D745<br />
|}<br />
<br />
timing constant memcmp<br />
<br />
=== memcmp ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0xF939E83D<br />
|}<br />
<br />
=== memcpy ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x40C88316<br />
|}<br />
<br />
=== memmove ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.50-3.60 || 0x6CC9C1A1<br />
|}<br />
<br />
On FW 1.69, this seems to be implemented incorrectly.<br />
<br />
=== memset ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x0AB9BF5C<br />
|}<br />
<br />
=== snprintf ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0xAE7A8981<br />
|}<br />
<br />
=== strchr ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.50-3.60 || 0x38463759<br />
|}<br />
<br />
=== strcmp ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x0B33BC43<br />
|}<br />
<br />
=== strlcat ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x12504E09<br />
|}<br />
<br />
=== strlcpy ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x7FB4EBEC<br />
|}<br />
<br />
=== strlen ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0xCFC6A9AC<br />
|}<br />
<br />
=== strncat ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0xA1D1C32C<br />
|}<br />
<br />
<source lang="C">char *strncat(char *s1, const char *s2, size_t n);</source><br />
<br />
=== strncmp ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.60-3.60 || 0x12CEE649<br />
|}<br />
<br />
<source lang="C">int strncmp(const char *s0, const char *s1, int n);</source><br />
<br />
=== strncpy ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x6D286146<br />
|}<br />
<br />
=== strncpy_s ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || not present<br />
|-<br />
| 0.990-3.60 || 0xFE39AEAC<br />
|}<br />
<br />
=== strnlen ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0xCD4BD884<br />
|}<br />
<br />
=== strrchr ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x7F0E0835<br />
|}<br />
<br />
=== strstr ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x1304A69D<br />
|}<br />
<br />
=== strtol ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0xAB77C5AA<br />
|}<br />
<br />
=== strtoll ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x87AAAFA2<br />
|}<br />
<br />
=== strtoul ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x4E5042DA<br />
|}<br />
<br />
=== tolower ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x0021DAF9<br />
|}<br />
<br />
<source lang="C">char tolower(char ch);</source><br />
<br />
=== toupper ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xA685DCB1<br />
|}<br />
<br />
<source lang="C">char toupper(char ch);</source><br />
<br />
=== __strcpy_chk ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.990 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0x545DA5FD<br />
|}<br />
<br />
Copy a string, with buffer overflow checking.<br />
<br />
<source lang="C">char * __strcpy_chk(char * dest, const char * src, size_t destlen);</source><br />
<br />
=== __strcat_chk ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.990 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0xDE4666F0<br />
|}<br />
<br />
Concatenate two strings, with buffer overflow checking.<br />
<br />
<source lang="C">char *__strcat_chk(char *dest, const char *src, SceSize destlen);</source><br />
<br />
== SceSysrootForKernel ==<br />
<br />
=== sceKernelSysrootSWBkptGetOriginalOpcodeForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x9CFF80F9<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
See [[#sceKernelSysrootSWBkptGetOriginalOpcodeForDriver]].<br />
<br />
=== sceKernelSysrootSetGetPrxDebugFlagFuncForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940-2.060.011 || 0xE635DFCC<br />
|-<br />
| 2.100.081-3.740.011 || not present<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Registers the function called by [[#sceKernelSysrootGetPrxDebugFlagForKernel]] which is also the fallback function called by [[#sceKernelSysrootGetCurrentAddressSpaceCBForKernel]].<br />
<br />
This function has been removed since System Software 2.100.081 because its feature was moved to [[#SceSysrootForKernel_26458702]].<br />
<br />
<source lang="C">int sceKernelSysrootSetGetPrxDebugFlagFuncForKernel(void *func);</source>3999F917<br />
<br />
=== sceKernelSysrootGetPrxDebugFlagForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x73522F65<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Calls the function registered by [[#sceKernelSysrootSetGetPrxDebugFlagFuncForKernel]] on System Software version < 2.100.081 and by [[#sceKernelSysrootRegisterDbgpHandlerForKernel]] on System Software version >= 2.100.081.<br />
<br />
<source lang="C">int sceKernelSysrootGetPrxDebugFlagForKernel(SceUID pid, SceUInt32 *pFlag);</source><br />
<br />
=== SceSysrootForKernel_5E7ECC37 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.692.000 || not present<br />
|-<br />
| 1.800.071-2.060.011 || 0x5E7ECC37<br />
|-<br />
| 2.100.081-3.740.011 || not present<br />
|}<br />
<br />
Registers the function called by [[#SceSysrootForKernel_5C86E49B]].<br />
<br />
This function has been removed since System Software version 2.100.081 because its feature is now provided by [[#sceKernelSysrootRegisterDbgpHandlerForKernel]].<br />
<br />
<source lang="C">int SceSysrootForKernel_5E7ECC37(void *func);</source><br />
<br />
=== SceSysrootForKernel_5C86E49B ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.692.000 || not present<br />
|-<br />
| 1.800.071-3.740.011 || 0x5C86E49B<br />
|}<br />
<br />
Calls the handler stored in SceSysrootDbgpHandler at offset 0x10 and registered by [[#SceSysrootForKernel_5E7ECC37]] or [[#sceKernelSysrootRegisterDbgpHandlerForKernel]].<br />
<br />
=== sceKernelSysrootSetProcessDebugSuspendFuncForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.010.031 || 0x4337841F<br />
|-<br />
| 3.10-3.740.011 || 0x4337841F<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Registers the function called by [[#sceKernelSysrootProcessDebugSuspendForKernel]].<br />
<br />
This function has been removed since System Software version 3.10 because its feature is already provided by [[#SceSysrootForKernel_D29BCA77]].<br />
<br />
<source lang="C">int sceKernelSysrootSetProcessDebugSuspendFuncForKernel(void *func);</source><br />
<br />
=== sceKernelSysrootProcessDebugSuspendForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x1247A825<br />
|}<br />
<br />
This is a guessed name. Official name might be as well sceKernelProcessDebugSuspendForKernel.<br />
<br />
Calls the function registered by either [[#sceKernelSysrootSetProcessDebugSuspendFuncForKernel]] or [[#SceSysrootForKernel_D29BCA77]].<br />
<br />
<source lang="C">int sceKernelSysrootProcessDebugSuspendForKernel(SceUID pid, int status);</source><br />
<br />
=== SceSysrootForKernel_150DBA2B ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.360.011 || 0x150DBA2B<br />
|-<br />
| 3.500.011-3.740.011 || not present<br />
|}<br />
<br />
=== SceSysrootForKernel_273EAE53 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.360.011 || 0x273EAE53<br />
|-<br />
| 3.500.011-3.740.011 || not present<br />
|}<br />
<br />
=== sceKernelSysrootIsKernelProcessForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.360.011 || 0xE0FC42C3<br />
|-<br />
| 3.500.011-3.740.011 || not present<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">SceBool sceKernelSysrootIsKernelProcessForKernel(void);</source><br />
<br />
=== sceKernelSysrootRegisterKPLSForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-1.70 || 0x23BEAF6B<br />
|-<br />
| 1.800.071-3.740.011 || not present<br />
|}<br />
<br />
=== SceSysrootForKernel_571E5B79 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x571E5B79<br />
|}<br />
<br />
See [[#SceSysrootForDriver_571E5B79]].<br />
<br />
=== sceKernelSysrootRegisterDbgpHandlerForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0x3999F917<br />
|}<br />
<br />
Registers a debug process handler.<br />
<br />
<source lang="C">int sceKernelSysrootRegisterDbgpHandlerForKernel(SceSysrootDbgpHandler *handler);</source><br />
<br />
=== SceSysrootForKernel_611F17A4 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.740.011 || 0x611F17A4<br />
|}<br />
<br />
Registers the function called by [[#SceSysrootForKernel_118657C6]].<br />
<br />
<source lang="C">int SceSysrootForKernel_611F17A4(void *func);</source><br />
<br />
=== SceSysrootForKernel_118657C6 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.740.011 || 0x118657C6<br />
|}<br />
<br />
Calls the function registered by [[#SceSysrootForKernel_611F17A4]].<br />
<br />
Used in [[SceExcpmgr]].<br />
<br />
Return value is called <code>pIntrMMUContext</code>, so a potential name is <code>sceKernelSysrootGetIntrMMUContext</code>.<br />
<br />
<source lang="C">SceKernelMMUContext* SceSysrootForKernel_118657C6(void);</source><br />
<br />
=== SceSysrootForKernel_081F2C20 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || not present<br />
|-<br />
| 1.60-1.69 || 0x081F2C20<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
Registers sceKernelGetProcessId_2 from [[SceKernelThreadMgr]].<br />
<br />
<source lang="C">int SceSysrootForKernel_081F2C20(void *func);</source><br />
<br />
=== SceSysrootForKernel_C5EAF5F7 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xC5EAF5F7<br />
|}<br />
<br />
Registers the function called by [[#SceSysrootForKernel_47724459]].<br />
<br />
<source lang="C">int SceSysrootForKernel_C5EAF5F7(void *func);</source><br />
<br />
=== SceSysrootForKernel_47724459 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x47724459<br />
|}<br />
<br />
Calls the function registered by [[#SceSysrootForKernel_C5EAF5F7]].<br />
<br />
=== SceSysrootForKernel_8747D415 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x8747D415<br />
|}<br />
<br />
Registers the function used by [[#SceSysrootForKernel_B27B7530]].<br />
<br />
<source lang="C">int SceSysrootForKernel_8747D415(void *func);</source><br />
<br />
=== SceSysrootForKernel_B27B7530 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xB27B7530<br />
|}<br />
<br />
Calls the function registered by [[#SceSysrootForKernel_8747D415]].<br />
<br />
Used by [[SceKernelBusError]].<br />
<br />
=== SceSysrootForKernel_82FC6405 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x82FC6405<br />
|}<br />
<br />
Registers the function used by [[#SceSysrootForKernel_CD4B84F7]].<br />
<br />
Used by [[SceKernelBusError]].<br />
<br />
<source lang="C">int SceSysrootForKernel_82FC6405(void *func);</source><br />
<br />
=== SceSysrootForKernel_CD4B84F7 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xCD4B84F7<br />
|}<br />
<br />
Calls the function registered by [[#SceSysrootForKernel_82FC6405]].<br />
<br />
Used by [[SceKernelBusError]].<br />
<br />
=== SceSysrootForKernel_733C243E ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x733C243E<br />
|}<br />
<br />
Registers many Sysroot [[SceProcessmgr]] callbacks.<br />
<br />
<source lang="C">int SceSysrootForKernel_733C243E(const SceSysrootForKernel_733C243E_struct *pParam);</source><br />
<br />
=== SceSysrootForKernel_7334F1E8 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x7334F1E8<br />
|}<br />
<br />
Calls [[SceProcessmgr#SceProcessmgrForKernel_C77C2085]] function registered by [[#SceSysrootForKernel_733C243E]].<br />
<br />
<source lang="C">int SceSysrootForKernel_7334F1E8(SceUID pid);</source><br />
<br />
=== SceSysrootForKernel_D29BCA77 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.740.011 || 0xD29BCA77<br />
|}<br />
<br />
Registers many Sysroot [[SceProcessmgr]] callbacks.<br />
<br />
<source lang="C">int SceSysrootForKernel_D29BCA77(const SceSysrootForKernel_D29BCA77_struct *pParam);</source><br />
<br />
=== SceSysrootForKernel_DD7821AA ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xDD7821AA<br />
|}<br />
<br />
Registers the function called by [[#SceSysrootForKernel_340575CB]].<br />
<br />
<source lang="C">int SceSysrootForKernel_DD7821AA(void *func);</source><br />
<br />
=== SceSysrootForKernel_340575CB ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x340575CB<br />
|}<br />
<br />
Return some PID.<br />
<br />
<source lang="C">SceUID SceSysrootForKernel_340575CB(void);</source><br />
<br />
=== sceKernelSysrootSetCheckRemapCodeForUserFuncForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xBE1EF51C<br />
|}<br />
<br />
Registers the function called by [[#sceKernelSysrootCheckRemapCodeForUserForKernel]].<br />
<br />
<source lang="C">int sceKernelSysrootSetCheckRemapCodeForUserFuncForKernel(void *func);</source><br />
<br />
=== sceKernelSysrootCheckRemapCodeForUserForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xF8769E86<br />
|}<br />
<br />
=== sceKernelSysrootAllocCurrentProcessHeapForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x2F75C1DC<br />
|}<br />
<br />
<source lang="C">void *sceKernelSysrootAllocCurrentProcessHeapForKernel(SceSize size);</source><br />
<br />
=== sceKernelSysrootCorelockUnlockForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xAE55B7CC<br />
|}<br />
<br />
Calls [[#SceCpuForKernel_A5C9DBBA]].<br />
<br />
<source lang="C">void sceKernelSysrootCorelockUnlockForKernel(void);</source><br />
<br />
=== SceSysrootForKernel_21F5790B ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || not present<br />
|-<br />
| 3.60 || 0x21F5790B<br />
|}<br />
<br />
Registers a function related to kernel panic.<br />
<br />
<source lang="C">int SceSysrootForKernel_21F5790B(void *func);</source><br />
<br />
=== SceSysrootForKernel_0DF574A9 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || not present<br />
|-<br />
| 3.60 || 0x0DF574A9<br />
|}<br />
<br />
Calls the function related to kernel panic registered by [[#SceSysrootForKernel_21F5790B]].<br />
<br />
<source lang="C">int SceSysrootForKernel_0DF574A9(void);</source><br />
<br />
=== SceSysrootForKernel_2D6B2A79 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x2D6B2A79<br />
|}<br />
<br />
Registers a function related to kernel panic, called by [[#SceSysrootForKernel_CC7A0E63]].<br />
<br />
=== SceSysrootForKernel_CC7A0E63 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xCC7A0E63<br />
|}<br />
<br />
Calls a function related to kernel panic, registered by [[#SceSysrootForKernel_2D6B2A79]].<br />
<br />
<source lang="C"><br />
// type: 1: kernel_assertion_or_panic, 3: kernel_exception<br />
// size: must be <= 0x1000<br />
// pBuf: address of the buffer got using SceDebugForKernel_BEF921A2<br />
int SceSysrootForKernel_CC7A0E63(int type, SceSize size, const char *pBuf);<br />
</source><br />
<br />
=== SceSysrootForKernel_1D84C4D4 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0x1D84C4D4<br />
|}<br />
<br />
Get module name, fingerprint and base from address.<br />
<br />
<source lang="C">int SceSysrootForKernel_1D84C4D4(SceUID pid, uintptr_t address, SceUInt32 *pDbgFingerprint, SceUInt32 *pModuleBase, char *module_name);</source><br />
<br />
=== SceSysrootForKernel_5B5EBFB1 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x5B5EBFB1<br />
|}<br />
<br />
Registers pointer to SceLT5 used by [[#SceSysrootForKernel_E20F6FC8]].<br />
<br />
<source lang="C">int SceSysrootForKernel_5B5EBFB1(uint a1);</source><br />
<br />
=== SceSysrootForKernel_41636522 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.692.000 || not present<br />
|-<br />
| 1.800.071-3.740.011 || 0x41636522<br />
|}<br />
<br />
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.<br />
<br />
<source lang="C">uint64_t SceSysrootForKernel_41636522(void);</source><br />
<br />
=== SceSysrootForKernel_E20F6FC8 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.692.000 || not present<br />
|-<br />
| 1.800.071-3.740.011 || 0xE20F6FC8<br />
|}<br />
<br />
Same as [[#SceSysrootForKernel_41636522]] but "asynchronous".<br />
<br />
Used by SceDebug Kernel Exceptions handlers.<br />
<br />
<source lang="C">uint64_t SceSysrootForKernel_E20F6FC8(void);</source><br />
<br />
=== SceSysrootForKernel_1D8DB3A5 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.692.000 || not present<br />
|-<br />
| 1.800.071-3.740.011 || 0x1D8DB3A5<br />
|}<br />
<br />
Same as [[#SceSysrootForKernel_41636522]] but "asynchronous".<br />
<br />
Returns 0 on success, 0x80020006 if pTime is a NULL pointer.<br />
<br />
<source lang="C">int SceSysrootForKernel_1D8DB3A5(SceUInt64 *pTime);</source><br />
<br />
=== sceKernelSysrootCorelockLockForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x8E4B61F1<br />
|}<br />
<br />
Calls [[#SceCpuForKernel_9D72DD1B]].<br />
<br />
<source lang="C">int sceKernelSysrootCorelockLockForKernel(SceUInt32 core);</source><br />
<br />
=== SceSysrootForKernel_06182D59 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.692.000 || not present<br />
|-<br />
| 1.800.071-3.740.011 || 0x06182D59<br />
|}<br />
<br />
Reimplementation:<br />
<source lang="C"><br />
int SceSysrootForKernel_06182D59(int idx) {<br />
return *(uint32_t *)(pSysroot + 0x20) + (idx << 0x5);<br />
}<br />
</source><br />
<br />
<source lang="C">int SceSysrootForKernel_06182D59(int idx);</source><br />
<br />
=== SceSysrootForKernel_7385CADE ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.990.000 || not present<br />
|-<br />
| 1.000.071-3.740.011 || 0x7385CADE<br />
|}<br />
<br />
Get current syscall's PID.<br />
<br />
<source lang="C"><br />
// Returns KERNEL_PID if the function has not been set<br />
SceUID SceSysrootForKernel_7385CADE(void);<br />
</source><br />
<br />
=== SceSysrootForKernel_D441DC34 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.990.000 || not present<br />
|-<br />
| 1.000.071-3.740.011 || 0xD441DC34<br />
|}<br />
<br />
Calls a callback registered by [[#SceSysrootForKernel_26458702]], related to syscall frame printing on kernel panic.<br />
<br />
=== sceKernelSysrootGetSysrootClassItemsizeForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xEEB867C0<br />
|}<br />
<br />
This is a guessed name. Derived from get_SceKernelSysrootClass_itemsize.<br />
<br />
On System Software version 0.990, returns hardcoded value 0x470.<br />
<br />
On System Software version 3.200.010, returns hardcoded value 0x440.<br />
<br />
On System Software version 3.600.011, returns hardcoded value 0x41C.<br />
<br />
<source lang="C">SceSize sceKernelSysrootGetSysrootClassItemsizeForKernel(void);</source><br />
<br />
=== sceKernelGetSysrootClassObjectForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x085C2BCB<br />
|}<br />
<br />
This is a guessed name. Derived from get_SceKernelSysrootClass_object.<br />
<br />
<source lang="C">SceKernelObject *sceKernelGetSysrootClassObjectForKernel(void);</source><br />
<br />
=== sceKernelSysrootGetLibraryDBForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-2.060.011 || 0xCD70C9D7<br />
|-<br />
| 2.100.081-3.740.011 || not present<br />
|}<br />
<br />
Equivalent to [[SceProcessmgr#sceKernelGetProcessLibdbForKernel|sceKernelGetProcessLibdbForKernel(0x10005)]] in 3.60<br />
<br />
<source lang="C"><br />
// size is 0x34-bytes on FW 2.00<br />
void *sceKernelSysrootGetLibraryDBForKernel(void *pSysroot);<br />
</source><br />
<br />
=== sceKernelSysrootSetLibraryDBForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-2.060.011 || 0xCB58A0F4<br />
|-<br />
| 2.100.081-3.740.011 || not present<br />
|}<br />
<br />
Maybe sets a pointer to the library stub structure. See [[Modules]].<br />
<br />
<source lang="C"><br />
// size is 0x34-bytes on FW 2.00<br />
int sceKernelSysrootSetLibraryDBForKernel(void *pSysroot, void *pLibDb);<br />
</source><br />
<br />
=== sceKernelSysrootGetProcessLibraryDBForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-2.060.011 || 0xF1037820<br />
|-<br />
| 2.100.081-3.740.011 || not present<br />
|}<br />
<br />
Equivalent to [[SceProcessmgr#sceKernelGetProcessLibdbForKernel|sceKernelGetProcessLibdbForKernel(pid)]] in System Software version 3.600.011.<br />
<br />
The return value of this function is an integer on error, but returns a pointer to LibraryDB on success.<br />
<br />
<source lang="C"><br />
// size is 0x34-bytes on FW 2.00<br />
int sceKernelSysrootGetProcessLibraryDBForKernel(SceUID pid);<br />
</source><br />
<br />
=== sceKernelSysrootAllocForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.360.011 || 0xB0149E69<br />
|-<br />
| 3.500.011-3.740.011 || Not present<br />
|}<br />
<br />
Allocates memory from the "Sysroot heap". The Sysroot heap is located after <code>SceSysroot</code> structure and consumes the rest of the page. Allocations from this "heap" are permanent and cannot be returned - there is no <code>sceKernelSysrootFreeForKernel</code>.<br />
<br />
Usage of this function is not recommended because of the lack of a "free" function. Use [[SceSysmem#sceKernelAllocForKernel]] instead.<br />
<br />
<source lang="C">void *sceKernelSysrootAllocForKernel(SceSize size);</source><br />
<br />
=== sceKernelSysrootSetStatusForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.740.011 || 0xA84676E3<br />
|}<br />
<br />
{| class="wikitable"<br />
|-<br />
! status !! description<br />
|-<br />
| 3 || Global malloc heap initialization completed.<br />
|-<br />
| 4 || Start initialization for load the module<br />
|-<br />
| 0x10 || Initialization to load the module is complete<br />
|-<br />
| 0x100 || First process create<br />
|-<br />
| 0x1000 || Kernel boot completed.<br />
|}<br />
<br />
<source lang="C">int sceKernelSysrootSetStatusForKernel(SceUInt32 status);</source><br />
<br />
=== sceKernelSysrootGetProcessCBExitDeleteThreadForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xBBFD2E3C<br />
|}<br />
<br />
=== sceKernelSysrootGetCurrentProcessCBForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x9991B1AF<br />
|}<br />
<br />
=== sceKernelSysrootGetCurrentThreadAttrForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x73601453<br />
|}<br />
<br />
<source lang="C">int sceKernelSysrootGetCurrentThreadAttrForKernel(SceUint32 *pThrAttr);</source><br />
<br />
=== sceKernelSysrootGetCurrentTimeForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || 0x4FCFA359<br />
|}<br />
<br />
<source lang="C">SceRtcTick *sceKernelSysrootGetCurrentTimeForKernel(void);</source><br />
<br />
=== sceKernelSysrootGetSystemTimeForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-1.692.000 || 0xE0D41319<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int sceKernelSysrootGetSystemTimeForKernel(SceRtcTick *pTick)</source><br />
<br />
=== sceKernelSysrootGetSystemTimeLowForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-1.692.000 || 0x2464329D<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int sceKernelSysrootGetSystemTimeLowForKernel(void);</source><br />
<br />
=== sceKernelSysrootAssertSysrootForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-1.692.000 || 0x1B7F150F<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
Check sysroot->magic (offset 0xC must be 0xBA97F5A1) and sysroot->magic2 (offset 0x20C must be 0xA008B0C3).<br />
<br />
<source lang="C">int sceKernelSysrootAssertSysrootForKernel(void *sysroot);</source><br />
<br />
=== sceKernelSysrootSetVbaseResetVectorForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.740.011 || 0x0F2F2B4E<br />
|}<br />
<br />
=== sceKernelSysrootThreadMgrStartAfterProcessForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.740.011 || 0x0EB5D7CD<br />
|}<br />
<br />
=== sceKernelSysrootGetCurrentProcessForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.996.090 || 0x5B7570C5<br />
|}<br />
<br />
Return the current process id.<br />
<br />
<source lang="C">SceUID sceKernelSysrootGetCurrentProcessForKernel(void);</source><br />
<br />
=== sceKernelSysrootTrapThreadAfterSyscallForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.740.011 || 0x9139E22B<br />
|}<br />
<br />
Calls a callback registered by [[#SceSysrootForKernel_26458702]].<br />
<br />
Prints syscall_critical_usage.<br />
<br />
=== sceKernelSysrootReturnFromExcpToThreadForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.740.011 || 0xDADFF828<br />
|}<br />
<br />
Used in [[SceExcpmgr]].<br />
<br />
<source lang="C">int sceKernelSysrootReturnFromExcpToThreadForKernel(void);</source><br />
<br />
=== sceKernelSysrootBacktraceForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.740.011 || 0xCC893F37<br />
|}<br />
<br />
See also [[SceKernelModulemgr#SceBacktraceForDriver]].<br />
<br />
<source lang="C">int sceKernelSysrootBacktraceForKernel(SceUID threadId, SceKernelCallFrame *pCallFrameBuffer, SceSize numBytesBuffer, SceUInt32 *pNumReturn, SceInt32 mode);</source><br />
<br />
=== sceKernelSysrootPrintBacktraceForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.740.011 || 0x491CE8DF<br />
|}<br />
<br />
See also [[SceKernelModulemgr#SceBacktraceForDriver]].<br />
<br />
<source lang="C">int sceKernelSysrootPrintBacktraceForKernel(SceUID processId, const SceKernelCallFrame *pCallFrame, SceUInt32 numFrames);</source><br />
<br />
=== sceKernelSysrootRegisterBacktraceForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940-3.010.031 || 0x1C307A31<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="c">int sceKernelSysrootRegisterBacktraceForKernel(int (__cdecl *func)());</source><br />
<br />
=== sceKernelSysrootGetSharedMemoryForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.740.011 || 0xC8C8C321<br />
|}<br />
<br />
=== sceKernelSysrootSetSharedMemoryForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.740.011 || 0xFBB91741<br />
|}<br />
<br />
=== sceKernelSysrootGetUIDEntryHeapForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.740.011 || 0x88DE85EF<br />
|}<br />
<br />
Temp name was sceKernelSysrootGetPUIDEntryHeapForKernel.<br />
<br />
Gets the UID Entry Heap of the process.<br />
<br />
Kernel process's UID entry heap is the GUIDEntryHeap. All other process' UID entry heaps are PUID heaps.<br />
<br />
<source lang="C">int sceKernelSysrootGetUIDEntryHeapForKernel(SceUID pid, void **entryHeap);</source><br />
<br />
=== sceKernelSysrootGetStatusForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.740.011 || 0x5C426B19<br />
|}<br />
<br />
<source lang="C">int sceKernelSysrootGetStatusForKernel(void);</source><br />
<br />
=== sceKernelSysrootIofilemgrStartForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xF6A6D205<br />
|}<br />
<br />
=== SceSysrootForKernel_F9FB9A2A ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-2.060.011 || 0xF9FB9A2A<br />
|-<br />
| 2.100.081-3.740.011 || not present<br />
|}<br />
<br />
Registers the function called by [[#sceKernelSysrootGetCurrentAddressSpaceCBForKernel]].<br />
<br />
This function has been removed since System Software 2.100.081 because its feature was moved to [[#SceSysrootForKernel_D29BCA77]].<br />
<br />
<source lang="C">int SceSysrootForKernel_F9FB9A2A(void *func);</source><br />
<br />
=== sceKernelSysrootGetCurrentAddressSpaceCBForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940-3.740.011 || 0x63EBB05B<br />
|}<br />
<br />
Gets the current Address Space's control block via TPIDRPRW.<br />
<br />
This function calls a callback registered by [[#SceSysrootForKernel_F9FB9A2A]] on System Software version < 2.10 and by [[#SceSysrootForKernel_D29BCA77]] on System Software version >= 2.10, if it was registered, else a fallback callback. The fallback callback is registered by [[#SceSysrootForKernel_E635DFCC]] on System Software version < 2.10 and by [[#SceSysrootForKernel_26458702]] on System Software version >= 2.10.<br />
<br />
<source lang="C">SceUIDAddressSpaceObject *sceKernelSysrootGetCurrentAddressSpaceCBForKernel(void);</source><br />
<br />
=== SceSysrootForKernel_BF82931F ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.500.151-3.740.011 || 0xBF82931F<br />
|}<br />
<br />
Calls the function registered by [[#SceSysrootForDriver_2BE874EF]].<br />
<br />
No usage seen on CEX OS. Maybe used in DEX/TOOL OS.<br />
<br />
<source lang="C">int SceSysrootForKernel_BF82931F(int maybe_app_id, void *pOut);</source><br />
<br />
=== SceSysrootForKernel_6D111FA7 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.500.151-3.740.011 || 0x6D111FA7<br />
|}<br />
<br />
Calls the function registered by [[#SceSysrootForDriver_3B19B06B]].<br />
<br />
Used only in [[SceCoredump]].<br />
<br />
<source lang="C">int SceSysrootForKernel_6D111FA7(int maybe_app_id, void *pOut);</source><br />
<br />
=== SceSysrootForKernel_2A03DFA1 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x2A03DFA1<br />
|}<br />
<br />
Calls the function registered by [[#SceSysrootForDriver_70AD47A9]].<br />
<br />
Used only in [[SceCoredump]].<br />
<br />
<source lang="C"><br />
// pOut: A buffer of at least 0xF8 bytes<br />
int SceSysrootForKernel_2A03DFA1(void *pOut);<br />
</source><br />
<br />
=== sceKernelSysrootAppMgrSpawnProcessForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x3ACACD22<br />
|}<br />
<br />
=== sceKernelSysrootGetCachedSecureModuleInfoForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xF10AB792<br />
|}<br />
<br />
Temp name was sceKernelSysrootGetSmSelfInfoForKernel.<br />
<br />
{| class="wikitable"<br />
! Index !! SM SELF location<br />
|-<br />
| 0 || os0:sm/gcauthmgr_sm.self<br />
|-<br />
| 1 || os0:sm/rmauth_sm.self<br />
|-<br />
| 2 || os0:sm/encdec_w_portability_sm.self<br />
|}<br />
<br />
<source lang="C">int sceKernelSysrootGetCachedSecureModuleForKernel(SceCachedSecureModule id, SceCachedSecureModuleInfo *pInfo);</source><br />
<br />
=== sceKernelSysrootGetProcessSelfAuthInfoForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x4F0A4066<br />
|}<br />
<br />
Temp name was sceSysrootGetSelfAuthInfoForKernel.<br />
<br />
<source lang="C">int sceKernelSysrootGetProcessSelfAuthInfoForKernel(SceUID pid, SceSelfAuthInfo *pSelfAuthInfo);</source><br />
<br />
=== sceKernelSysrootGetProcessTitleIdForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xEC3124A3<br />
|}<br />
<br />
Temp name was sceSysrootGetProcessTitleIdForPidForKernel.<br />
<br />
<source lang="C">int sceKernelSysrootGetProcessTitleIdForKernel(SceUID pid, char *title_id, SceSize len);</source><br />
<br />
=== sceKernelSysrootSetGetFunctionNameByNIDFuncForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.692.000 || not present<br />
|-<br />
| 1.800.071-3.740.011 || 0xB39CD708<br />
|}<br />
<br />
Registers the function called by [[#sceKernelSysrootGetFunctionNameByNIDForKernel]].<br />
<br />
<source lang="c">int sceKernelSysrootSetGetFunctionNameByNIDFuncForKernel(void *func);</source><br />
<br />
=== sceKernelSysrootGetFunctionNameByNIDForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.692.000 || not present<br />
|-<br />
| 1.800.071-3.740.011 || 0x0B79E220<br />
|}<br />
<br />
Mirror of [[SceSysLibTrace#sceNidsymtblGetFunctionNameByNIDForDriver]].<br />
<br />
<source lang="c">int sceKernelSysrootGetFunctionNameByNIDForKernel(SceNID funcnid, const char **name);</source><br />
<br />
=== SceSysrootForKernel_26458702 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0x26458702<br />
|}<br />
<br />
Registers some callbacks for example the fallback callback called by [[#sceKernelSysrootGetCurrentAddressSpaceCBForKernel]].<br />
<br />
=== SceSysrootForKernel_B171CC2D ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0xB171CC2D<br />
|}<br />
<br />
Register some ModuleMgr handlers.<br />
<br />
Used by [[SceKernelModulemgr]].<br />
<br />
<source lang="C">int SceSysrootForKernel_B171CC2D(SceSysrootModulemgrHandlers *pHandlers);</source><br />
<br />
=== sceKernelSysrootGetProcessSyscallInfoForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xFF9F80FF<br />
|}<br />
<br />
<source lang="c">int sceKernelSysrootGetProcessSyscallInfoForKernel(SceUID pid, const void *PC, SceSyscallInfo *pInfo);</source><br />
<br />
=== sceKernelSysrootGetVbaseResetVectorForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xCC85905B<br />
|}<br />
<br />
Returns the exception vectors base address. The address of the exception vectors for the CPU <code>i</code> is: <code>sceKernelSysrootGetVbaseResetVectorForKernel() + 0x40 * i</code>.<br />
<br />
<source lang="C">void *sceKernelSysrootGetVbaseResetVectorForKernel(void);</source><br />
<br />
=== sceKernelSysrootSetLicMgrGetLicenseStatusFuncForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x71DB83A2<br />
|}<br />
<br />
Registers [[SceSblPostSsMgr#sceSblLicMgrGetLicenseStatusForDriver]].<br />
<br />
<source lang="c">int sceKernelSysrootSetLicMgrGetLicenseStatusFuncForKernel(int (__cdecl *sceSblLicMgrGetLicenseStatusForDriver)());</source><br />
<br />
=== sceKernelSysrootLicMgrGetLicenseStatusForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x377895EB<br />
|}<br />
<br />
Called by [[SceSblAuthMgr#sceSblAuthMgrAuthHeaderForKernel|sceSblAuthMgrAuthHeaderForKernel]] before Cmep request.<br />
<br />
<source lang="C">int sceKernelSysrootLicMgrGetLicenseStatusForKernel(void);</source><br />
<br />
=== sceKernelSysrootGetSysrootForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x3E455842<br />
|}<br />
<br />
Temp name was sceKernelGetSysbaseForKernel.<br />
<br />
Returns pointer to SceUIDSysrootObject in SceSysmem.<br />
<br />
<source lang="C">SceUIDSysrootObject *sceKernelSysrootGetSysrootForKernel(void);</source><br />
<br />
=== sceKernelSysrootGetKblParamForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.740.011 || 0x9DB56D1F<br />
|}<br />
<br />
Temp name was sceKernelGetSysrootBufferForKernel, sceSysrootGetSysrootBufferForKernel.<br />
<br />
Returns pointer to [[KBL Param]].<br />
<br />
<source lang="C">SceKblParam *sceKernelSysrootGetKblParamForKernel(void);</source><br />
<br />
=== sceKernelSysrootGetSoCRevisionForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xD3872270<br />
|}<br />
<br />
return pSysroot->soc_revision;<br />
<br />
<source lang="C">int sceKernelSysrootGetSoCRevisionForKernel(void);</source><br />
<br />
=== sceKernelSysrootGetPervasiveUnkDwordForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xFFD6E24D<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Returns value initially read from physical address 0xE3100004 (ScePervasiveMisc + 0x4).<br />
<br />
return pSysroot->pervasive_unk_dword;<br />
<br />
<source lang="C">int sceKernelSysrootGetPervasiveUnkDwordForKernel(void);</source><br />
<br />
=== sceKernelSysrootGetKermitRevisionForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x403B509E<br />
|}<br />
<br />
return pSysroot->kermit_revision;<br />
<br />
Used by [[SceKernelBusError]], [[SceSysStateMgr]].<br />
<br />
<source lang="C"><br />
// Return value is 0x1FFFF-masked, at least on recent System Software versions.<br />
SceUInt32 sceKernelSysrootGetKermitRevisionForKernel(void);<br />
</source><br />
<br />
=== sceKernelSysrootGetErnieSleepFactorForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.996.090-3.740.011 || 0xAB3CC7D0<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
See [[KBL Param#Sleep Factor]].<br />
<br />
return kbl_param->sleep_factor;<br />
<br />
<source lang="C">int sceKernelSysrootGetErnieSleepFactorForKernel(void);</source><br />
<br />
=== sceKernelSysrootGetErnieWakeupFactorForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x2F97041A<br />
|}<br />
<br />
This is the official name. Temp name was sceSysrootGetWakeupFactorForKernel.<br />
<br />
See [[KBL Param#Wakeup Factor]].<br />
<br />
return kbl_param->wakeup_factor;<br />
<br />
<source lang="C">int sceKernelSysrootGetErnieWakeupFactorForKernel(void);</source><br />
<br />
=== sceKernelSysrootGetSessionIdForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.81 || not present<br />
|-<br />
| 2.000.081-3.740.011 || 0x84783B71<br />
|}<br />
<br />
Writes kbl_param->session_id to buffer.<br />
<br />
pSessionId buffer size is 0x10 bytes.<br />
<br />
<source lang="C">int sceKernelSysrootGetSessionIdForKernel(char *pSessionId);</source><br />
<br />
=== sceKernelSysrootIsExternalBootModeForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x89D19090<br />
|}<br />
<br />
return *(int *)(kbl_param->boot_type_indicator_1) & 1;<br />
<br />
<source lang="C">int sceKernelSysrootIsExternalBootModeForKernel(void);</source><br />
<br />
=== sceKernelSysrootIsSomeBootModeForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-0.996.090 || not present<br />
|-<br />
| 1.000.071-3.740.011 || 0x7B7F8171<br />
|}<br />
<br />
This is a guessed name. A possible name is sceKernelIsAllowSdCardFromMgmt.<br />
<br />
Used by [[SceSdif]], [[SceExfatfs]].<br />
<br />
[[SceExfatfs]] will mount sd0: instead of gro0:/grw0: when this function returns SCE_TRUE.<br />
<br />
return (*(int *)(kbl_param->boot_type_indicator_1) >> 19) & 1;<br />
<br />
Returns true if boot_type_indicator_1 has flag 0x80000 ?sd mode? - (Mgmt bit 1)<br />
<br />
<source lang="C">int sceKernelSysrootIsSomeBootModeForKernel(void);</source><br />
<br />
=== sceKernelSysrootIsExternalBootMode2ForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x7918D44E<br />
|}<br />
<br />
This is a guessed name. Temp name was sceSysrootIsSomeBootMode2ForKernel. A possible name is sceKernelIsAllowFwCheckSkip.<br />
<br />
return kbl_param->boot_type_indicator_1[2] & 1;<br />
<br />
Return true if boot_type_indicator_1 has flag 0x10000 but it seems to be never set in external (release) second_loader. It allows to bypass current fw version check for module loading.<br />
<br />
<source lang="C">int sceKernelSysrootIsExternalBootMode2ForKernel(void);</source><br />
<br />
=== sceKernelSysrootIsUartModeForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xAE7A8F1D<br />
|}<br />
<br />
This is a guessed name. Temp name was sceSysrootIsSomeModeForKernel.<br />
<br />
Returns true if (kbl_param->boot_flags[1] != 0xFF).<br />
<br />
Used to check if UART must be initialized or not.<br />
<br />
<source lang="C">int sceKernelSysrootIsUartModeForKernel(void);</source><br />
<br />
=== sceKernelSysrootIsSafeModeForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x834439A7<br />
|}<br />
<br />
<source lang="C">int sceKernelSysrootIsSafeModeForKernel(void);</source><br />
<br />
=== sceKernelSysrootIsUpdateModeForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xB0E1FC67<br />
|}<br />
<br />
<source lang="C">int sceKernelSysrootIsUpdateModeForKernel(void);</source><br />
<br />
=== sceKernelSysrootIsBsodRebootForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0x4373AC96<br />
|}<br />
<br />
return ((pKblParam->wakeup_factor) & 0x7Fu) == 0x17;<br />
<br />
<source lang="C">int sceKernelSysrootIsBsodRebootForKernel(void);</source><br />
<br />
=== sceKernelSysrootIsUsbEnumWakeupForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.996.090-3.740.011 || 0x79C9AE10<br />
|}<br />
<br />
<source lang="C"><br />
if ( *(int *)(kbl_param->unk_C0) & 0x90000 )<br />
return 1;<br />
else<br />
return (*(int *)(kbl_param->wakeup_factor) & 0x7Fu) == 0xF;<br />
</source><br />
<br />
<source lang="C">int sceKernelSysrootIsUsbEnumWakeupForKernel(void);</source><br />
<br />
=== sceKernelSysrootIsUnknownRebootForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0xE4EA1960<br />
|}<br />
<br />
return (*(int *)(kbl_param->wakeup_factor) & 0x7Fu) <= 1;<br />
<br />
<source lang="C">int sceKernelSysrootIsUnknownRebootForKernel(void);</source><br />
<br />
=== sceKernelSysrootIsManufacturingModeForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940-3.740.011 || 0x55392965<br />
|}<br />
<br />
This is a guessed name. Temp name was sceSysrootUseExternalStorageForKernel.<br />
<br />
When returns true it allows loading sd0:psp2config.skprx.<br />
<br />
Returns true when Manufacturing Mode flag is set:<br />
<br />
return (*(int *)(kbl_param->boot_type_indicator_1) >> 2) & 1;<br />
<br />
<source lang="C">int sceKernelSysrootIsManufacturingModeForKernel(void);</source><br />
<br />
=== sceKernelSysrootUseInternalStorageForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x50FE3B4D<br />
|}<br />
<br />
Returns true when use internal storage flag is not set:<br />
<br />
return *(char *)(kbl_param->boot_flags[5]) & 1 ^ 1;<br />
<br />
<source lang="C">int sceKernelSysrootUseInternalStorageForKernel(void);</source><br />
<br />
=== sceKernelSysrootGetThreadAccessLevelForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x20009397<br />
|}<br />
<br />
Calls int (__cdecl *GetThreadAccessLevel)(); // 0x344 on 3.60<br />
<br />
<source lang="c">int sceKernelSysrootGetThreadAccessLevelForKernel(void);</source><br />
<br />
=== sceKernelSysrootAllocRemoteProcessHeapForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xD351EBC8<br />
|}<br />
<br />
Temp name was sceKernelAllocHeapMemoryForKernel.<br />
<br />
Same as <code>sceKernelAllocHeapMemoryWithOptForDriver</code> but does set <code>pid</code> to 0x1000B.<br />
<br />
Checks that pid is 0x10013 or 0x10005 (kernel).<br />
<br />
<source lang="C">void* sceKernelSysrootAllocRemoteProcessHeapForKernel(SceUID pid, SceSize size, SceKernelHeapMemoryOpt *pOpt);</source><br />
<br />
=== sceKernelSysrootGetModulePrivateForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x37EC12BB<br />
|}<br />
<br />
data : 3: system memory (0xDC-bytes), 7: some process data (?-bytes), 9: kbl module cb (0xAC-bytes)<br />
<br />
<source lang="C">void *sceKernelSysrootGetModulePrivateForKernel(int idx);</source><br />
<br />
=== sceKernelSysrootSetModulePrivateForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x7A7E7C0C<br />
|}<br />
<br />
<source lang="C">void sceKernelSysrootSetModulePrivateForKernel(int idx, void *data);</source><br />
<br />
=== sceKernelSysrootSetSysrootForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x36916C30<br />
|}<br />
<br />
<source lang="C">void sceKernelSysrootSetSysrootForKernel(SceUID sysroot_uid);</source><br />
<br />
=== sceKernelSysrootProcessmgrStart2ForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.011-3.740.011 || 0x62E8F511<br />
|}<br />
<br />
=== sceKernelSysrootDbgpSuspendProcessAndWaitResumeForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940-3.740.011 || 0x256B2394<br />
|}<br />
<br />
<source lang="C">sceKernelSysrootDbgpSuspendProcessAndWaitResumeForKernel(SceUID pid, SceUID modid, SceUInt32 stopReason, SceUInt64 time);</source><br />
<br />
=== sceKernelSysrootSetIsUserModeThreadFuncForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || 0x5BD911A8<br />
|-<br />
| 2.100.081-3.740.011 || not present<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
This function has been removed since System Software version 2.100.081 because its feature is now provided by [[#sceKernelSysrootRegisterDbgpHandlerForKernel]].<br />
<br />
<source lang="C">int sceKernelSysrootSetIsUserModeThreadFuncForKernel(void *func);</source><br />
<br />
=== sceKernelSysrootIsUserModeThreadForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.011-3.740.011 || 0x7FC7A163<br />
|}<br />
<br />
=== sceKernelSysrootGetSecureStatusForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940 || 0x0A63CA5E<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
return *(uint *)some_buf->field_0x28 & 1;<br />
<br />
<source lang="C">int sceKernelSysrootGetSecureStatusForKernel(void);</source><br />
<br />
=== sceKernelSysrootIsSecureStateForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940 || 0x3193DAB2<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
return (*(uint *)some_buf->field_0x28 ^ 1) & 1;<br />
<br />
<source lang="C">SceBool sceKernelSysrootIsSecureStateForKernel(void);</source><br />
<br />
=== sceKernelSysrootIsColdBootForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940-3.60 || 0xD7198963<br />
|}<br />
<br />
return (*(uint *)some_buf->field_0x28 & 10; // FW 3.60 in IDA PRO<br />
<br />
return ((*(uint *)some_buf->field_0x28 ^ 0x10) << 0x1b) >> 0x1f; // FW 0.940 in Ghidra<br />
<br />
<source lang="C">int sceKernelSysrootIsColdBootForKernel(void);</source><br />
<br />
== SceSysrootForDriver ==<br />
<br />
=== SceSysrootForDriver_6219CC14 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.65 || 0x6219CC14<br />
|}<br />
<br />
Used in [[SceUlobjMgr#SceUlobjMgrForDriver_332F2E58]].<br />
<br />
<source lang="C">int SceSysrootForDriver_6219CC14(int a1, int a2, int a3, int a4, int a5);</source><br />
<br />
=== SceSysrootForDriver_F804F761 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.18 || not present<br />
|-<br />
| 3.300.041-3.740.011 || 0xF804F761<br />
|}<br />
<br />
Official name might be sceKernelSysrootHasSDCardSupportForDriver.<br />
<br />
This function always returns <code>SCE_FALSE</code> on some release System Software versions, for example 3.500.000 and 3.600.011.<br />
<br />
Used in [[SceSdstor]] and [[SceVshBridge#vshSdGetCardInfo]].<br />
<br />
If this function returns <code>SCE_TRUE</code>, then <code>[[SceSdif#get_sd_context_part_validate_sd]](1)</code> is called.<br />
<br />
<source lang="C">SceBool SceSysrootForDriver_F804F761(void);</source><br />
<br />
=== sceKernelSysrootSetVipRpcDebugFuncForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xA6A0A038<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">void sceKernelSysrootSetVipRpcDebugFuncForDriver(SceKernelSysrootVipRpcDebugFunc func);</source><br />
<br />
=== sceKernelSysrootClearVipRpcDebugFuncForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x0ECD711E<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">void sceKernelSysrootClearVipRpcDebugFuncForDriver();</source><br />
<br />
=== sceKernelSysrootGetVipRpcDebugFuncForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x483EF108<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">SceKernelSysrootVipRpcDebugFunc sceKernelSysrootGetVipRpcDebugFuncForDriver();</source><br />
<br />
=== sceKernelSysrootSetVeneziaRpcDebugFuncForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x47F19DD3<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">void sceKernelSysrootSetVeneziaRpcDebugFuncForDriver(SceKernelSysrootVeneziaRpcDebugFunc func);</source><br />
<br />
=== sceKernelSysrootClearVeneziaRpcDebugFuncForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x5B106EB3<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">void sceKernelSysrootClearVeneziaRpcDebugFuncForDriver();</source><br />
<br />
=== sceKernelSysrootGetVeneziaRpcDebugFuncForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x49843C16<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">SceKernelSysrootVeneziaRpcDebugFunc sceKernelSysrootGetVeneziaRpcDebugFuncForDriver();</source><br />
<br />
=== sceKernelApiDeclareErrorMsgForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.65 || 0x8CD02748<br />
|}<br />
<br />
=== sceKernelApiDeclareTypeRawForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.65 || 0x8A760856<br />
|}<br />
<br />
=== sceKernelApiDeclareTypeInt32ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.65 || 0xD86BD6DC<br />
|}<br />
<br />
=== sceKernelApiDeclareTypeUInt32ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.65 || 0x6E0BC27C<br />
|}<br />
<br />
=== sceKernelApiDeclareTypeInt64ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.65 || 0x08B8F1D0<br />
|}<br />
<br />
=== sceKernelApiDeclareTypeUInt64ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || not present<br />
|-<br />
| 3.60-3.65 || 0x2A5DBD38<br />
|}<br />
<br />
Sets a value to 3.<br />
<br />
<source lang="C">void sceKernelApiDeclareTypeUInt64ForDriver(void);</source><br />
<br />
=== sceKernelSysrootGetTimebaseClockFrequencyForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.500.071-3.740.011 || 0xBFD8F2A2<br />
|}<br />
<br />
Calls a function registered by [[#SceSysrootForDriver_C94C76FA]].<br />
<br />
Used by [[SceGpuEs4]], only on DevKit.<br />
<br />
<source lang="C">SceUInt32 sceKernelSysrootGetTimebaseClockFrequencyForDriver(void);</source><br />
<br />
=== SceSysrootForDriver_C94C76FA ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.360.011 || not present<br />
|-<br />
| 3.500.011-3.740.011 || 0xC94C76FA<br />
|}<br />
<br />
Registers some Sysroot functions related to clock frequency.<br />
<br />
<source lang="C">int SceSysrootForDriver_C94C76FA(SceSysrootForDriver_C94C76FA_struct *pParam);</source><br />
<br />
=== SceSysrootForDriver_2BE874EF ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.500.151-3.740.011 || 0x2BE874EF<br />
|}<br />
<br />
Registers the function called by [[#SceSysrootForKernel_BF82931F]].<br />
<br />
Used only in [[SceAppMgr]].<br />
<br />
<source lang="C">int SceSysrootForDriver_2BE874EF(void *func);</source><br />
<br />
=== SceSysrootForDriver_3B19B06B ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.500.151-3.740.011 || 0x3B19B06B<br />
|}<br />
<br />
Registers the function called by [[#SceSysrootForKernel_6D111FA7]].<br />
<br />
Used only in [[SceAppMgr]].<br />
<br />
<source lang="C">int SceSysrootForDriver_3B19B06B(void *func);</source><br />
<br />
=== SceSysrootForDriver_70AD47A9 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.500.151-3.740.011 || 0x70AD47A9<br />
|}<br />
<br />
Registers the function called by [[#SceSysrootForKernel_2A03DFA1]].<br />
<br />
Used only in [[SceAppMgr]].<br />
<br />
<source lang="C">int SceSysrootForDriver_70AD47A9(void *func);</source><br />
<br />
=== SceSysrootForDriver_AA770EF7 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.360.011 || not present<br />
|-<br />
| 3.500.011-3.740.011 || 0xAA770EF7<br />
|}<br />
<br />
Registers the function called by [[#SceSysrootForDriver_591BB490]].<br />
<br />
The function is registered from [[SceTty2uart]] only if [[KBL Param|DIP Switch]] 211 is set.<br />
<br />
<source lang="C">int SceSysrootForDriver_AA770EF7(void *func);</source><br />
<br />
=== SceSysrootForDriver_591BB490 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.360.011 || not present<br />
|-<br />
| 3.500.011-3.740.011 || 0x591BB490<br />
|}<br />
<br />
Calls the function registered by [[#SceSysrootForDriver_AA770EF7]].<br />
<br />
Gets tty2uart information into a 0x1000-sized buffer, similarly to [[#sceKernelGetTtyInfoForDriver]]. Returns some size, maybe size of the written tty2uart buffer.<br />
<br />
Used only in [[SceCoredump]].<br />
<br />
<source lang="C"><br />
// size: usually 0x1000<br />
int SceSysrootForDriver_591BB490(int magic_or_size, void *pBuf, SceSize size);<br />
</source><br />
<br />
=== SceSysrootForDriver_C5EAF5F7 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xC5EAF5F7<br />
|}<br />
<br />
Registers the function called by [[#SceSysrootForDriver_47724459]].<br />
<br />
<source lang="C">int SceSysrootForDriver_C5EAF5F7(void *func);</source><br />
<br />
=== SceSysrootForDriver_47724459 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x47724459<br />
|}<br />
<br />
Calls the function registered by [[#SceSysrootForDriver_C5EAF5F7]].<br />
<br />
=== SceSysrootForDriver_D4457D4F ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0xD4457D4F<br />
|}<br />
<br />
Registers the function called by [[#SceSysrootForDriver_40F28DC6]].<br />
<br />
<source lang="C">int SceSysrootForDriver_D4457D4F(void *func);</source><br />
<br />
=== SceSysrootForDriver_40F28DC6 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.740.011 || 0x40F28DC6<br />
|}<br />
<br />
Calls the function registered by [[#SceSysrootForDriver_D4457D4F]].<br />
<br />
=== sceKernelSysrootGetCompiledSdkVersionByPidForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.692.000 || not present<br />
|-<br />
| 1.800.071-3.740.011 || 0xCAE820B2<br />
|}<br />
<br />
Temp name was sceKernelGetProcessHeapIDForDriver.<br />
<br />
Calls a callback registered by [[#SceSysrootForKernel_D29BCA77]].<br />
<br />
Used in [[SceKernelModulemgr]] functions that load modules, for example [[SceKernelModulemgr#sceKernelStartModuleForPidForKernel]].<br />
<br />
<source lang="C">int sceKernelSysrootGetCompiledSdkVersionByPidForDriver(SceUID pid, SceUInt32 *puiSdkVer);</source><br />
<br />
=== SceSysrootForDriver_8747D415 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x8747D415<br />
|}<br />
<br />
Used by [[SceDeci4pSDfMgr]].<br />
<br />
Registers the function called by [[#SceSysrootForDriver_B27B7530]].<br />
<br />
<source lang="C">int SceSysrootForDriver_8747D415(void *func);</source><br />
<br />
=== SceSysrootForDriver_B27B7530 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xB27B7530<br />
|}<br />
<br />
Calls the function registered by [[#SceSysrootForDriver_8747D415]].<br />
<br />
=== sceKernelSysrootSetGetBuserrorDataFuncForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x82FC6405<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Registers the function called by [[#sceKernelSysrootGetBuserrorDataForDriver]].<br />
<br />
<source lang="C">int sceKernelSysrootSetGetBuserrorDataFuncForDriver(void *func);</source><br />
<br />
=== sceKernelSysrootGetBuserrorDataForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xCD4B84F7<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Calls the function registered by [[#sceKernelSysrootSetGetBuserrorDataFuncForDriver]].<br />
<br />
=== SceSysrootForDriver_FF2DD7AB ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xFF2DD7AB<br />
|}<br />
<br />
Registers something.<br />
<br />
<source lang="C"><br />
typedef struct SceSysrootForDriver_FF2DD7AB_struct { // size is 0x1C on FW 3.60<br />
SceSize size; // Size of this structure<br />
char unk_4[0x18];<br />
} SceSysrootForDriver_FF2DD7AB_struct;<br />
<br />
int SceSysrootForDriver_FF2DD7AB(SceSysrootForDriver_FF2DD7AB_struct *pData);<br />
</source><br />
<br />
=== SceSysrootForDriver_3AE319DA ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x3AE319DA<br />
|}<br />
<br />
Used by [[SceSyscon]].<br />
<br />
Get something registered by [[#SceSysrootForDriver_FF2DD7AB]].<br />
<br />
<source lang="C">int SceSysrootForDriver_3AE319DA(void);</source><br />
<br />
=== sceKernelSysrootGetHardwareFlagsForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x46E72428<br />
|}<br />
<br />
This is a guessed name. Temp name was sceSysrootIsAuCodecIcConexantForDriver.<br />
<br />
Writes kbl_param->hardware_flags to buffer.<br />
<br />
pFlags buffer size is 0x10 bytes.<br />
<br />
<source lang="C">int sceKernelSysrootGetHardwareFlagsForDriver(void *pFlags);</source><br />
<br />
=== sceKernelSysrootGetHardwareInfoForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x930B1342<br />
|}<br />
<br />
return kbl_param->hardware_info;<br />
<br />
<source lang="C">int sceKernelSysrootGetHardwareInfoForDriver(void);</source><br />
<br />
=== sceKernelSysrootSetSDfCtlSetBootParameterFuncForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xE541959B<br />
|}<br />
<br />
<source lang="C">int sceKernelSysrootSetSDfCtlSetBootParameterFuncForDriver(void *func);</source><br />
<br />
=== sceKernelSysrootClearSDfCtlSetBootParameterFuncForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x9421B223<br />
|}<br />
<br />
<source lang="C">int sceKernelSysrootClearSDfCtlSetBootParameterFuncForDriver(void);</source><br />
<br />
=== sceKernelSysrootSDfCtlSetBootParameterForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x7AAC4EE7<br />
|}<br />
<br />
<source lang="C"><br />
// bootparam max size is 0x80 bytes<br />
int sceKernelSysrootSDfCtlSetBootParameterForDriver(const char *bootparam);<br />
</source><br />
<br />
=== sceKernelSysrootSetUtMgrGetTrilithiumBufferFuncForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x35875119<br />
|}<br />
<br />
Registers the function called by [[#sceKernelSysrootUtMgrGetTrilithiumBufferForDriver]].<br />
<br />
<source lang="C">int sceKernelSysrootSetUtMgrGetTrilithiumBufferFuncForDriver(void *func);</source><br />
<br />
=== sceKernelSysrootUtMgrGetTrilithiumBufferForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.01 || not present<br />
|-<br />
| 3.180.011-3.740.011 || 0xD75D4F37<br />
|}<br />
<br />
Used in [[SceSblAuthMgr#sceSblAuthMgrAuthHeaderForKernel]] to overwrite fSELF authinfo.<br />
<br />
Returns 0 on success, 0x800f1a02 on error.<br />
<br />
<source lang="C">int sceKernelSysrootUtMgrGetTrilithiumBufferForDriver(SceUtokenDecrypted *buffer);</source><br />
<br />
=== sceKernelSysrootSetSceSblPostSsMgrForDriver_A12C9950FuncForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.06 || not present<br />
|-<br />
| 1.500.151-3.740.011 || 0xA12C9950<br />
|}<br />
<br />
Registers the function called by [[#sceKernelSysrootSceSblPostSsMgrForDriver_56D85EB0ForDriver]].<br />
<br />
The function is [[SceSblPostSsMgr#SceSblPostSsMgrForDriver_D8A2D465]].<br />
<br />
<source lang="C">int sceKernelSysrootSetSceSblPostSsMgrForDriver_A12C9950FuncForDriver(void *func);</source><br />
<br />
=== sceKernelSysrootSceSblPostSsMgrForDriver_56D85EB0ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x56D85EB0<br />
|}<br />
<br />
Used by [[SceSblACMgr]].<br />
<br />
Calls the function registered by [[#sceKernelSysrootSetSceSblPostSsMgrForDriver_56D85EB0FuncForDriver]].<br />
<br />
The function is [[SceSblPostSsMgr#SceSblPostSsMgrForDriver_D8A2D465]].<br />
<br />
=== sceKernelSysrootSetSblUtMgrHasUNK1FlagFuncForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.996 || not present<br />
|-<br />
| 1.000.071-3.740.011 || 0xE25D2FD5<br />
|}<br />
<br />
Registers the functions called by [[#sceKernelSysrootSblUtMgrHasUNK1FlagForDriver]].<br />
<br />
<source lang="C">int sceKernelSysrootSetSblUtMgrHasUNK1FlagFuncForDriver(void *func);</source><br />
<br />
=== sceKernelSysrootSblUtMgrHasUNK1FlagForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.996 || not present<br />
|-<br />
| 1.000.071-3.740.011 || 0x26AA237C<br />
|}<br />
<br />
Calls the function registered by [[#sceKernelSysrootSetSblUtMgrHasUNK1FlagFuncForDriver]].<br />
<br />
<source lang="C">int sceKernelSysrootSblUtMgrHasUNK1FlagForDriver(void);</source><br />
<br />
=== sceKernelSysrootSetSblUtMgrHasUNK2FlagFuncForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xE2E88E3E<br />
|}<br />
<br />
Registers the function called by [[#sceKernelSysrootSblUtMgrHasUNK2FlagForDriver]].<br />
<br />
<source lang="C">int sceKernelSysrootsceSetSblUtMgrHasUNK2FlagFuncForDriver(void *func);</source><br />
<br />
=== sceKernelSysrootSblUtMgrHasUNK2FlagForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xE2515A08<br />
|}<br />
<br />
Calls the function registered by [[#sceKernelSysrootSetSblUtMgrHasUNK2FlagFuncForDriver]].<br />
<br />
Used by [[SceSblACMgr#sceSblACMgrHasSystemDataFilePlayReadyFlagForDriver]].<br />
<br />
<source lang="C">int sceKernelSysrootSblUtMgrHasUNK2FlagForDriver(void);</source><br />
<br />
=== sceKernelSysrootSetUtMgrHasNpTestFlagFuncForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.18 || not present<br />
|-<br />
| 3.300.041-3.740.011 || 0xEE5D6CE9<br />
|}<br />
<br />
<source lang="C">int sceKernelSysrootSetUtMgrHasNpTestFlagFuncForDriver(void *func);</source><br />
<br />
=== sceKernelSysrootUtMgrHasNpTestFlagForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.18 || not present<br />
|-<br />
| 3.300.041-3.740.011 || 0xA43599E9<br />
|}<br />
<br />
<source lang="c">int sceKernelSysrootUtMgrHasNpTestFlagForDriver(void);</source><br />
<br />
=== SceSysrootForDriver_2D6B2A79 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x2D6B2A79<br />
|}<br />
<br />
Registers a function related to kernel panic, called by [[#SceSysrootForDriver_CC7A0E63]] or [[#SceSysrootForKernel_CC7A0E63]].<br />
<br />
=== SceSysrootForDriver_CC7A0E63 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xCC7A0E63<br />
|}<br />
<br />
Calls a function related to kernel panic, registered by [[#SceSysrootForDriver_2D6B2A79]] or [[#SceSysrootForKernel_2D6B2A79]].<br />
<br />
<source lang="C"><br />
// type: 1: kernel_assertion_or_panic, 3: kernel_exception<br />
// size: must be <= 0x1000<br />
// pBuf: address of the buffer got using SceDebugForKernel_BEF921A2<br />
int SceSysrootForDriver_CC7A0E63(int type, SceSize size, const char *pBuf);<br />
</source><br />
<br />
=== sceKernelSysrootDisableAutoClockDownForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || not present<br />
|-<br />
| 3.60 || 0xEE934615<br />
|}<br />
<br />
Derived from [[SceVshBridge#vshKernelDisableAutoClockDown]].<br />
<br />
return sceKernelCpuAtomicGetAndAdd32ForDriver(&a_flag_based_on_mgmt_bit0, 0x10);<br />
<br />
Adds 0x10 from a SceSysmem global variable and returns it.<br />
<br />
<source lang="C">int sceKernelSysrootDisableAutoClockDownForDriver(void);</source><br />
<br />
=== sceKernelSysrootEnableAutoClockDownForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || not present<br />
|-<br />
| 3.60 || 0xEEF091A7<br />
|}<br />
<br />
Derived from [[SceVshBridge#vshKernelEnableAutoClockDown]].<br />
<br />
return sceKernelCpuAtomicGetAndAdd32ForDriver(&a_flag_based_on_mgmt_bit0, 0xfffffff0);<br />
<br />
Subtracts 0x10 from a SceSysmem global variable and returns it.<br />
<br />
Used by SceCompat, ScePower, SceKernelDmacMgr, SceSblAuthMgr, SceSblSmschedProxy, SceSblSsSmComm.<br />
<br />
<source lang="C">int sceKernelSysrootEnableAutoClockDownForDriver(void);</source><br />
<br />
=== SceSysrootForDriver_6050A467 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x6050A467<br />
|}<br />
<br />
Debug related. Returns an error when called because there is no handler set for retail.<br />
<br />
<source lang="C">int SceSysrootForDriver_6050A467(SceUID pid);</source><br />
<br />
=== SceSysrootForDriver_F4340469 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xF4340469<br />
|}<br />
<br />
Coredump related. Called during process load. Something is same as in [[#SceSysrootForDriver_6050A467]].<br />
<br />
<source lang="C">int SceSysrootForDriver_F4340469(int something, SceUID pid, ...);</source><br />
<br />
=== sceKernelSysrootRegisterCoredumpTriggerForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xDD473B05<br />
|}<br />
<br />
<source lang="C">int sceKernelSysrootRegisterCoredumpTriggerForDriver(void *func);</source><br />
<br />
=== sceKernelSysrootCoredumpTriggerForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xCD8CD242<br />
|}<br />
<br />
Used by [[SceDeci4pDbgp]].<br />
<br />
<source lang="C">int sceKernelSysrootCoredumpTriggerForDriver(int a1, int a2, int a3, SceCoredumpForDriver_A7D214A7_Opt *pOpt);</source><br />
<br />
=== sceKernelSysrootRegisterCoredumpCancelForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x400B9793<br />
|}<br />
<br />
<source lang="C">int sceKernelSysrootRegisterCoredumpCancelForDriver(void *func);</source><br />
<br />
=== sceKernelSysrootCoredumpCancelForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x80FBC69D<br />
|}<br />
<br />
<source lang="C">int sceKernelSysrootCoredumpCancelForDriver(int a1);</source><br />
<br />
=== sceKernelSysrootSetProcessHandlerForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || not present<br />
|-<br />
| 3.60 || 0x0F07C3FC<br />
|}<br />
<br />
Registers some handlers.<br />
<br />
<source lang="C">int sceKernelSysrootSetProcessHandlerForDriver(SceSysrootProcessHandler *pHandler);</source><br />
<br />
=== sceKernelSysrootClearProcessHandlerForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || not present<br />
|-<br />
| 3.60 || 0x5A7FFDC1<br />
|}<br />
<br />
<source lang="C">void sceKernelSysrootClearProcessHandlerForDriver(void);</source><br />
<br />
=== SceSysrootForDriver_421EFC96 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-1.692 || not present<br />
|-<br />
| 1.800.071-3.740.011 || 0x421EFC96<br />
|}<br />
<br />
Calls SceSysrootProcessHandler's on_process_created.<br />
<br />
Used only by [[SceAppMgr]] and called on process creation.<br />
<br />
Hooked to make it return 0 (success) for example in:<br />
* [https://github.com/henkaku/henkaku/blob/master/payload/payload.c#L423 HENkaku payload by Team Molecule]<br />
* [https://github.com/TheOfficialFloW/update365/blob/2d175c3d2cb6618ba048aee5776acace68ac4493/installer/src/kernel.c#L1058 update365 by TheFloW]<br />
<br />
<source lang="C">int SceSysrootForDriver_421EFC96(int maybe_pid, int maybe_modid, int a3);</source><br />
<br />
=== sceKernelSysrootSWBkptGetOriginalOpcodeForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x9CFF80F9<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">int sceKernelSysrootSWBkptGetOriginalOpcodeForDriver(SceUID pid, void *address, SceUInt32 *opcode);</source><br />
<br />
=== SceSysrootForDriver_571E5B79 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x571E5B79<br />
|}<br />
<br />
Calls SceSysrootProcessHandler's unk_4.<br />
<br />
=== SceSysrootForDriver_51F9C118 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.65 || 0x51F9C118<br />
|}<br />
<br />
Calls SceSysrootProcessHandler's unk_18.<br />
<br />
Used in [[SceProcessmgr#SceProcessmgrForKernel_8729DE79]].<br />
<br />
<source lang="C"><br />
// a3: second argument of SceProcessmgrForKernel_8729DE79<br />
int SceSysrootForDriver_51F9C118(SceUID pid, SceUID modid, int a3, void* maybe_process_info, SceUInt64 time);<br />
</source><br />
<br />
=== SceSysrootForDriver_582616EC ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.65 || 0x582616EC<br />
|}<br />
<br />
Calls SceSysrootProcessHandler's unk_24.<br />
<br />
Used in [[SceProcessmgr#SceProcessmgrForKernel_8729DE79]].<br />
<br />
<source lang="C"><br />
// a3: second argument of SceProcessmgrForKernel_8729DE79<br />
int SceSysrootForDriver_582616EC(SceUID pid, SceUID modid, int a3);<br />
</source><br />
<br />
=== sceKernelSysrootDbgpSuspendProcessAndWaitResumeForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x256B2394<br />
|}<br />
<br />
=== sceKernelSysrootGetShellPidForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x05093E7B<br />
|}<br />
<br />
<source lang="C">SceUID sceKernelSysrootGetShellPidForDriver(void);</source><br />
<br />
=== sceKernelSysrootAppMgrSpawnProcessForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x3ACACD22<br />
|}<br />
<br />
=== sceKernelSysrootInformUpdateStartedForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x9A486846<br />
|}<br />
<br />
<source lang="C">int sceKernelSysrootInformUpdateStartedForDriver(int number1, int number2, const char *str, SceSize len);</source><br />
<br />
=== sceKernelSysrootInformUpdateOngoingForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x9EC02A41<br />
|}<br />
<br />
<source lang="C">int sceKernelSysrootInformUpdateOngoingForDriver(int number1, int number2);</source><br />
<br />
=== sceKernelSysrootInformUpdateFinishedForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x217B2871<br />
|}<br />
<br />
<source lang="C">int sceKernelSysrootInformUpdateFinishedForDriver(int number, const char *str, SceSize len);</source><br />
<br />
=== sceKernelSysrootSetSwInfoIntForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x631141E2<br />
|}<br />
<br />
<source lang="C">int sceKernelSysrootSetSwInfoIntForDriver(char *str, SceSize len, SceUInt32 number);</source><br />
<br />
=== sceKernelSysrootSetSwInfoStrForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x17DD213C<br />
|}<br />
<br />
<source lang="C">int sceKernelSysrootSetSwInfoStrForDriver(char *str1, SceSize len1, char *str2, SceSize len2);</source><br />
<br />
=== sceKernelSysrootSetSwInfoBinForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x9E96D990<br />
|}<br />
<br />
<source lang="C">int sceKernelSysrootSetSwInfoBinForDriver(char *str1, SceSize size1, char *str2, SceSize size2);</source><br />
<br />
=== sceKernelSysrootSetGetSystemSwVersionFuncForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x3276086B<br />
|}<br />
<br />
Temp name was sceKernelSysrootSetSystemSwVersionForDriver.<br />
<br />
Used by [[SceSblUpdateMgr]].<br />
<br />
<source lang="c">void sceKernelSysrootSetGetSystemSwVersionFuncForDriver(void *func);</source><br />
<br />
=== sceKernelSysrootGetSystemSwVersionForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.65 || 0x67AAB627<br />
|}<br />
<br />
Returns System Software version as int from SceSysmem memory. For exemple: 0x0365000 on 3.65.<br />
<br />
<source lang="c">int sceKernelSysrootGetSystemSwVersionForDriver(void);</source><br />
<br />
=== sceKernelSysrootIsSafeModeForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x834439A7<br />
|}<br />
<br />
<source lang="C">int sceKernelSysrootIsSafeModeForDriver(void);</source><br />
<br />
=== sceKernelSysrootIsUpdateModeForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xB0E1FC67<br />
|}<br />
<br />
<source lang="C">int sceKernelSysrootIsUpdateModeForDriver(void);</source><br />
<br />
=== sceKernelSysrootGetModelInfoForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || not present<br />
|-<br />
| 3.60 || 0x4D98B15B<br />
|}<br />
<br />
This is a guessed name, based on "sysroot->model_info".<br />
<br />
Returns sysroot->model_info.<br />
<br />
Used only in [[SceProcessmgr]] initializeBudget() on module start. According to model_info, ScePhyMemPartShell is allocated with different parameters.<br />
<br />
<source lang="C">SceUInt32 sceKernelSysrootGetModelInfoForDriver(void);</source><br />
<br />
=== SceSysrootForDriver_ED688AEE ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0xED688AEE<br />
|}<br />
<br />
Registers the callback called by [[#SceSysrootForDriver_F404026C]].<br />
<br />
<source lang="C">SceSysrootForDriver_ED688AEE(void* cb);</source><br />
<br />
=== SceSysrootForDriver_F404026C ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0xF404026C<br />
|}<br />
<br />
Calls the callback registered by [[#SceSysrootForDriver_ED688AEE]].<br />
<br />
=== sceKernelSysrootCheckModelCapabilityForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0x8AA268D6<br />
|}<br />
<br />
This is an official name. Name derived from [[#sceKernelSysrootCheckModelCapability]].<br />
<br />
Each model capability corresponds to a bit in a Sysroot field derived from Syscon [[KBL_Param#Hardware_Info|Hardware Info]] and [[KBL_Param#Hardware_Info_2|Hardware Info 2]].<br />
<br />
Model capabilities:<br />
* 0: unknown<br />
* 1: Multi-controllers support<br />
* 2: unknown<br />
* 4: unknown<br />
* 5: unknown<br />
* 6: unknown<br />
* 7: unknown, ?OLED display?<br />
* 8: unknown, ?LCD display?<br />
* 9: unknown, set on almost all models<br />
* 10: unknown<br />
* 11: SD card support<br />
* 12: unknown<br />
* 13: unknown<br />
<br />
{| class="wikitable"<br />
|-<br />
! Case !! Model !! Model capabilities (raw) !! Model capabilities (bits set)<br />
|-<br />
| ErnieHwInfo & 0xFF0000 <= 0x410000 / Unknown Model || 0x10100 || 0x604 || 2, 9, 10<br />
|-<br />
| ErnieHwInfo & 0xFF0000 == 0x510000 || 0x20100 || 0x1232 || 1, 4, 5, 9, 12<br />
|-<br />
| ErnieHwInfo & 0xFF0000 == 0x600000 || 0x10150 || 0x604 || 2, 9, 10<br />
|-<br />
| ErnieHwInfo & 0xFF0000 == 0x700000 || 0x20100 || 0x1232 || 1, 4, 5, 9, 12<br />
|-<br />
| ErnieHwInfo & 0xFF0000 == 0x720000 || 0x20110 || 0x232 || 1, 4, 5, 9<br />
|-<br />
| ErnieHwInfo & 0xFF0000 == 0x800000 || 0x10200 || 0x604 || 2, 9, 10<br />
|-<br />
| ErnieHwInfo & 0xFF0000 == 0x820000 || 0x10220 || 0x604 || 2, 9, 10<br />
|-<br />
| PDEL-10xx in PS TV Emulation mode || 0x20101 || 0x252 || 1, 4, 6, 9<br />
|-<br />
| (ErnieHwInfo2 & 0x9 == 0) && PSTV or PSTVEmu || - || 0x80 || 7<br />
|-<br />
| ErnieHwInfo2 & 0x9 != 0 || - || 0x100 || 8<br />
|-<br />
| (Model == 0x20110) && (ErnieHwInfo2 & 0x100 != 0) || - || 0x1000 || 12<br />
|-<br />
| (Model == 0x20110) && (ErnieHwInfo2 & 0x100 == 0) || - || & ~0x1000 || UNSET 12<br />
|-<br />
| ErnieHwInfo2 & 0x200 != 0 || - || 0x2000 || 13<br />
|}<br />
<br />
Used in [[SceCtrl]], [[SceSdstor]], [[SceUsbEtherRtl]] and [[SceVshBridge]].<br />
<br />
<source lang="C">int sceKernelSysrootCheckModelCapabilityForDriver(int capability);</source><br />
<br />
=== sceKernelSysrootGetSyscallFrameForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.65 || 0x44EA3197<br />
|}<br />
<br />
<source lang="C">SceSyscallFrame *sceKernelSysrootGetSyscallFrameForDriver(void);</source><br />
<br />
=== sceKernelSysrootRegisterInitCallbackForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x778D0966<br />
|}<br />
<br />
<source lang="C"><br />
// idx: 0-8<br />
// idx 8: func = ScePower/SceMsif functions<br />
int sceKernelSysrootRegisterInitCallbackForDriver(const void *func, SceUInt32 idx, SceUInt32 arg, SceUInt32 *ret);<br />
</source><br />
<br />
=== sceKernelSysrootInvokeInitCallbackForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x93CD44CD<br />
|}<br />
<br />
<source lang="C"><br />
// idx: 0-8, 5: disable NSKBL, more...?<br />
int sceKernelSysrootInvokeInitCallbackForDriver(int idx);<br />
</source><br />
<br />
=== sceKernelSysrootInvokeInitCallbackExForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || not present<br />
|-<br />
| 0.990-3.60 || 0x7C2C10E2<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C"><br />
// idx: 0-8, 5: disable NSKBL, more...?<br />
// unk: argument passed to the init callback<br />
int sceKernelSysrootInvokeInitCallbackExForDriver(int idx, int unk);<br />
</source><br />
<br />
== SceKernelUtilsForDriver ==<br />
<br />
=== sceAesDecrypt1ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xD8678061<br />
|}<br />
<br />
Perform normal AES decrypt.<br />
<br />
<source lang="c">int sceAesDecrypt1ForDriver(void *ctx, const void *src, void *dst);</source><br />
<br />
=== sceAesDecrypt2ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xE39CD272<br />
|}<br />
<br />
Perform AES decrypt using encryption round key.<br />
<br />
<source lang="c">int sceAesDecrypt2ForDriver(void *ctx, const void *src, void *dst);</source><br />
<br />
=== sceAesEncrypt1ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xC2A61770<br />
|}<br />
<br />
Perform AES encrypt. There are two functions that are the same on 1.69.<br />
<br />
<source lang="c">int sceAesEncrypt1ForDriver(void *ctx, const void *src, void *dst);</source><br />
<br />
=== sceAesEncrypt2ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x302947B6<br />
|}<br />
<br />
Perform AES encrypt. Similar to sceAesEncrypt1ForDriver.<br />
<br />
<source lang="c">int sceAesEncrypt2ForDriver(void *ctx, const void *src, void *dst);</source><br />
<br />
=== sceAesInit1ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0xF12B6451<br />
|}<br />
<br />
This sets up the AES engine. <code>ctx</code> is a 0x3C0 byte buffer (on FW 1.69). <code>blocksize</code> and <code>keysize</code> values are in bits. 128/196/256 are supported values.<br />
<br />
last arg to subroutine is 0<br />
<br />
<source lang="c">int sceAesInit1ForDriver(void *ctx, int blocksize, int keysize, const void *key);</source><br />
<br />
=== sceAesInit2ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xEDA97D6D<br />
|}<br />
<br />
last arg to subroutine is 1<br />
<br />
<source lang="c">int sceAesInit2ForDriver(void *ctx, int blocksize, int keysize, const void *key);</source><br />
<br />
=== sceAesInit3ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x72408E29<br />
|}<br />
<br />
last arg to subroutine is 2<br />
<br />
<source lang="c">int sceAesInit3ForDriver(void *ctx, int blocksize, int keysize, const void *key);</source><br />
<br />
=== SceKernelUtilsForDriver_C76A7685 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xC76A7685<br />
|}<br />
<br />
Looks like it relates to AES InvMixColumns.<br />
<br />
=== SceKernelUtilsForDriver_60ED6EA9 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x60ED6EA9<br />
|}<br />
<br />
Equivalent to AES getSBox32Value<br />
<br />
=== sceDeflateDecompressForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x8AF1FAD4<br />
|}<br />
<br />
=== sceDeflateDecompressPartialForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x3D74CCDF<br />
|}<br />
<br />
=== sceGzipDecompressForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x367EE3DF<br />
|}<br />
<br />
=== sceGzipGetCommentForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xCD3AE08F<br />
|}<br />
<br />
=== sceGzipGetCompressedDataForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x63619124<br />
|}<br />
<br />
=== sceGzipGetInfoForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xFFC6A10F<br />
|}<br />
<br />
=== sceGzipGetNameForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xF901FD3E<br />
|}<br />
<br />
=== sceGzipIsValidForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xD8FAEFD4<br />
|}<br />
<br />
=== sceHmacSha1DigestForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x29A28957<br />
|}<br />
<br />
<source lang="C">int sceHmacSha1DigestForDriver(const void *key, int key_len, const void *data, int data_len, void *digest);</source><br />
<br />
=== sceHmacSha224DigestForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x7F2A7B99<br />
|}<br />
<br />
<source lang="C">int sceHmacSha224DigestForDriver(const void *key, int key_len, const void *data, int data_len, void *digest);</source><br />
<br />
=== sceHmacSha256DigestForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x83EFA1CC<br />
|}<br />
<br />
<source lang="C">int sceHmacSha256DigestForDriver(const void *key, int key_len, const void *data, int data_len, void *digest);</source><br />
<br />
=== sceMt19937GlobalInitForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xD428CC2A<br />
|}<br />
<br />
cp_timestamp_2 is gotten from SceKblParam.<br />
<br />
<source lang="C">int sceMt19937GlobalInitForDriver(uint32_t cp_timestamp_2);</source><br />
<br />
=== sceMt19937GlobalUIntInRangeForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x875B2A1C<br />
|}<br />
<br />
Temp name was sceMt19937GlobalUninitForDriver.<br />
<br />
<source lang="C"><br />
// Both the address and size must be aligned on four bytes.<br />
int sceMt19937GlobalUIntInRangeForDriver(void *pBase, SceSize length);<br />
</source><br />
<br />
=== sceMt19937InitForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x4C9A5730<br />
|}<br />
<br />
=== sceMt19937UIntForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x92AEDFBC<br />
|}<br />
<br />
=== sceSfmt19937FillArray32ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x2B30548B<br />
|}<br />
<br />
=== sceSfmt19937FillArray64ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x49B41540<br />
|}<br />
<br />
=== sceSfmt19937GenRand32ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xBBE4701A<br />
|}<br />
<br />
=== sceSfmt19937GenRand64ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x45DEAAD6<br />
|}<br />
<br />
=== sceSfmt19937InitByArrayForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x33AE1203<br />
|}<br />
<br />
=== sceSfmt19937InitGenRandForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xAB48C3CA<br />
|}<br />
<br />
=== sceSha1BlockInitForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xE4390FFA<br />
|}<br />
<br />
<source lang="C">int sceSha1BlockInitForDriver(void* ctx);</source><br />
<br />
=== sceSha1BlockResultForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x48F24106<br />
|}<br />
<br />
<source lang="C">int sceSha1BlockResultForDriver(void* ctx, void *digest);</source><br />
<br />
=== sceSha1BlockUpdateForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x478A6F3C<br />
|}<br />
<br />
<source lang="C">int sceSha1BlockUpdateForDriver(void* ctx, const void *data, int size);</source><br />
<br />
=== sceSha1DigestForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x87DC7F2F<br />
|}<br />
<br />
<source lang="C">int sceSha1DigestForDriver(const void *data, int size, void *digest);</source><br />
<br />
=== sceSha224BlockInitForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xC762EA6D<br />
|}<br />
<br />
<source lang="C">int sceSha224BlockInitForDriver(void* ctx);</source><br />
<br />
=== sceSha224BlockResultForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xFBF2A442<br />
|}<br />
<br />
<source lang="C">int sceSha224BlockResultForDriver(void* ctx, void *digest);</source><br />
<br />
=== sceSha224BlockUpdateForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x7556E611<br />
|}<br />
<br />
<source lang="C">int sceSha224BlockUpdateForDriver(void* ctx, const void *data, int size);</source><br />
<br />
=== sceSha224DigestForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x9EA9D4DC<br />
|}<br />
<br />
<source lang="C">int sceSha224DigestForDriver(const void *data, int size, void *digest);</source><br />
<br />
=== sceSha256BlockInitForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xD909FA2C<br />
|}<br />
<br />
<source lang="C">int sceSha256BlockInitForDriver(void* ctx);</source><br />
<br />
=== sceSha256BlockResultForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x4899CD4B<br />
|}<br />
<br />
<source lang="C">int sceSha256BlockResultForDriver(void* ctx, void *digest);</source><br />
<br />
=== sceSha256BlockUpdateForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x236A9097<br />
|}<br />
<br />
<source lang="C">int sceSha256BlockUpdateForDriver(void* ctx, const void *data, int size);</source><br />
<br />
=== sceSha256DigestForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0xA773A6A8<br />
|}<br />
<br />
<source lang="C">int sceSha256DigestForDriver(const void *data, SceSize size, void *digest);</source><br />
<br />
=== sceZlibDecompressForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x900148DB<br />
|}<br />
<br />
=== sceZlibGetCompressedDataForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x01EB6C45<br />
|}<br />
<br />
=== sceZlibGetInfoForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x5B9BCD75<br />
|}<br />
<br />
=== sceXorshift128ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || not present<br />
|-<br />
| 3.60 || 0x335AF34D<br />
|}<br />
<br />
Similar implementation as [https://github.com/RIOT-OS/RIOT/blob/master/sys/random/xorshift.c#L41 xorshift128].<br />
<br />
<source lang="C">int sceXorshift128ForDriver(SceUInt32 *state);</source><br />
<br />
=== SceKernelUtilsForDriver_B55C69B7 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xB55C69B7<br />
|}<br />
<br />
If buffer is full of zeroes, then each of the four dwords of buffer are set to 1. Always success and always return 0.<br />
<br />
Used in [[SceProcessmgr]].<br />
<br />
<source lang="C">int SceKernelUtilsForDriver_B55C69B7(SceUInt32 *buffer);</source><br />
<br />
== SceZlibForDriver ==<br />
<br />
This library was moved to [[SceSblPostSsMgr#SceZlibForDriver]] on FW 1.800.071.<br />
<br />
[http://www.zlib.net/ zlib] compression library.<br />
<br />
=== zlibVersion ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0x517BC5F7<br />
|}<br />
<br />
<source lang="C">const char *zlibVersion(void);</source><br />
<br />
=== inflateInit ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0x81D0667B<br />
|}<br />
<br />
This function have [[SceSysmem#SceZlibForDriver_723495A5|alias]].<br />
<br />
<source lang="C">int inflateInit(SceZlibStream *strm, const char *version, int stream_size);</source><br />
<br />
=== SceZlibForDriver_723495A5 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940-3.60 || 0x723495A5<br />
|}<br />
<br />
<source lang="C">int SceZlibForDriver_723495A5(SceZlibStream *strm, const char *version, int stream_size);</source><br />
<br />
=== inflateInit2_ ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0x0BDDF66A<br />
|}<br />
<br />
This function have [[SceSysmem#SceZlibForDriver_21A03034|alias]].<br />
<br />
<source lang="C">int inflateInit2_(SceZlibStream *strm, int windowBits, const char *version, int stream_size);</source><br />
<br />
=== SceZlibForDriver_21A03034 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0x21A03034<br />
|}<br />
<br />
<source lang="C">int SceZlibForDriver_21A03034(SceZlibStream *strm, int windowBits, const char *version, int stream_size);</source><br />
<br />
=== inflateInit_2 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0x44DA19D2<br />
|}<br />
<br />
This function have [[SceSysmem#SceZlibForDriver_B03E109B|alias]].<br />
<br />
<source lang="C">int inflateInit_2(SceZlibStream *strm, const char *version, int stream_size);</source><br />
<br />
=== SceZlibForDriver_B03E109B ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0xB03E109B<br />
|}<br />
<br />
<source lang="C">int SceZlibForDriver_B03E109B(SceZlibStream *strm, const char *version, int stream_size);</source><br />
<br />
=== inflateInit2_2 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0xA1E7E8B3<br />
|}<br />
<br />
This function have [[SceSysmem#SceZlibForDriver_AC2F8437|alias]].<br />
<br />
<source lang="C">int inflateInit2_2(SceZlibStream *strm, int a2, const char *version, int stream_size);</source><br />
<br />
=== SceZlibForDriver_AC2F8437 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0xAC2F8437<br />
|}<br />
<br />
<source lang="C">int SceZlibForDriver_AC2F8437(SceZlibStream *strm, int a2, const char *version, int stream_size);</source><br />
<br />
=== inflate ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0xD4A85178<br />
|}<br />
<br />
This function have [[SceSysmem#SceZlibForDriver_E4F34A68|alias]].<br />
<br />
<source lang="C">int inflate(SceZlibStream *strm, int flush);</source><br />
<br />
=== SceZlibForDriver_E4F34A68 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.60-3.60 || 0xE4F34A68<br />
|}<br />
<br />
=== inflateSetDictionary ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.60-3.60 || 0x7B16DBD6<br />
|}<br />
<br />
This function have [[SceSysmem#SceZlibForDriver_00561385|alias]].<br />
<br />
<source lang="C">int inflateSetDictionary(SceZlibStream *strm, const void *dictionary, int dictLength);</source><br />
<br />
=== SceZlibForDriver_00561385 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0x00561385<br />
|}<br />
<br />
<source lang="C">int SceZlibForDriver_00561385(SceZlibStream *strm, const void *dictionary, int dictLength);</source><br />
<br />
=== inflateEnd ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0x9030BAE4<br />
|}<br />
<br />
This function have [[SceSysmem#SceZlibForDriver_134E91EA|alias]].<br />
<br />
<source lang="C">int inflateEnd(SceZlibStream *strm);</source><br />
<br />
=== SceZlibForDriver_134E91EA ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0x134E91EA<br />
|}<br />
<br />
<source lang="C">int SceZlibForDriver_134E91EA(SceZlibStream *strm);</source><br />
<br />
=== inflateCopy ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0x4C27A382<br />
|}<br />
<br />
This function have [[SceSysmem#SceZlibForDriver_89B30588|alias]].<br />
<br />
<source lang="C">int inflateCopy(SceZlibStream *dst, SceZlibStream *src);</source><br />
<br />
=== SceZlibForDriver_89B30588 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0x89B30588<br />
|}<br />
<br />
<source lang="C">int SceZlibForDriver_89B30588(SceZlibStream *dst, SceZlibStream *src);</source><br />
<br />
=== inflateSyncPoint ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0x4CB63BCD<br />
|}<br />
<br />
This function have [[SceSysmem#SceZlibForDriver_834CC4A2|alias]].<br />
<br />
<source lang="C">int inflateSyncPoint(SceZlibStream *strm);</source><br />
<br />
=== SceZlibForDriver_834CC4A2 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0x834CC4A2<br />
|}<br />
<br />
<source lang="C">int SceZlibForDriver_834CC4A2(SceZlibStream *strm);</source><br />
<br />
=== deflate ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.60-3.60 || 0xE859D60F<br />
|}<br />
<br />
This function have [[SceSysmem#SceZlibForDriver_5B718E55|alias]].<br />
<br />
<source lang="C">int deflate(SceZlibStream *strm, int flush);</source><br />
<br />
=== SceZlibForDriver_5B718E55 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010-3.60 || 0x5B718E55<br />
|}<br />
<br />
Used by [[SceCoredump]].<br />
<br />
<source lang="C">int SceZlibForDriver_5B718E55(SceZlibStream *strm, int flush);</source><br />
<br />
=== deflateReset ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.60-3.60 || 0x68CFEA45<br />
|}<br />
<br />
This function have [[SceSysmem#SceZlibForDriver_211D25F5|alias]].<br />
<br />
This function could be deflateResetKeep.<br />
<br />
<source lang="C">int deflateReset(SceZlibStream *strm);</source><br />
<br />
=== SceZlibForDriver_211D25F5 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0x211D25F5<br />
|}<br />
<br />
<source lang="C">int SceZlibForDriver_211D25F5(SceZlibStream *strm);</source><br />
<br />
=== crc32 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.60-3.60 || 0xE0CE06C0<br />
|}<br />
<br />
This function have [[SceSysmem#SceZlibForDriver_3370B9AD|alias]].<br />
<br />
<source lang="C">unsigned long crc32(unsigned long crc, const unsigned char *buf, z_size_t len);</source><br />
<br />
=== SceZlibForDriver_3370B9AD ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0x3370B9AD<br />
|}<br />
<br />
<source lang="C">unsigned long SceZlibForDriver_3370B9AD(unsigned long crc, const unsigned char *buf, z_size_t len);</source><br />
<br />
=== adler32 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.60-3.60 || 0x98619620<br />
|}<br />
<br />
This function have [[SceSysmem#SceZlibForDriver_7E823337|alias]].<br />
<br />
=== SceZlibForDriver_7E823337 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0x7E823337<br />
|}<br />
<br />
=== deflateInit2_2 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x20A122F8<br />
|}<br />
<br />
May be an initialization function.<br />
<br />
Used by [[SceCoredump]].<br />
<br />
This function have [[SceSysmem#SceZlibForDriver_BE5CE88A|alias]].<br />
<br />
<source lang="C">int deflateInit2_2(SceZlibStream *strm, int level, int method, int windowBits, int memLevel, int strategy, const char *version, int stream_size);</source><br />
<br />
=== SceZlibForDriver_BE5CE88A ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0xBE5CE88A<br />
|}<br />
<br />
<source lang="C">int SceZlibForDriver_BE5CE88A(SceZlibStream *strm, int level, int method, int windowBits, int memLevel, int strategy, const char *version, int stream_size);</source><br />
<br />
=== deflateEnd ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x5492B3F2<br />
|}<br />
<br />
Used by [[SceCoredump]].<br />
<br />
This function have [[SceSysmem#SceZlibForDriver_A5D70E95|alias]].<br />
<br />
<source lang="C">int deflateEnd(SceZlibStream *strm);</source><br />
<br />
=== SceZlibForDriver_A5D70E95 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0xA5D70E95<br />
|}<br />
<br />
<source lang="C">int SceZlibForDriver_A5D70E95(SceZlibStream *strm);</source><br />
<br />
=== deflateInit_ ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x25F28DA7<br />
|}<br />
<br />
This function have [[SceSysmem#SceZlibForDriver_520CAA7F|alias]].<br />
<br />
<source lang="C">int deflateInit_(SceZlibStream *strm, int level, const char *version, int stream_size);</source><br />
<br />
=== SceZlibForDriver_520CAA7F ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0x520CAA7F<br />
|}<br />
<br />
<source lang="C">int SceZlibForDriver_520CAA7F(SceZlibStream *strm, int level, const char *version, int stream_size);</source><br />
<br />
=== SceZlibForDriver_05F712FE ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0x05F712FE<br />
|}<br />
<br />
This function have [[SceSysmem#SceZlibForDriver_67A085C4|alias]].<br />
<br />
=== SceZlibForDriver_67A085C4 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0x67A085C4<br />
|}<br />
<br />
=== SceZlibForDriver_0FA805A3 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0x0FA805A3<br />
|}<br />
<br />
This function have [[SceSysmem#SceZlibForDriver_1C344E27|alias]].<br />
<br />
<source lang="C">int SceZlibForDriver_0FA805A3(SceZlibStream *strm, int a2, SceUInt16 a3);</source><br />
<br />
=== SceZlibForDriver_1C344E27 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0x1C344E27<br />
|}<br />
<br />
<source lang="C">int SceZlibForDriver_1C344E27(SceZlibStream *strm, int a2, SceUInt16 a3);</source><br />
<br />
=== deflateCopy ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0x1E135CC1<br />
|}<br />
<br />
This function have [[SceSysmem#SceZlibForDriver_3252D28C|alias]].<br />
<br />
<source lang="C">int deflateCopy(SceZlibStream *dst, SceZlibStream *src);</source><br />
<br />
=== SceZlibForDriver_3252D28C ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0x3252D28C<br />
|}<br />
<br />
<source lang="C">int SceZlibForDriver_3252D28C(SceZlibStream *dst, SceZlibStream *src);</source><br />
<br />
=== SceZlibForDriver_35E0108C ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0x35E0108C<br />
|}<br />
<br />
This function have [[SceSysmem#SceZlibForDriver_E2DF5A8B|alias]].<br />
<br />
<source lang="C">int SceZlibForDriver_35E0108C(SceZlibStream *strm);</source><br />
<br />
=== SceZlibForDriver_E2DF5A8B ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0xE2DF5A8B<br />
|}<br />
<br />
<source lang="C">int SceZlibForDriver_E2DF5A8B(SceZlibStream *strm);</source><br />
<br />
=== zError ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0x3B4466F4<br />
|}<br />
<br />
This function have [[SceSysmem#SceZlibForDriver_3F33F55F|alias]].<br />
<br />
<source lang="C">const char *zError(int err);</source><br />
<br />
=== SceZlibForDriver_3F33F55F ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0x3F33F55F<br />
|}<br />
<br />
<source lang="C">const char *SceZlibForDriver_3F33F55F(int err);</source><br />
<br />
=== inflateReset ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0x408311E8<br />
|}<br />
<br />
This function have [[SceSysmem#SceZlibForDriver_EEC6D267|alias]].<br />
<br />
<source lang="C">int inflateReset(SceZlibStream *strm);</source><br />
<br />
=== SceZlibForDriver_EEC6D267 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0xEEC6D267<br />
|}<br />
<br />
<source lang="C">int SceZlibForDriver_EEC6D267(SceZlibStream *strm);</source><br />
<br />
=== SceZlibForDriver_4EE6C080 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0x4EE6C080<br />
|}<br />
<br />
This function have [[SceSysmem#SceZlibForDriver_93168F72|alias]].<br />
<br />
=== SceZlibForDriver_93168F72 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0x93168F72<br />
|}<br />
<br />
=== SceZlibForDriver_5377643A ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0x5377643A<br />
|}<br />
<br />
This function have [[SceSysmem#SceZlibForDriver_7C40CC39|alias]].<br />
<br />
=== SceZlibForDriver_7C40CC39 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0x7C40CC39<br />
|}<br />
<br />
=== deflateInit_2 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0x5A0078D6<br />
|}<br />
<br />
This function have [[SceSysmem#SceZlibForDriver_AD23EEBB|alias]].<br />
<br />
<source lang="C">int deflateInit_2(SceZlibStream *strm, int level, const char *version, int stream_size);</source><br />
<br />
=== SceZlibForDriver_AD23EEBB ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0xAD23EEBB<br />
|}<br />
<br />
<source lang="C">int SceZlibForDriver_AD23EEBB(SceZlibStream *strm, int level, const char *version, int stream_size);</source><br />
<br />
=== SceZlibForDriver_6ED5B677 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0x6ED5B677<br />
|}<br />
<br />
This function have [[SceSysmem#SceZlibForDriver_7993ADAB|alias]].<br />
<br />
=== SceZlibForDriver_7993ADAB ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0x7993ADAB<br />
|}<br />
<br />
=== SceZlibForDriver_7048F14C ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0x7048F14C<br />
|}<br />
<br />
This function have [[SceSysmem#SceZlibForDriver_E323828B|alias]].<br />
<br />
=== SceZlibForDriver_E323828B ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0xE323828B<br />
|}<br />
<br />
=== SceZlibForDriver_82167CD9 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0x82167CD9<br />
|}<br />
<br />
This function have [[SceSysmem#SceZlibForDriver_E94663DD|alias]].<br />
<br />
=== SceZlibForDriver_E94663DD ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0xE94663DD<br />
|}<br />
<br />
=== SceZlibForDriver_86FF6C8B ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0x86FF6C8B<br />
|}<br />
<br />
This function have [[SceSysmem#SceZlibForDriver_904AA7AE|alias]].<br />
<br />
=== SceZlibForDriver_904AA7AE ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0x904AA7AE<br />
|}<br />
<br />
=== SceZlibForDriver_89A13883 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0x89A13883<br />
|}<br />
<br />
This function have [[SceSysmem#SceZlibForDriver_D9BDC778|alias]].<br />
<br />
=== SceZlibForDriver_D9BDC778 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0xD9BDC778<br />
|}<br />
<br />
=== SceZlibForDriver_938F34FA ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0x938F34FA<br />
|}<br />
<br />
This function have [[SceSysmem#SceZlibForDriver_BC022D38|alias]].<br />
<br />
=== SceZlibForDriver_BC022D38 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0xBC022D38<br />
|}<br />
<br />
=== deflateInit2_ ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0xE6EB524C<br />
|}<br />
<br />
This function have [[SceSysmem#SceZlibForDriver_F2D8FC1A|alias]].<br />
<br />
<source lang="C">int deflateInit2_(SceZlibStream *strm, int level, int method, int windowBits, int memLevel, int strategy, const char *version, int stream_size);</source><br />
<br />
=== SceZlibForDriver_F2D8FC1A ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.200.010 || 0xF2D8FC1A<br />
|}<br />
<br />
<source lang="C">int SceZlibForDriver_F2D8FC1A(SceZlibStream *strm, int level, int method, int windowBits, int memLevel, int strategy, const char *version, int stream_size);</source><br />
<br />
== SceKernelSuspendForDriver ==<br />
<br />
Used to register handlers for handling suspend/resume related events.<br />
<br />
=== sceKernelLockSuspendForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x4DF40893<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Called in [[SceProcessmgr#sceKernelStartProcessForKernel]] and [[SceProcessmgr#sceKernelStartProcessExtForKernel]] just before starting a process.<br />
<br />
Called just before NVS write.<br />
<br />
<source lang="C">int sceKernelLockSuspendForDriver(SceUInt32 a1);</source><br />
<br />
=== sceKernelUnlockSuspendForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x2BB92967<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Called in [[SceProcessmgr#sceKernelStartProcessForKernel]] and [[SceProcessmgr#sceKernelStartProcessExtForKernel]] just after starting a process.<br />
<br />
Called just after NVS write.<br />
<br />
<source lang="C">int sceKernelUnlockSuspendForDriver(SceUInt32 a1);</source><br />
<br />
=== sceKernelLockSuspendProcForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.740.011 || 0x254525F8<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Temp name was sceKernelPowerLockForDriver.<br />
<br />
Used in [[SceProcessmgr#sceKernelPowerLock]].<br />
<br />
<source lang="C">int sceKernelPowerLockForDriver(SceUInt32 a1);</source><br />
<br />
=== sceKernelUnlockSuspendProcForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.740.011 || 0x230495ED<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Temp name was sceKernelPowerUnlockForDriver.<br />
<br />
Used in [[SceProcessmgr#sceKernelPowerUnlock]].<br />
<br />
<source lang="C">int sceKernelPowerUnlockForDriver(SceUInt32 a1);</source><br />
<br />
=== SceKernelSuspendForDriver_FE2118BD ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xFE2118BD<br />
|}<br />
<br />
=== sceKernelPowerSetIdleCallbackForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xE677B343<br />
|}<br />
<br />
This is guessed name.<br />
<br />
=== SceKernelSuspendForDriver_B4B13615 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xB4B13615<br />
|}<br />
<br />
=== SceKernelSuspendForDriver_AEA9440D ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xAEA9440D<br />
|}<br />
<br />
=== SceKernelSuspendForDriver_81D9E41C ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x81D9E41C<br />
|}<br />
<br />
=== SceKernelSuspendForDriver_6A503956 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x6A503956<br />
|}<br />
<br />
=== SceKernelSuspendForDriver_250ACD90 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x250ACD90<br />
|}<br />
<br />
<source lang="C">int SceKernelSuspendForDriver_250ACD90(const SceKernelSuspendPowerCallback *pPowerCallback);</source><br />
<br />
=== SceKernelSuspendForDriver_0A6CA124 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x0A6CA124<br />
|}<br />
<br />
=== SceKernelSuspendForDriver_0106C0F0 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x0106C0F0<br />
|}<br />
<br />
=== sceKernelRegisterSysEventHandlerForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x04C05D10<br />
|}<br />
<br />
Temp name was sceKernelSuspendRegisterCallbackForDriver.<br />
<br />
Registers a function for handling suspend/resume. <code>resume</code> is 0 if we are currently suspending and 1 if we are currently resuming. <code>opt</code> is passed from the registration. Registration adds an entry to a linked list and returns the block id for the new entry.<br />
<br />
Returns the suspend_handler_id.<br />
<br />
<source lang="C"><br />
typedef int (* SceKernelSysEventHandler)(int resume, int event, void *param, void *argp);<br />
<br />
SceUID sceKernelRegisterSysEventHandlerForDriver(const char *name, SceKernelSysEventHandler handler, void *argp);<br />
</source><br />
<br />
=== SceKernelSuspendForDriver_CE7A2207 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xCE7A2207<br />
|}<br />
<br />
Registers a handler for a suspend event.<br />
<br />
<source lang="c"><br />
// idx: ex: 0x15<br />
// args: can be 0<br />
SceUID SceKernelSuspendForDriver_CE7A2207(SceUInt idx, void *handler, void *args);<br />
</source><br />
<br />
=== SceKernelSuspendForDriver_105C5752 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x105C5752<br />
|}<br />
<br />
Registers a handler for a resume event.<br />
<br />
<source lang="c"><br />
// idx: ex: 0x15<br />
// args: can be 0<br />
SceUID SceKernelSuspendForDriver_105C5752(SceUInt idx, void *handler, void *args);<br />
</source><br />
<br />
=== SceKernelSuspendForDriver_D4958E6F ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xD4958E6F<br />
|}<br />
<br />
Dispatch handler registered by [[#SceKernelSuspendForDriver_CE7A2207]].<br />
<br />
<source lang="c">SceUID SceKernelSuspendForDriver_D4958E6F(void *args);</source><br />
<br />
=== sceKernelUnregisterSysEventHandlerForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xDD61D621<br />
|}<br />
<br />
Call with the id returned from <code>suspend_register_handler</code> to remove the entry from the linked list and free the memory.<br />
<br />
<source lang="c">int sceKernelUnregisterSysEventHandlerForDriver(SceUID id);</source><br />
<br />
=== sceKernelSysEventDispatchForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xD4622EA8<br />
|}<br />
<br />
This function goes through the linked list and calls each handler. If <code>ppFailed</code> is set, then the first handler that returns a negative value stops the call chain and returns the block id of the handler that broke the chain. Otherwise, this function invokes each handler and returns 0.<br />
<br />
<source lang="C"><br />
typedef struct _SceKernelSysEventDispatchSuspendParam {<br />
SceSize size;<br />
SceUInt32 unk_0x04;<br />
SceUInt32 unk_0x08;<br />
SceUInt32 unk_0x0C;<br />
void *pSuspendContextBuffer;<br />
SceUInt32 unk_0x14;<br />
} SceKernelSysEventDispatchSuspendParam;<br />
<br />
typedef struct _SceKernelSysEventDispatchResumeParam {<br />
SceSize size;<br />
SceUInt32 unk_0x04;<br />
} SceKernelSysEventDispatchResumeParam;<br />
<br />
int sceKernelSysEventDispatchForDriver(SceUInt32 resume, SceUInt32 eventid, void *param, void **ppFailed);<br />
</source><br />
<br />
=== sceKernelPowerTickForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xE0489831<br />
|}<br />
<br />
Cancel specified idle timers to prevent entering in power save processing.<br />
<br />
Returns 0 on success.<br />
<br />
<source lang="c"><br />
typedef enum SceKernelPowerTickType {<br />
/** Cancel all timers */<br />
SCE_KERNEL_POWER_TICK_DEFAULT = 0,<br />
/** Cancel automatic suspension timer */<br />
SCE_KERNEL_POWER_TICK_DISABLE_AUTO_SUSPEND = 1,<br />
/** Cancel OLED-off timer */<br />
SCE_KERNEL_POWER_TICK_DISABLE_OLED_OFF = 4,<br />
/** Cancel OLED dimming timer */<br />
SCE_KERNEL_POWER_TICK_DISABLE_OLED_DIMMING = 6<br />
} SceKernelPowerTickType;<br />
<br />
int sceKernelPowerTickForDriver(int type);<br />
</source><br />
<br />
=== SceKernelSuspendForDriver_1FA2F8F1 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.000.071-3.740.011 || 0x1FA2F8F1<br />
|}<br />
<br />
Calls a power handler.<br />
<br />
<source lang="C">int SceKernelSuspendForDriver_1FA2F8F1(int a1, int a2);</source><br />
<br />
=== SceKernelSuspendForDriver_F2B07167 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 2.100.081-3.740.011 || 0xF2B07167<br />
|}<br />
<br />
Registers a global variable used by [[#sceKernelPowerTickForDriver]].<br />
<br />
<source lang="C">int SceKernelSuspendForDriver_F2B07167(int a1);</source><br />
<br />
=== SceKernelSuspendForDriver_B5C58EE8 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 2.100.081-3.740.011 || 0xB5C58EE8<br />
|}<br />
<br />
Registers a global variable used by [[#sceKernelSysEventDispatchForDriver]].<br />
<br />
<source lang="C">int SceKernelSuspendForDriver_B5C58EE8(int a1);</source><br />
<br />
=== SceKernelSuspendForDriver_D6124071 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 2.100.081-3.740.011 || 0xD6124071<br />
|}<br />
<br />
Registers a global variable used by [[#sceKernelSysEventDispatchForDriver]].<br />
<br />
<source lang="C">int SceKernelSuspendForDriver_D6124071(int a1);</source><br />
<br />
=== SceKernelSuspendForDriver_0DE3CC02 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 2.100.081-3.740.011 || 0x0DE3CC02<br />
|}<br />
<br />
Registers a global variable used by [[#SceKernelSuspendForDriver_2BB92967]].<br />
<br />
<source lang="C">int SceKernelSuspendForDriver_0DE3CC02(int a1);</source><br />
<br />
=== SceKernelSuspendForDriver_4E5A3A23 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 2.100.081-3.740.011 || 0x4E5A3A23<br />
|}<br />
<br />
Registers a global variable used by [[#SceKernelSuspendForDriver_4DF40893]].<br />
<br />
<source lang="C">int SceKernelSuspendForDriver_4E5A3A23(int a1);</source><br />
<br />
=== SceKernelSuspendForDriver_C00826AC ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 2.100.081-3.740.011 || 0xC00826AC<br />
|}<br />
<br />
Registers a global variable used by [[#SceKernelSuspendForDriver_4DF40893]].<br />
<br />
<source lang="C">int SceKernelSuspendForDriver_C00826AC(int a1);</source><br />
<br />
=== SceKernelSuspendForDriver_8B3F02B8 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 2.100.081-3.740.011 || 0x8B3F02B8<br />
|}<br />
<br />
Registers a global variable used by [[#SceKernelSuspendForDriver_1FA2F8F1]].<br />
<br />
<source lang="C">int SceKernelSuspendForDriver_8B3F02B8(int a1);</source><br />
<br />
== SceQafMgrForDriver ==<br />
<br />
Provides many device permission checks including running app privilege checks, debugging enabled checks, and so on.<br />
<br />
=== SceQafMgrForDriver_41E04800 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0x4F20A014<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
=== SceQafMgrForDriver_082A4FC2 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x082A4FC2<br />
|}<br />
<br />
Temp name was sceSblQafMgrIsAllowHost0AccessForDriver. A potential name could be sceSblQafMgrIsAllowRemoteLoadForDriver.<br />
<br />
Used by [[SceSblFwLoader#sceSblFwLoaderLockForDriver|sceSblFwLoaderLockForDriver]], [[SceKernelModulemgr]], [[SceSysStateMgr]] and [[SceSblPostSsMgr]].<br />
<br />
Used by [[SceSblPostSsMgr#sceSblSpsfoMgrOpenForDriver|sceSblSpsfoMgrOpenForDriver]].<br />
<br />
When this flag is set, it allows for example to load some files from host0:, for example SPSFO and psp2config.skprx.<br />
<br />
<source lang="C"><br />
// (*(uint8_t *)(qaf + 0xE) & 1)<br />
int SceQafMgrForDriver_082A4FC2(void);<br />
</source><br />
<br />
=== sceSblQafMgrIsAllowGameDebugForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x694D1096<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Only used by [[SceSblACMgr]].<br />
<br />
Might be something like sceSblQafMgrIsAllowUserAppDebug.<br />
<br />
<source lang="C"><br />
// (*(uint8_t *)(qaf + 0xB) & 4)<br />
int sceSblQafMgrIsAllowGameDebugForDriver(void);<br />
</source><br />
<br />
=== SceQafMgrForDriver_0E588747 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x0E588747<br />
|}<br />
<br />
Only used by [[SceRegistryMgr]].<br />
<br />
Returns true if the PSVita is an "Internal system".<br />
<br />
<source lang="C"><br />
// (*(uint8_t *)(qaf + 0xF) & 1)<br />
int SceQafMgrForDriver_0E588747(void);<br />
</source><br />
<br />
=== SceSblQafMgrForDriver_4BC1883F ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x4BC1883F<br />
|}<br />
<br />
Like a sceSblQafMgrIsAllowPSPEmuDevelopmentForDriver.<br />
<br />
<source lang="C"><br />
// (*(uint8_t *)(qaf + 0x6) & 2)<br />
int SceSblQafMgrForDriver_4BC1883F(void);<br />
</source><br />
<br />
=== sceSblQafMgrIsAllowSystemAppDebugForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0xCAD47130<br />
|}<br />
<br />
Used by [[SceDeci4pDtracep]] and [[SceSblACMgr]].<br />
<br />
If it returns false, syscalls debug trace printf is disabled.<br />
<br />
<source lang="C"><br />
// (*(uint8_t *)(qaf + 0xD) & 2)<br />
int sceSblQafMgrIsAllowSystemAppDebugForDriver(void);<br />
</source><br />
<br />
=== sceSblQafMgrIsAllowKernelDebugForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x382C71E8<br />
|}<br />
<br />
Used by [[SceKernelModulemgr]], [[SceExcpmgr]], [[SceCrashDump]], [[SceHdmi]], [[SceKernelBlueScreenOfDeath]].<br />
<br />
<source lang="C"><br />
// (*(uint8_t *)(qaf + 0xD) & 1)<br />
int sceSblQafMgrIsAllowKernelDebugForDriver(void);<br />
</source><br />
<br />
=== sceSblQafMgrIsAllowQAUpdateForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x3CB55F98<br />
|}<br />
<br />
Only used by [[SceSblUpdateMgr]].<br />
<br />
<source lang="C"><br />
// (*(uint8_t *)(qaf + 0xF) & 1)<br />
int sceSblQafMgrIsAllowQAUpdateForDriver(void);<br />
</source><br />
<br />
=== sceSblQafMgrIsAllowForceUpdateForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x8C423C18<br />
|}<br />
<br />
Only used by [[SceSblUpdateMgr]].<br />
<br />
<source lang="C"><br />
// (*(uint8_t *)(qaf + 0xF) & 2)<br />
int sceSblQafMgrIsAllowForceUpdateForDriver(void);<br />
</source><br />
<br />
=== SceQafMgrForDriver_52B4E164 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x52B4E164<br />
|}<br />
<br />
Only used by [[SceWlanBt]] and [[SceEnumWakeUp]].<br />
<br />
<source lang="C"><br />
// (*(uint8_t *)(qaf + 0xD) & 1)<br />
int SceQafMgrForDriver_52B4E164(void);<br />
</source><br />
<br />
=== SceQafMgrForDriver_883E9465 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x883E9465<br />
|}<br />
<br />
Temp name was sceSblQafMgrIsAllowDecryptedBootConfigLoadForDriver.<br />
<br />
Used by [[SceSysStateMgr]] only.<br />
<br />
Allows loading psp2config.skprx as plaintext format.<br />
<br />
<source lang="C"><br />
// (*(uint8_t *)(qaf + 0xE) & 1)<br />
int SceQafMgrForDriver_883E9465(void);<br />
</source><br />
<br />
=== SceQafMgrForDriver_B9770A13 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0xB9770A13<br />
|}<br />
<br />
Needed to be enabled to work with DIPSW 251 (Enable "dummytty0:"). Needed by [[SceSysStateMgr]] to allow loading <code>host0:psp2config.rpath</code>.<br />
<br />
Used by [[SceKernelModulemgr]] and [[SceSysmodule]].<br />
<br />
<source lang="C"><br />
// (*(uint8_t *)(qaf + 0xD) & 2)<br />
int SceQafMgrForDriver_B9770A13(void);<br />
</source><br />
<br />
=== sceSblQafMgrIsAllowRemotePlayDebugForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0xBFD5E463<br />
|}<br />
<br />
<source lang="C"><br />
// (*(uint8_t *)(qaf + 0xC) & 2)<br />
int sceSblQafMgrIsAllowRemotePlayDebugForDriver(void);<br />
</source><br />
<br />
=== SceQafMgrForDriver_E573F124 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0xE573F124<br />
|}<br />
<br />
<source lang="C"><br />
// (*(uint8_t *)(qaf + 0x0) & 0x10)<br />
int SceQafMgrForDriver_E573F124(void);<br />
</source><br />
<br />
=== sceSblQafMgrIsAllowMarlinTestForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.03-3.60 || 0x10283EB8<br />
|}<br />
<br />
<source lang="C"><br />
// (*(uint8_t *)(qaf + 0xD) & 2)<br />
int sceSblQafMgrIsAllowMarlinTestForDriver(void);<br />
</source><br />
<br />
=== sceSblQafMgrIsAllowNearTestForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.03-3.60 || 0x9644171D<br />
|}<br />
<br />
<source lang="C"><br />
// (*(uint8_t *)(qaf + 0x6) & 2)<br />
int sceSblQafMgrIsAllowNearTestForDriver(void);<br />
</source><br />
<br />
=== SceQafMgrForDriver_AE033133 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xAE033133<br />
|}<br />
<br />
Only used by [[SceNpDrm]].<br />
<br />
<source lang="C"><br />
// (*(uint8_t *)(qaf + 0x0) & 0x10)<br />
int SceQafMgrForDriver_AE033133(void);<br />
</source><br />
<br />
=== SceQafMgrForDriver_DEC6DF4E ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xDEC6DF4E<br />
|}<br />
<br />
Only used by [[SceNpDrm]].<br />
<br />
<source lang="C"><br />
// (*(uint8_t *)(qaf + 0xF) & 1)<br />
int SceQafMgrForDriver_DEC6DF4E(void);<br />
</source><br />
<br />
=== sceSblQafMgrIsAllowPSPEmuShowQAInfoForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xB7B195B2<br />
|}<br />
<br />
<source lang="C"><br />
// (*(uint8_t *)(qaf + 0xF) & 1)<br />
int sceSblQafMgrIsAllowPSPEmuShowQAInfoForDriver(void);<br />
</source><br />
<br />
=== sceSblQafMgrIsAllowLoadMagicGateForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x36E5312E<br />
|}<br />
<br />
<source lang="C"><br />
// (*(uint8_t *)(qaf + 0xB) & 0x10)<br />
int sceSblQafMgrIsAllowLoadMagicGateForDriver(void);<br />
</source><br />
<br />
=== sceSblQafMgrIsAllowDtcpIpResetForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xE8B8F31F<br />
|}<br />
<br />
<source lang="C"><br />
// (*(uint8_t *)(qaf + 0x6) & 2)<br />
int sceSblQafMgrIsAllowDtcpIpResetForDriver(void);<br />
</source><br />
<br />
=== sceSblQafMgrIsAllowControlIduAutoUpdateForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xF8BFEE48<br />
|}<br />
<br />
<source lang="C"><br />
// (*(uint8_t *)(qaf + 0x6) & 2)<br />
int sceSblQafMgrIsAllowControlIduAutoUpdateForDriver(void);<br />
</source><br />
<br />
=== sceSblQafMgrIsAllowKeepCoreFileForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xC1EA75C8<br />
|}<br />
<br />
<source lang="C"><br />
// (*(uint8_t *)(qaf + 0xF) & 1)<br />
int sceSblQafMgrIsAllowKeepCoreFileForDriver(void);<br />
</source><br />
<br />
=== SceQafMgrForDriver_70A67A4B ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x70A67A4B<br />
|}<br />
<br />
<source lang="C"><br />
// (*(uint8_t *)(qaf + 0xF) & 1)<br />
int SceQafMgrForDriver_70A67A4B(void);<br />
</source><br />
<br />
=== SceQafMgrForDriver_41E04800 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x41E04800<br />
|}<br />
<br />
Only used by [[SceAppMgr]].<br />
<br />
<source lang="C"><br />
// (*(uint8_t *)(qaf + 0xB) & 4)<br />
int SceQafMgrForDriver_41E04800(void);<br />
</source><br />
<br />
=== SceQafMgrForDriver_7B14DC45 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x7B14DC45<br />
|}<br />
<br />
Only used by [[SceAppMgr]].<br />
<br />
<source lang="C"><br />
// (*(uint8_t *)(qaf + 0xD) & 2)<br />
int SceQafMgrForDriver_7B14DC45(void);<br />
</source><br />
<br />
== ScePmMgrForDriver ==<br />
<br />
=== scePmMgrGetProductModeForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x2AC815A2<br />
|}<br />
<br />
Returns 0 on success, 0x800f0a29 on failure.<br />
<br />
Gets kbl_param using [[SceSysmem#sceKernelSysrootGetKblParamForKernel|sceKernelSysrootGetKblParamForKernel]].<br />
<br />
result = ((int *)(kbl_param->boot_type_indicator_1) >> 2) & 1; // manufacturing mode flag<br />
<br />
<source lang="C">int scePmMgrGetProductModeForDriver(char* result);</source><br />
<br />
=== scePmMgrIsExternalBootModeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xBD1F193B<br />
|}<br />
<br />
Gets kbl_param using [[SceSysmem#sceKernelSysrootGetKblParamForKernel|sceKernelSysrootGetKblParamForKernel]].<br />
<br />
return (int *)(kbl_param->boot_type_indicator_1) & 1; // external boot mode flag<br />
<br />
<source lang="C">int scePmMgrIsExternalBootModeForDriver(void);</source><br />
<br />
== SceSblAIMgrForDriver ==<br />
<br />
=== sceSblAIMgrGetSMIForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x47D9CF13<br />
|}<br />
<br />
SMI means Service / Manufacturing Information.<br />
<br />
SMI is read from SceKblParam->min_fw_version.<br />
<br />
<source lang="C">int sceSblAIMgrGetSMIForDriver(SceUInt32 *pSMI);</source><br />
<br />
=== sceSblAIMgrGetProductCodeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x14345161<br />
|}<br />
<br />
Temp name was sceSblAIMgrGetTargetIdForDriver.<br />
<br />
Product Code = Target Id<br />
<br />
<source lang="C">int sceSblAIMgrGetProductCodeForDriver(void);</source><br />
<br />
=== sceSblAIMgrGetProductSubCodeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xB33CEC8F<br />
|}<br />
<br />
Product Sub Code = model revision<br />
<br />
<source lang="C">int sceSblAIMgrGetProductSubCodeForDriver(void);</source><br />
<br />
=== sceSblAIMgrIsTestForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x3B638885<br />
|}<br />
<br />
TEST = Internal Test Unit<br />
<br />
Returns true if PsCode Product Code == 0x100.<br />
<br />
<source lang="C">int sceSblAIMgrIsTestForDriver(void);</source><br />
<br />
=== sceSblAIMgrIsToolForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x274663A0<br />
|}<br />
<br />
TOOL = DevKit<br />
<br />
Returns true if PsCode Product Code == 0x101.<br />
<br />
<source lang="C">int sceSblAIMgrIsToolForDriver(void);</source><br />
<br />
=== sceSblAIMgrIsDEXForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xF4B98F66<br />
|}<br />
<br />
Returns true if PsCode Product Code == 0x102.<br />
<br />
<source lang="C">int sceSblAIMgrIsDEXForDriver(void);</source><br />
<br />
=== sceSblAIMgrIsCEXForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xD78B04A2<br />
|}<br />
<br />
Returns true if PsCode Product Code 0x103-0x111 AND sceSblAIMgrIsSpecialCEXForDriver returns false.<br />
<br />
<source lang="C">int sceSblAIMgrIsCEXForDriver(void);</source><br />
<br />
=== sceSblAIMgrIsVITAForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0x4273B97B<br />
|}<br />
<br />
Returns sceSblAIMgrIsGenuineVITAForDriver. If the console is a PS TV, it returns false.<br />
<br />
<source lang="C">int sceSblAIMgrIsVITAForDriver(void);</source><br />
<br />
=== sceSblAIMgrIsDolceForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0x71608CA3<br />
|}<br />
<br />
Returns sceSblAIMgrIsGenuineDolceForDriver if returns true else returns sceKernelCheckDipswForDriver(0x98).<br />
<br />
<source lang="C">int sceSblAIMgrIsDolceForDriver(void);</source><br />
<br />
=== sceSblAIMgrIsGenuineVITAForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x963CA644<br />
|}<br />
<br />
Returns true if:<br />
*PsCode Product Code <= 0x111 AND sceSblAIMgrIsGenuineDolceForDriver returns false<br />
*sceSblAIMgrIsSpecialCEXForDriver returns true AND HardwareInfo != 0x700000 != 0x720000 != 0x510000<br />
<br />
<source lang="C">int sceSblAIMgrIsGenuineVITAForDriver(void);</source><br />
<br />
=== sceSblAIMgrIsGenuineDolceForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xC6E83F34<br />
|}<br />
<br />
<source lang="C">int sceSblAIMgrIsGenuineDolceForDriver(void);</source><br />
<br />
=== sceSblAIMgrIsDiagForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x6D5A3FC9<br />
|}<br />
<br />
Temp name was sceSblAIMgrIsSpecialCEXForDriver, sceSblAIMgrIsCEXJpFatForDriver.<br />
<br />
Returns true if PsCode Product Code == 0x103 (Japan), PsCode Product Sub Code == 0x10 (FAT chassis) and PsCode Factory Code == 0x24 (SCE labs).<br />
<br />
<source lang="C">int sceSblAIMgrIsDiagForDriver(void);</source><br />
<br />
=== sceSblAIMgrIsToolDVT1ForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0xBB9D146B<br />
|}<br />
<br />
Returns true if PsCode Product Code == 0x101 and PsCode Product Sub Code == 3.<br />
<br />
<source lang="C">int sceSblAIMgrIsToolDVT1ForDriver(void);</source><br />
<br />
=== sceSblAIMgrIsToolRev4ForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x37A79140<br />
|}<br />
<br />
Returns true if PsCode Product Code == 0x101 and PsCode Product Sub Code == 4.<br />
<br />
<source lang="C">int sceSblAIMgrIsToolRev4ForDriver(void);</source><br />
<br />
=== sceSblAIMgrIsToolDVT2ForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xE5E47FF7<br />
|}<br />
<br />
Returns true if PsCode Product Code == 0x101 and PsCode Product Sub Code == 5.<br />
<br />
<source lang="C">int sceSblAIMgrIsToolDVT2ForDriver(void);</source><br />
<br />
=== sceSblAIMgrIsCEXPrototypeRev2ForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xFF5784B9<br />
|}<br />
<br />
Returns true if PsCode Product Code == 0x103 and PsCode Product Sub Code == 2.<br />
<br />
<source lang="C">int sceSblAIMgrIsCEXPrototypeRev2ForDriver(void);</source><br />
<br />
=== sceSblAIMgrIsCEXPrototypeRev7ForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x05F79D4A<br />
|}<br />
<br />
Returns true if PsCode Product Code == 0x103 and PsCode Product Sub Code == 7.<br />
<br />
<source lang="C">int sceSblAIMgrIsCEXPrototypeRev7ForDriver(void);</source><br />
<br />
== SceProcEventForDriver ==<br />
<br />
=== sceKernelUnregisterProcEventHandlerForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x3DED57CC<br />
|}<br />
<br />
Temp name was sceProcEventDeleteUidForDriver.<br />
<br />
Wrapper to [[SceSysmem#sceGUIDCloseForDriver|sceGUIDCloseForDriver]].<br />
<br />
<source lang="C">int sceKernelUnregisterProcEventHandlerForDriver(int uid);</source><br />
<br />
=== sceKernelRegisterProcEventHandlerForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x2A43912D<br />
|}<br />
<br />
Temp name was sceProcEventCreateEventForDriver.<br />
<br />
Uses [[SceSysmem#sceKernelCreateEventForDriver|sceKernelCreateEventForDriver]].<br />
<br />
Returns uid.<br />
<br />
<source lang="C"><br />
typedef struct SceProcEventInvokeParam1 {<br />
SceSize size; // SceProcEventInvokeParam1 struct size : 0x10<br />
int unk_0x04;<br />
int unk_0x08;<br />
int unk_0x0C;<br />
} SceProcEventInvokeParam1;<br />
<br />
typedef struct SceProcEventInvokeParam2 {<br />
SceSize size; // SceProcEventInvokeParam2 struct size : 0x14<br />
SceUID pid;<br />
int unk_0x08;<br />
int unk_0x0C;<br />
int unk_0x10;<br />
} SceProcEventInvokeParam2;<br />
<br />
typedef struct SceProcEventHandler {<br />
SceSize size; // SceProcEventHandler struct size : 0x1C<br />
int (* create)(SceUID pid, SceProcEventInvokeParam2 *pParam, void *pCommon);<br />
int (* exit)(SceUID pid, SceProcEventInvokeParam1 *pParam, void *pCommon); // current process exit<br />
int (* kill)(SceUID pid, SceProcEventInvokeParam1 *pParam, void *pCommon); // by SceShell<br />
int (* suspend)(SceUID pid, int phase, SceProcEventInvokeParam1 *pParam, void *pCommon);<br />
int (* resume)(SceUID pid, int phase, SceProcEventInvokeParam1 *pParam, void *pCommon);<br />
int (* event_notify)(int evtype, int phase, SceProcEventInvokeParam2 *pParam, void *pCommon); //for arbitrary event types<br />
} SceProcEventHandler;<br />
<br />
/***<br />
* Registers a process event handler<br />
*<br />
* @param[in] name - Name of the event handler<br />
* @param[in] pHandler - Pointer to the handler structure<br />
* @param[in] pCommon - Arbitrary data passed to handlers<br />
*<br />
* @return Positive on success, < 0 on error.<br />
* @note Event handler pointers in pHandler may be NULL.<br />
*/<br />
SceUID sceKernelRegisterProcEventHandlerForDriver(const char *name, SceProcEventHandler *pHandler, void *pCommon);<br />
</source><br />
<br />
=== sceKernelInvokeProcEventHandlerForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x414CC813<br />
|}<br />
<br />
Walks the list of registered process event handlers and invokes the ones related to the signaled event.<br />
<br />
<source lang="C"><br />
//Event type constants (for evtype parameter)<br />
#define CREATE_EVENT 1 //<! Call create() handlers<br />
#define EXIT_EVENT 2 //<! Call exit() handlers<br />
#define KILL_EVENT 3 //<! Call kill() handlers<br />
#define SUSPEND_EVENT 4 //<! Call suspend() handlers<br />
#define RESUME_EVENT 5 //<! Call resume() handlers<br />
//All other values result in event_notify() handlers being called<br />
<br />
/***<br />
* Invoke process event handlers<br />
*<br />
* @param[in] process - PID of the process for which event happened<br />
* @param[in] evtype - Event type<br />
* @param[in] phase - Unknown<br />
* @param[in] pParam - Pointer to handler parameter<br />
* @param[out] pFailer - Pointer to a variable that receives UID of a failing handler. May be NULL.<br />
* @param[in] stop - GUID of a handler that should stop execution<br />
*<br />
* @return Positive number on success, < 0 on error. <br />
* Corresponds to the last executed handler's return value (or SCE_OK if none were executed).<br />
*<br />
* @note process, pFailer and stop are unofficial argument names<br />
*<br />
* Invocation is performed by walking the list in order (from first to last registered handler):<br />
* - If the GUID of the handler matches the "stop" parameter, the handle is NOT executed and the function returns.<br />
* This can be used to ensure only process event handlers registered before a specific one are executed.<br />
* - If the handler has no function pointer corresponding to the evtype, execution continues with the next handler.<br />
* - If the handler has a function pointer corresponding to the evtype, the function is called with the appropriate<br />
* arguments. If the return value is positive, execution continues with the next handler. If the return value is<br />
* negative, the handler has failed, the GUID of the failing handler is saved in *pFailer if non-NULL and the function<br />
* returns directly.<br />
*/<br />
int sceKernelInvokeProcEventHandlerForDriver(ScePID pid, int evtype, int phase, void* pParam, SceUID *pFailer, SceUID stop);<br />
</source><br />
<br />
== SceDebugLed ==<br />
<br />
=== sceKernelGetGPI ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x14F582CF<br />
|}<br />
<br />
<source lang="C">int sceKernelGetGPI(void);</source><br />
<br />
=== sceKernelSetGPO ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x78E702D3<br />
|}<br />
<br />
<source lang="C"><br />
/**<br />
* @brief Output to LED<br />
*<br />
* This sets the content displayed on the DevKit LED.<br />
* @param[in] uiBitd Bit pattern. only low-order 8 bits are valid.<br />
*/<br />
int sceKernelSetGPO(SceUInt32 uiBits);<br />
</source><br />
<br />
=== call_cb74 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x2B6EABAD<br />
|}<br />
<br />
<source lang="C">void call_cb74(int a1, int a2, int a3, int a4);</source><br />
<br />
=== call_cb78 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x0E6B9890<br />
|}<br />
<br />
<source lang="C">void call_cb78(int a1, int a2, int a3, int a4);</source><br />
<br />
== SceDebugLedForDriver ==<br />
<br />
GPI stands for General Purpose Input, and GPO stands for General Purpose Output.<br />
<br />
=== sceKernelGetGPIForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x14F582CF<br />
|}<br />
<br />
Only SceDebugLedForDriver function used by SceCoredump.<br />
<br />
<source lang="C">int sceKernelGetGPIForDriver(void);</source><br />
<br />
=== sceKernelSetGPIForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x51C5325A<br />
|}<br />
<br />
<source lang="C">int sceKernelSetGPIForDriver(int value);</source><br />
<br />
=== sceKernelGetGPOForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x3BB289F7<br />
|}<br />
<br />
<source lang="C">int sceKernelGetGPOForDriver(void);</source><br />
<br />
=== sceKernelSetGPOForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x78E702D3<br />
|}<br />
<br />
<source lang="C">int sceKernelSetGPOForDriver(SceUInt32 uiBits);</source><br />
<br />
=== sceKernelSetGPOMaskForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x098473B0<br />
|}<br />
<br />
<source lang="C">sceKernelSetGPOMaskForDriver(int a1, int a2);</source><br />
<br />
=== call_cb74 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x2B6EABAD<br />
|}<br />
<br />
<source lang="C">void call_cb74(int a1, int a2, int a3, int a4);</source><br />
<br />
=== set_cb74 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x24173819<br />
|}<br />
<br />
<source lang="C">int set_cb74(void *cb);</source><br />
<br />
=== call_cb78 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x0E6B9890<br />
|}<br />
<br />
<source lang="C">void call_cb78(int a1, int a2, int a3, int a4);</source><br />
<br />
=== set_cb78 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xF62154E7<br />
|}<br />
<br />
<source lang="C">int set_cb78(void *cb);</source><br />
<br />
== SceDebugForKernel ==<br />
<br />
=== sceKernelDebugModuleStart2ForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0xF624CE22<br />
|}<br />
<br />
<source lang="C">int sceKernelDebugModuleStart2ForKernel(void);</source><br />
<br />
=== sceKernelRegisterKprintfHandlerForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x10067B7B<br />
|}<br />
<br />
Temp name was sceDebugSetHandlersForKernel.<br />
<br />
<source lang="c">int sceKernelRegisterKprintfHandlerForKernel(int (* handler)(int unk, const char *format, va_list args), void *argp);</source><br />
<br />
=== sceKernelGetDebugPutcharHandlerForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xE783518C<br />
|}<br />
<br />
This is guessed name.<br />
<br />
Temp name was sceDebugGetPutcharHandlerForKernel, sceKernelGetDebugPutcharForKernel.<br />
<br />
Returns pointer to current debug putchar handler.<br />
<br />
<source lang="c">void *sceKernelGetDebugPutcharHandlerForKernel(void);</source><br />
<br />
=== sceKernelRegisterDebugPutcharHandlerForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xE6115A72<br />
|}<br />
<br />
Temp name was sceDebugRegisterPutcharHandlerForKernel, sceKernelRegisterDebugPutcharForKernel.<br />
<br />
Set debug print char handler.<br />
<br />
<source lang="c">int sceKernelRegisterDebugPutcharHandlerForKernel(int (* handler)(void *args, char c), void *args);</source><br />
<br />
=== sceKernelDebugPutcharForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x82D2EDCE<br />
|}<br />
<br />
Temp name was sceDebugPutcharForKernel.<br />
<br />
Print character to uart.<br />
<br />
Return 1.<br />
<br />
<source lang="c">int sceKernelDebugPutcharForKernel(char c);</source><br />
<br />
=== sceKernelTtyPutcharForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || not present<br />
|-<br />
| 3.60 || 0x254A4997<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Prints a character to the 0x1000-byte buffer returned by [[SceSysmem#sceKernelGetTtyInfoForDriver]].<br />
<br />
On success, returns printed size (always 1).<br />
<br />
<source lang="c">int sceKernelTtyPutcharForKernel(char c);</source><br />
<br />
=== sceKernelStoppedForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || 0xF1F0C365<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int sceKernelStoppedForKernel(const char *pFile, const char *pFunc, int line);</source><br />
<br />
=== panic_on_kernel_exception ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || not present<br />
|-<br />
| 3.60 || 0x082B8D6A<br />
|-<br />
| 3.65 || 0xCCABDD98<br />
|}<br />
<br />
Prints information about a Kernel Exception, ?and certainly calls [[SceCoredump]]?, then calls SceSysrootForKernel_0DF574A9 in an infinite loop.<br />
<br />
This function doesn't return.<br />
<br />
See [[SceExcpmgr#sceKernelRegisterExceptionHandlerForKernel]] for the meaning of excpcode.<br />
<br />
<source lang="C"><br />
// excp_name can be:<br />
// UNDEF - Undefined instruction<br />
// PABT - Prefetch Abort<br />
// DABT - Data Abort<br />
// NEST - Nested? Same excpcode as UNDEF<br />
void panic_on_kernel_exception(SceKernelDebugInfo *dbginfo, SceExcpmgrExceptionContext *excp_ctx, int excpcode, const char *excp_name);<br />
</source><br />
<br />
=== register_unk_handler ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || not present<br />
|-<br />
| 3.60 || 0x66D82EC8<br />
|}<br />
<br />
used by [[SceDeci4pSDbgp]].<br />
<br />
handler definition:<br />
<source lang="C">handler(int some_level, void *unk, const void *buf);</source><br />
<br />
<source lang="C">int register_unk_handler(void *handler);</source><br />
<br />
=== sceKernelEnableCrashDumpForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.81 || not present<br />
|-<br />
| 2.000.081-3.610.011 || 0xF857CDD6<br />
|-<br />
| 3.630.011-3.740.011 || 0xA465A31A<br />
|}<br />
<br />
This is a guessed name. Temp name was sceDebugDisableInfoDumpForKernel, sceKernelEnableInfoDumpForKernel.<br />
<br />
Returns previous crash dump state.<br />
<br />
<source lang="C">int sceKernelEnableCrashDumpForKernel(SceBool enable);</source><br />
<br />
=== register_log_buffer ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0x4703ECC4<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int register_log_buffer(const void *log_buffer_addr, SceSize log_buffer_size);</source><br />
<br />
=== start_logging ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0x4C377B11<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
Returns 1 if logging has been started successfully, -1 else.<br />
<br />
<source lang="C">int start_logging(int state);</source><br />
<br />
=== stop_logging ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0x604F56AE<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
If state is not zero, stops logging and return 1, else does nothing and return 0.<br />
<br />
Returns 1 if logging has been stopped, 0 else.<br />
<br />
<source lang="C">int stop_logging(void);</source><br />
<br />
=== refresh_logs ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0x04A3046D<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int refresh_logs(void);</source><br />
<br />
=== _sceKernelPrintDebugLogForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0xEFDE973B<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
If a2 is not zero, the current log buffer address is updated, else it is unchanged.<br />
<br />
maxNum is guessed to be either the number of entries or the index of the chosen entry. Entry size is 0x40 bytes.<br />
<br />
Uses sceKernelPrintfLevelForDriver to print.<br />
<br />
<source lang="C">int _sceKernelPrintDebugLogForKernel(int a1, int a2, int maxNum);</source><br />
<br />
=== sceKernelPrintDebugLogForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0xBD5D0BB0<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
Calls _sceKernelPrintDebugLogForKernel with maxNum = (log_buf_end - log_buf_start) / 0x40.<br />
<br />
<source lang="C">int sceKernelPrintDebugLogForKernel(int a1, int a2);</source><br />
<br />
=== print_with_log_buffer ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0x904FF72D<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int print_with_log_buffer(const char *string, SceSize maxlen);</source><br />
<br />
=== sceKernelPrintfCore0ForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0x2D7380FE<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
Same as sceKernelPrintfForDriver but only prints if CPU ID is 0.<br />
<br />
<source lang="C">int sceKernelPrintfCore0ForKernel(const char *fmt, ...);</source><br />
<br />
=== sceKernelPrintfLevelCore0ForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0x14241F51<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
Same as sceKernelPrintfLevelForDriver but only prints if CPU ID is 0.<br />
<br />
<source lang="C">int sceKernelPrintfLevelCore0ForKernel(int level, const char *fmt, ...);</source><br />
<br />
=== sceKernelSetDebugLevelForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0xBE2C05A2<br />
|}<br />
<br />
Temp name was sceKernelSetMinimumLogLevelForKernel.<br />
<br />
<source lang="C">SceUInt32 sceKernelSetDebugLevelForKernel(SceUInt32 dbgLevel);</source><br />
<br />
=== sceKernelGetDebugLevelForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0xDA6B6770<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
Temp name was sceKernelGetMinimumLogLevelForKernel.<br />
<br />
Returns the dbgLevel set by sceKernelSetDebugLevelForKernel.<br />
<br />
<source lang="C">SceUInt32 sceKernelGetDebugLevelForKernel(void);</source><br />
<br />
=== sceKernelSetAssertLevelForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0xCE9060F1<br />
|}<br />
<br />
Temp name was sceKernelSetMinimumAssertionLevelForKernel.<br />
<br />
Overrides in memory g_assertLevel set by DIP switches 201 and 202.<br />
<br />
Returns the previous assert level.<br />
<br />
<source lang="C">SceInt32 sceKernelSetAssertLevelForKernel(SceUInt32 assertLevel);</source><br />
<br />
=== sceKernelGetAssertLevelForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0x374B7868<br />
|-<br />
| 0.990-3.60 || not present. Present in [[#SceDebugForDriver]].<br />
|}<br />
<br />
Temp name was sceKernelGetMinimumAssertionLevelForKernel.<br />
<br />
Returns g_assertLevel from memory.<br />
<br />
<source lang="C">SceInt32 sceKernelGetAssertLevelForKernel(void);</source><br />
<br />
=== SceDebugForKernel_BEF921A2 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || not present<br />
|-<br />
| 3.60-3.61 || 0xBEF921A2<br />
|-<br />
| 3.63 || 0x5D6F0CFC<br />
|}<br />
<br />
<source lang="C"><br />
// buf size is 0x1000 bytes<br />
// buf_400 size is 0x400 bytes<br />
SceSSize SceDebugForKernel_BEF921A2(void *dst, int cpuId, SceUInt64 time, SceKernelDebugInfo *dbginfo, const void *excp_info_buf_0x400, int excpcode);<br />
</source><br />
<br />
=== add_entry ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || 0x1208240D<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C"><br />
// ex: add_entry(0xA1, in_lr, 3, name); in SceSysmem<br />
// ex: add_entry(0xAB, in_lr, 1, uid); in SceSysmem<br />
// ex: add_entry(0xBB, in_lr, 0, param_4); in SceProcessmgr<br />
int add_entry(SceSize maxlen, int a2, int a3, void *log_buffer_start);<br />
</source><br />
<br />
=== add_entry2 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0x061A4657<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int add_entry2(int a1, const char *msg, void *log_buffer_start, int a4);</source><br />
<br />
=== sceDebugRegisterBacktraceInternalForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.610.011 || 0xEFF9962B<br />
|-<br />
| 3.630.011-3.740.011 || 0x91E7D24F<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Registers a callback for [[SceKernelModulemgr#sceKernelBacktraceInternalForDriver]].<br />
<br />
If callback runs successfully (returns >= 0), value of pNumReturn is used as third argument of PrintBacktrace, else PrintBacktrace is not called at all.<br />
<br />
<source lang="C">int sceDebugRegisterBacktraceInternalForKernel(int (* callback)(SceUID threadId, SceKernelCallFrame *pCallFrameBuffer, SceSize numBytesBuffer, SceUInt32 *pNumReturn, SceInt32 mode));</source><br />
<br />
=== sceDebugRegisterPrintBacktraceForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0xB5943011<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Registers a callback for [[SceKernelModulemgr#sceKernelPrintBacktraceForDriver]].<br />
<br />
<source lang="C">int sceDebugRegisterPrintBacktraceForKernel(int (* callback)(SceUID processId, const SceKernelCallFrame *pCallFrame, SceUInt32 numFrames));</source><br />
<br />
=== sceKernelPrintSyscallFrameForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x25E31E18<br />
|-<br />
| 3.65 || 0xBCC8D0B2<br />
|}<br />
<br />
<source lang="C"><br />
// if pSyscallFrame is NULL, it will use the current syscall frame<br />
// pResult is a pointer to a 0x10 bytes buffer and may be NULL<br />
void sceKernelPrintSyscallFrameForKernel(SceUID pid, SceSyscallFrame *pSyscallFrame, SceUInt32 *pResult);<br />
</source><br />
<br />
=== SceDebugForKernel_F1F861CF ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 2.00-3.60 || 0xF1F861CF<br />
|}<br />
<br />
Registers a callback that is called when a crash occur.<br />
<br />
Used by [[SceKernelBlueScreenOfDeath]].<br />
<br />
<source lang="C">int SceDebugForKernel_F1F861CF(void *cb);</source><br />
<br />
=== SceDebugForKernel_1526DD83 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.20 || 0x1526DD83<br />
|}<br />
<br />
Register [[SceSysmem#sceEventLogPutForDriver|sceEventLogPutForDriver]] internal callback.<br />
<br />
== SceDebugForDriver ==<br />
<br />
If AllowKernelDebug QA flag is not set, calls to functions with non-zero SceKernelDebugLevel are ignored.<br />
<br />
=== sceKernelPrintfForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x391B74B7<br />
|}<br />
<br />
Temp name was sceDebugPrintfForDriver.<br />
<br />
<source lang="C">int sceKernelPrintfForDriver(const char *fmt, ...);</source><br />
<br />
=== sceKernelVprintfForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x411C0733<br />
|}<br />
<br />
<source lang="C">int sceKernelVprintfForDriver(const char *fmt, va_list arg);</source><br />
<br />
=== sceKernelPrintfLevelForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x1A3F2AA4<br />
|}<br />
<br />
<source lang="C">int sceKernelPrintfLevelForDriver(SceUInt32 level, const char *fmt, ...);</source><br />
<br />
=== sceKernelVprintfLevelForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || not present<br />
|-<br />
| 3.60 || 0x611A158B<br />
|}<br />
<br />
<source lang="C">int sceKernelVprintfLevelForDriver(SceUInt32 level, const char *fmt, va_list arg);</source><br />
<br />
=== sceKernelPrintfLevelWithInfoForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || not present<br />
|-<br />
| 3.60 || 0xD9703808<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Temp name was sceKernelPrintfLevelWithCtxForDriver.<br />
<br />
<source lang="C">int sceKernelPrintfLevelWithInfoForDriver(SceUInt32 level, int flags, const SceKernelDebugInfo *dbginfo, const char *fmt, ...);</source><br />
<br />
=== sceKernelPrintfWithInfoForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || not present<br />
|-<br />
| 3.60 || 0x02B04343<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Temp name was sceDebugPrintf2ForDriver, sceKernelVprintfLevelWithCtxForDriver.<br />
<br />
<source lang="C">int sceKernelPrintfWithInfoForDriver(SceUInt32 flags, const SceKernelDebugInfo *dbginfo, const char *fmt, ...);</source><br />
<br />
=== sceKernelAssertForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x35A35322<br />
|}<br />
<br />
Temp name was sceDebugPrintKernelAssertionForDriver.<br />
<br />
Condition 0 can trigger "kernel stopped".<br />
<br />
<source lang="C"><br />
// 0.931-0.990:<br />
// addr is maybe not an argument but the stack pointer got within the function<br />
int sceKernelAssertForDriver(SceBool condition, const char *pFile, const char *pFunc, int line, const void *addr);<br />
<br />
// 3.60:<br />
int sceKernelAssertForDriver(SceBool condition, const SceKernelDebugInfo *dbginfo, const void *addr);<br />
</source><br />
<br />
=== sceKernelAssertLevelForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0xFD753E7A<br />
|}<br />
<br />
<source lang="C"><br />
// 0.931-0.990:<br />
int sceKernelAssertLevelForDriver(int level, SceBool condition, const char *pFile, const char *pFunc, int line, const void *addr);<br />
<br />
// 3.60:<br />
int sceKernelAssertLevelForDriver(int level, SceBool condition, const SceKernelDebugInfo *dbginfo, const void *addr);<br />
</source><br />
<br />
=== sceKernelPrintfAssertLevelForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931 || not present<br />
|-<br />
| 0.990-3.60 || 0x821A2D59<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Temp name was sceDebugPrintfKernelAssertionForDriver, sceKernelVprintfAssertLevelForDriver.<br />
<br />
<source lang="C"><br />
// 0.990:<br />
int sceKernelPrintfAssertLevelForDriver(SceUInt32 level, SceBool condition, const char *pFile, const char *pFunc, int line, const void *addr, const char *fmt, va_list arg);<br />
<br />
// 3.50-3.60:<br />
int sceKernelPrintfAssertLevelForDriver(SceUInt32 level, SceBool condition, const SceKernelDebugInfo *dbginfo, const void *lr, const char *fmt, ...);<br />
</source><br />
<br />
=== sceKernelGetAssertLevelForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || not present. Present in [[#SceDebugForKernel]].<br />
|-<br />
| 0.990-3.60 || 0x374B7868<br />
|}<br />
<br />
Temp name was sceKernelGetMinimumAssertionLevelForDriver.<br />
<br />
Returns g_assertLevel from memory.<br />
<br />
<source lang="C">SceInt32 sceKernelGetAssertLevelForDriver(void);</source><br />
<br />
=== sceKernelPanicForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || not present<br />
|-<br />
| 3.60 || 0x391B5B74<br />
|}<br />
<br />
Temp name was sceDebugPrintKernelPanicForDriver.<br />
<br />
<source lang="C">int sceKernelPanicForDriver(const SceKernelDebugInfo *dbginfo, const void *addr);</source><br />
<br />
=== sceKernelPrintfPanicForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || not present<br />
|-<br />
| 3.60 || 0x00CCE39C<br />
|}<br />
<br />
<source lang="C">void sceKernelPrintfPanicForDriver(const SceKernelDebugInfo *dbginfo, const void *addr, const char *fmt, ...);</source><br />
<br />
=== sceKernelGetDebugTailLogForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || not present<br />
|-<br />
| 3.60 || 0x62466B0A<br />
|}<br />
<br />
Temp name was sceKernelGetTtyInfoForDriver.<br />
<br />
Gets tty tail log.<br />
<br />
<source lang="C"><br />
// max bufSize is 0x1000<br />
int sceKernelGetDebugTailLogForDriver(void *pBuf, SceSize bufSize);<br />
</source><br />
<br />
=== _sceEventLogPutForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || not present<br />
|-<br />
| 3.60 || 0x95B38C6C<br />
|}<br />
<br />
Derived from [[SceVshBridge#_vshEventLogPut]].<br />
<br />
Calls [[SceSysmem#sceEventLogPutForDriver]] with KERNEL PID and [[SceSysmem#SceSysrootForKernel_D441DC34]] return value as second argument.<br />
<br />
<source lang="C"><br />
// id: 10001 (SceProcessmgr), 20001 (SceWlanBt)<br />
// index: 1, 2, 3, 4, 5 (SceProcessmgr), 1, 2, 3, 4 (SceWlanBt)<br />
// a3: 0 (SceProcessmgr, SceWlanBt)<br />
// bufSize: 0x1C (SceProcessmgr), 4 (SceWlanBt)<br />
// max bufSize is 0x80<br />
int _sceEventLogPutForDriver(int id, int index, int a3, void *pBuf, SceSize bufSize);<br />
</source><br />
<br />
=== sceEventLogPutForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || not present<br />
|-<br />
| 3.60 || 0x912CF2BA<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C"><br />
// max bufSize is 0x80<br />
int sceEventLogPutForDriver(SceUInt32 pid, int a2, int id, int index, int a5, void *pBuf, SceSize bufSize);<br />
</source><br />
<br />
=== sceKernelGetEventLogForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || not present<br />
|-<br />
| 3.60 || 0xCC5365D3<br />
|}<br />
<br />
Temp name was sceEventLogGetInfoForDriver.<br />
<br />
Copy by blocks of 0x30 bytes (or maybe 0xC0 bytes).<br />
<br />
<source lang="C"><br />
// max bufSize is 0xC00 (0x40 blocks of size 0x30)<br />
int sceKernelGetEventLogForDriver(SceKernelDebugEventLog *pBuf, SceSize bufSize, SceSize *pReadBlocks);<br />
</source><br />
<br />
== SceSysmemForTZS ==<br />
<br />
=== sceKernelProcModeVAtoPAForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0x119B9547<br />
|-<br />
| 0.990-3.73 || not present<br />
|}<br />
<br />
<source lang="C">int sceKernelProcModeVAtoPAForTZS(SceUID pid, uint32_t mode, void *pVA, void **pPA);</source><br />
<br />
=== sceKernelAllocPartitionStackMemBlockForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0x69022B7F<br />
|-<br />
| 0.990-3.73 || not present<br />
|}<br />
<br />
=== sceKernelGetPhyPageResetForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940-1.80 || 0x3FEF6B39<br />
|-<br />
| 3.60-3.73 || not present<br />
|}<br />
<br />
=== sceKernelDeleteHeapForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x624454BC<br />
|}<br />
<br />
=== sceKernelCreateHeapForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x56A16D84<br />
|}<br />
<br />
=== sceKernelAllocHeapMemoryWithOptionForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0xEA712806<br />
|}<br />
<br />
=== sceKernelAllocHeapMemoryForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x473871D8<br />
|}<br />
<br />
=== sceKernelFreeHeapMemoryForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x42FB5B12<br />
|}<br />
<br />
=== sceKernelAllocUncacheHeapMemoryForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940-3.60 || 0x29DE887D<br />
|}<br />
<br />
=== sceKernelAllocUncacheHeapMemoryWithOptionForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x6A3FBAF0<br />
|}<br />
<br />
=== sceKernelFreeUncacheHeapMemoryForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x2F18E288<br />
|}<br />
<br />
=== sceKernelNameHeapDeleteForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xF459D09D<br />
|}<br />
<br />
=== sceKernelNameHeapInsertForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x42AD34AB<br />
|}<br />
<br />
=== sceKernelSetSuspendIntrFuncForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940-1.80 || 0xB4306D21<br />
|-<br />
| 3.60-3.73 || not present<br />
|}<br />
<br />
=== sceKernelSetResumeIntrFuncForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940-1.80 || 0x418111B0<br />
|-<br />
| 3.60-3.73 || not present<br />
|}<br />
<br />
=== sceKernelAddressSpaceUnmapForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940-3.60 || 0x31273DC7<br />
|}<br />
<br />
=== sceKernelGetMemBlockBaseForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0xE1DEDFF4<br />
|}<br />
<br />
<source lang="C"><br />
/**<br />
* @brief Get mapped base address of memory block.<br />
*<br />
* Get base address of memory block.<br />
* @param[in] uid block id<br />
* @param[out] ppBase base address of memory block<br />
* @retval SCE_OK success<br />
* @retval <SCE_OK Error<br />
*/<br />
int sceKernelGetMemBlockBaseForTZS(SceUID uid, void **ppBase);<br />
</source><br />
<br />
=== sceKernelFreeMemBlockForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940-3.60 || 0x658EACE3<br />
|}<br />
<br />
=== sceKernelAllocMemBlockForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940-3.60 || 0x402EB970<br />
|}<br />
<br />
<source lang="c"><br />
SceUID sceKernelAllocMemBlockForTZS(const char *name, SceKernelMemBlockType type, SceSize vsize, const struct SceKernelAllocMemBlockOptKernel *pOpt);<br />
</source><br />
<br />
=== sceKernelAllocPartitionMemBlockForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940-3.60 || 0x0028E26C<br />
|}<br />
<br />
Temp name was sceKernelAllocMemBlockForPidForTZS.<br />
<br />
<source lang="c">SceUID sceKernelAllocPartitionMemBlockForTZS(SceUID pid, const char *name, SceKernelMemBlockType type, SceSize vsize, const struct SceKernelAllocMemBlockOptKernel *pOpt);</source><br />
<br />
=== sceKernelVAtoPAForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x1DEADF6C<br />
|}<br />
<br />
This will write the physical address for a virtual address <code>pVA</code> to memory pointed to by <code>ppPA</code>.<br />
<br />
Returns <0 on error, values >=0 indicate success.<br />
<br />
<source lang="c">int sceKernelVAtoPAForTZS(void *pVA, void **ppPA);</source><br />
<br />
=== sceKernelVARangeToPAVectorForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x9D43E416<br />
|}<br />
<br />
=== sceKernelCreateAddressSpaceForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0x21906368<br />
|-<br />
| 0.990-3.73 || not present<br />
|}<br />
<br />
=== SceSysmemForTZS_038EAEEE ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || not present<br />
|-<br />
| 3.60 || 0x038EAEEE<br />
|}<br />
<br />
== SceDipswForTZS ==<br />
<br />
=== sceKernelCheckDipswForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940-3.60 || 0xA98FC2FD<br />
|}<br />
<br />
== SceUartForTZS ==<br />
<br />
=== sceUartWriteForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x3AFD5E71<br />
|}<br />
<br />
== SceDebugForTZS ==<br />
<br />
=== sceKernelDebugModuleStart2ForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0x32E3D4B9<br />
|}<br />
<br />
<source lang="C">int sceKernelDebugModuleStart2ForTZS(void);</source><br />
<br />
=== sceKernelRegisterKprintfHandlerForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0x0AD558D5<br />
|}<br />
<br />
<source lang="c">int sceKernelRegisterKprintfHandlerForTZS(int (*kprintf)(const char *fmt, ...), const void *args);</source><br />
<br />
=== sceKernelDebugPutcharForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0xD36F27BA<br />
|}<br />
<br />
Print character.<br />
<br />
<source lang="c">int sceKernelDebugPutcharForTZS(char c);</source><br />
<br />
=== sceKernelStoppedForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || 0xCB502FD1<br />
|-<br />
| 1.80 || not present<br />
|}<br />
<br />
<source lang="C">int sceKernelStoppedForTZS(const char *maybe_pFile, const char *maybe_pFunc, int maybe_line);</source><br />
<br />
=== sceKernelAssertForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x2F9B8AA8<br />
|}<br />
<br />
<source lang="C"><br />
// 0.931-0.990:<br />
int sceKernelAssertForTZS(SceBool condition, const char *pFile, const char *pFunc, int line, const void *addr);<br />
<br />
// 3.60:<br />
int sceKernelAssertForTZS(SceBool condition, const SceKernelDebugInfo *dbginfo, const void *addr);<br />
</source><br />
<br />
=== sceKernelAssertLevelForTZS ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x618F89E6<br />
|}<br />
<br />
<source lang="C"><br />
// 3.60:<br />
int sceKernelAssertLevelForTZS(int level, SceBool condition, const SceKernelDebugInfo *dbginfo, const void *addr);<br />
</source><br />
<br />
=== sceKernelGetAssertLevelForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xF851BA4F<br />
|}<br />
<br />
Returns g_assertLevel from memory.<br />
<br />
<source lang="C">SceInt32 sceKernelGetAssertLevelForTZS(void);</source><br />
<br />
=== _sceKernelPrintDebugLogForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0x4FF6536C<br />
|}<br />
<br />
<source lang="C">int _sceKernelPrintDebugLogForTZS(int a1, int a2, int maxNum);</source><br />
<br />
=== sceKernelPrintDebugLogForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0x85BF33E1<br />
|}<br />
<br />
<source lang="C">int sceKernelPrintDebugLogForTZS(int a1, int a2);</source><br />
<br />
=== print_with_log_buffer ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0x1FD92289<br />
|}<br />
<br />
<source lang="C">int print_with_log_buffer(const char *msg, SceSize maxlen);</source><br />
<br />
=== sceKernelPrintfForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-1.80 || 0x1655E0E3<br />
|}<br />
<br />
<source lang="C">int sceKernelPrintfForTZS(const char *fmt, ...);</source><br />
<br />
=== sceKernelPrintfLevelForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-1.80 || 0xC70CBB58<br />
|}<br />
<br />
<source lang="C">int sceKernelPrintfLevelForTZS(int level, const char *fmt, ...);</source><br />
<br />
=== sceKernelPrintfCore0ForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0x08F8AD70<br />
|}<br />
<br />
Same as sceKernelPrintfForTZS but only prints if CPU ID is 0. <br />
<br />
<source lang="C">int sceKernelPrintfCore0ForTZS(const char *fmt, ...);</source><br />
<br />
=== sceKernelPrintfLevelCore0ForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-1.80 || 0xD4E6A0C0<br />
|}<br />
<br />
Same as sceKernelPrintfLevelForTZS but only prints if CPU ID is 0.<br />
<br />
<source lang="C">int sceKernelPrintfLevelCore0ForTZS(int level, const char *fmt, ...);</source><br />
<br />
=== sceKernelSetMinimumLogLevelForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0x898E417E<br />
|}<br />
<br />
<source lang="C"><br />
/**<br />
* @brief Specifies the minimum severity level for the output of logging information.<br />
*<br />
* Specifies the minimum severity level for the output of logging information. The default level is SCE_DBG_LOG_LEVEL_TRACE.<br />
*<br />
* @param minimumLogLevel The minimum severity at which debugging messages should be output.<br />
* @retval SCE_OK The operation was completed successfully.<br />
* @retval Negative value Error code<br />
*/<br />
int sceKernelSetMinimumLogLevelForTZS(SceInt32 minimumLogLevel);<br />
</source><br />
<br />
=== register_log_buffer ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0xF2A87E96<br />
|}<br />
<br />
<source lang="C">int register_log_buffer(const void *log_buffer_addr, SceSize log_buffer_size);</source><br />
<br />
=== start_logging ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0x1FF65E15<br />
|}<br />
<br />
<source lang="C">int start_logging(int state);</source><br />
<br />
=== stop_logging ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0x5A35E3E0<br />
|}<br />
<br />
If state is not zero, stops logging and return 1, else does nothing and return 0.<br />
<br />
Returns 1 if logging has been stopped, 0 else.<br />
<br />
<source lang="C">int stop_logging(void);</source><br />
<br />
=== refresh_logs ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0x91B41C34<br />
|}<br />
<br />
<source lang="C">int refresh_logs(void);</source><br />
<br />
=== add_entry ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0x95E1A80B<br />
|}<br />
<br />
<source lang="C">int add_entry(int a1, int a2, int a3, void *log_buffer_start);</source><br />
<br />
=== add_entry2 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0x538319EB<br />
|}<br />
<br />
<source lang="C">int add_entry2(int a1, const char *msg, void *log_buffer_start, int a4);</source><br />
<br />
=== register_unk_cb ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0x3598118B<br />
|}<br />
<br />
The callback has this definition:<br />
<source lang="C"><br />
// unk: 2 or 3<br />
int unk_cb(SceUID pid, void *buf, SceSize size, int *pOut, int unk);<br />
</source><br />
<br />
If unk_cb runs successfully (return >= 0), pOut is used as third argument of unk_cb2, else unk_cb2 is not called at all.<br />
<br />
<source lang="C">int register_unk_cb(void *some_cb);</source><br />
<br />
=== register_unk_cb2 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0xE844FC5A<br />
|-<br />
| 0.990-3.60 || not present<br />
|}<br />
<br />
The callback has this definition:<br />
<source lang="C">int unk_cb2(SceUID pid, void *buf, int unk);</source><br />
<br />
<source lang="C">int register_unk_cb2(void *some_cb);</source><br />
<br />
=== SceDebugForTZS_563B623D ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || not present<br />
|-<br />
| 1.80-3.60 || 0x563B623D<br />
|}<br />
<br />
=== SceDebugForTZS_0D799DAE ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || not present<br />
|-<br />
| 3.60 || 0x0D799DAE<br />
|}<br />
<br />
<source lang="C">int SceDebugForTZS_0D799DAE(SceUInt32 msg_type, void *msg_ctx, const char *fmt, va_list arg);</source><br />
<br />
=== SceDebugForTZS_D26EB4BB ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || not present<br />
|-<br />
| 3.60 || 0xD26EB4BB<br />
|}<br />
<br />
<source lang="C">int SceDebugForTZS_D26EB4BB(SceBool condition, SceUInt32 msg_type, void *msg_ctx, const char *fmt, ...);</source><br />
<br />
== SceCpuForTZS ==<br />
<br />
* 0.931: 0xACA39932: unknown, save context that will be restored with 0xCA74C9A2<br />
* 0.931: 0xCA74C9A2: unknown, restore context saved with 0xACA39932<br />
* 0.931: 0xE0B34336: unknown, same as SceCpuForKernel_9D72DD1B<br />
* 0.931-0.990: 0x40DEC1B6: sceKernelWaitForEvent<br />
* 0.931-0.990: 0xF42F079B: sceKernelSendEvent<br />
* 0.940: 0x1266F962: sceKernelAbort<br />
* 0.931-0.940: 0x98BF47D3: sceKernelGetVmaccessRange<br />
* 0.931: 0x49AD8B60: sceKernelSetFIQModeStack<br />
* 0.931: 0xC2A428F3: sceKernelSetMonModeStack<br />
* 0.931: 0xD9013440: sceKernelSetIRQModeStack<br />
* 0.931: 0xDF17E4A3: sceKernelSetUndModeStack<br />
* 0.931: 0xF832C341: sceKernelSetAbtModeStack<br />
* 0.931: 0xFB1D3114: sceKernelSetSvcModeStack<br />
* 0.931: 0xF6CE21EA: sceKernelPrintCpuMode<br />
* 3.60: 0x31E78A4B: unknown<br />
* 3.60: 0x4FED4BCE: unknown<br />
* 3.60: 0x7548CBCF: unknown<br />
* 3.60: 0xD4E7413D: unknown<br />
<br />
1.80:<br />
NID 0: 0x0A15B41C: sceKernelL1DcacheCleanInvalidateAll<br />
NID 1: 0x17A88E69: sceKernelL1DcacheCleanRange<br />
NID 2: 0x190D96D5: sceKernelDcacheCleanRange<br />
NID 3: 0x2A0A3DC6<br />
NID 4: 0x2B6403F8: on FW 3.60, does nothing and returns -1<br />
NID 5: 0x2FE24445: sceKernelCpuAtomicSet32<br />
NID 6: 0x308D7ABE: sceKernelCpuDcacheInvalidateMVACRange<br />
NID 7: 0x324727D1: sceKernelGetCpsr<br />
NID 8: 0x39FCFCC2: sceKernelDomainTextMemcpy<br />
NID 9: 0x44C423D3: sceKernelCpuId<br />
NID 10: 0x49B11FF8<br />
NID 11: 0x71FD9AB5: sceKernelSpinlockLowLock<br />
NID 12: 0x72CA4F7A: sceKernelGetSpsr<br />
NID 13: 0x75D87321: sceKernelCpuAtomicOrAndGet32<br />
NID 14: 0x7A5373EB: sceKernelDcacheCleanInvalidateRange<br />
NID 15: 0x7CCE9480: sceKernelDcacheCleanInvalidateAll<br />
NID 16: 0x864E3DED<br />
NID 17: 0x9E4C0D0D: on FW 3.60, does nothing and returns -1<br />
NID 18: 0xA5965CBF: sceKernelL1IcacheInvalidateEntireAllCore<br />
NID 19: 0xACF209F3: sceKernelSpinlockLowTrylockCpuSuspendIntr<br />
NID 20: 0xB421FAFD: sceKernelL1IcacheInvalidateRange<br />
NID 21: 0xB8F00FBE: sceKernelSpinlockLowUnlockCpuResumeIntr<br />
NID 22: 0xC4137AED: sceKernelPleFlushRequest<br />
NID 23: 0xCD98416C: sceKernelSpinlockLowUnlock<br />
NID 24: 0xCDD46655: sceKernelDcacheInvalidateRange<br />
NID 25: 0xD67A4356: sceKernelSpinlockLowLockCpuSuspendIntr<br />
NID 26: 0xEFD6F289: sceKernelCpuAtomicCompareAndSet8<br />
<br />
== SceSysclibForTZS ==<br />
<br />
=== __stack_chk_fail ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.80-3.60 || 0xE5457B97<br />
|}<br />
<br />
=== __stack_chk_guard ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xBA505B15<br />
|}<br />
<br />
This is a variable.<br />
<br />
=== strncpy ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940-3.60 || 0x361850BB<br />
|}<br />
<br />
=== memcpy ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0xBE3AF2EE<br />
|}<br />
<br />
=== memset ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x956DB750<br />
|}<br />
<br />
== SceSysrootForTZS ==<br />
<br />
=== sceKernelSysrootBacktraceForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0xF26A5E68<br />
|}<br />
<br />
=== sceKernelSysrootPrintBacktraceForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0x463EA380<br />
|}<br />
<br />
=== sceKernelSysrootShowCallerInfoForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0x2F3D9414<br />
|}<br />
<br />
=== sceKernelSysrootGetModulePrivateForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-1.80 || 0xC9DD8EB3<br />
|}<br />
<br />
=== sceKernelSysrootSetModulePrivateForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-1.80 || 0xEA572BD9<br />
|}<br />
<br />
=== sceKernelSysrootSetSharedMemoryForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940-1.80 || 0x45EEB2E0<br />
|}<br />
<br />
=== sceKernelSysrootGetKermitRevisionForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940-1.80 || 0xDB3DAB76<br />
|}<br />
<br />
=== sceKernelSysrootGetSharedMemoryForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x1C96096F<br />
|}<br />
<br />
=== sceKernelSysrootCorelockLockForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-1.80 || 0xD653194A<br />
|}<br />
<br />
=== sceKernelSysrootGetVbaseMonitorVectorForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-1.80 || 0xD4E6D8E8<br />
|}<br />
<br />
=== sceKernelSysrootGetKernelMMUContextForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-1.80 || 0xA8B7DAF9<br />
|}<br />
<br />
=== sceKernelSysrootCorelockUnlockForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-1.80 || 0x2F5FD9A8<br />
|}<br />
<br />
=== sceKernelSysrootGetVbaseResetVectorForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-1.80 || 0x2460ADFA<br />
|}<br />
<br />
=== sceKernelIsColdBootForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940-1.80 || 0x0567B4B9<br />
|}<br />
<br />
=== sceKernelIsSecureStateForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940 || 0xEFA54B46<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
=== sceKernelSysrootGetErnieWakeupFactorForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940-1.80 || 0x8E871C6D<br />
|}<br />
<br />
=== sceKernelSysrootGetKblParamForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-1.80 || 0x29C1049E<br />
|}<br />
<br />
Returns pointer to [[KBL Param]] buffer.<br />
<br />
<source lang="C">void *sceKernelSysrootGetKblParamForTZS(void);</source><br />
<br />
=== sceKernelSysrootAllocForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940-1.80 || 0x1A9E1D28<br />
|}<br />
<br />
<source lang="C">void *sceKernelSysrootAllocForTZS(uint32_t size);</source><br />
<br />
== SceQafMgrForTZS ==<br />
<br />
=== sceSblQafManagerIsAllowKernelDebugForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-1.80 || 0x54D22D74<br />
|}<br />
<br />
return *(char *)(sceKernelSysrootGetKblParamForTZS() + 0x2D) & 1;<br />
<br />
== ScePmMgrForTZS ==<br />
<br />
=== sceSblPmMgrGetProductModeForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xCF554E69<br />
|}<br />
<br />
== SceSblAIMgrForTZS ==<br />
<br />
=== sceSblAIMgrIsCEXForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x536B38F4<br />
|}<br />
<br />
[[Category:ARM]]<br />
[[Category:Kernel]]<br />
[[Category:Modules]]<br />
[[Category:Library]]</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=SceKernelThreadMgr&diff=21125
SceKernelThreadMgr
2024-02-21T22:19:32Z
<p>CreepNT: /* Known NIDs */ Mark ForDriver & ForKernel as available since 0.920</p>
<hr />
<div>PS Vita supports multi-threading in the non-secure kernel but not in the secure kernel. There is no user/POSIX threads; all threads are implemented as kernel threads and [[SceKernelThreadMgr#Processes|processes]] are functionally the same as threads. Threads can be specified to run on a specific core with the CPU affinity mask option when creating the thread and by default threads can run on any core. The kernel process can also run on any core. Additionally, the secure kernel can also run on any core.<br />
<br />
== Module ==<br />
<br />
This module exists only in non-secure world. The SELF can be found in <code> os0:kd/threadmgr.skprx</code>.<br />
<br />
{| class="wikitable"<br />
! Version !! World !! Privilege<br />
|-<br />
| 0.990-3.65 || Non-secure || Kernel<br />
|}<br />
<br />
== Libraries ==<br />
<br />
=== Known NIDs ===<br />
<br />
{| class="wikitable"<br />
|-<br />
! Version !! Name !! World !! Visibility !! NID<br />
|-<br />
| 0.920-3.60 || [[SceKernelThreadMgr#SceThreadmgrForDriver|SceThreadmgrForDriver]] || Non-secure || Kernel || 0xE2C40624<br />
|-<br />
| 0.920-3.60 || [[SceKernelThreadMgr#SceThreadmgrForKernel|SceThreadmgrForKernel]] || Non-secure || Kernel || 0xA8CA0EFD<br />
|-<br />
| 3.63-3.67 || [[SceKernelThreadMgr#SceThreadmgrForKernel|SceThreadmgrForKernel]] || Non-secure || Kernel || 0x7F8593BA<br />
|-<br />
| 3.60 || [[SceKernelThreadMgr#SceThreadmgrCoredumpTime|SceThreadmgrCoredumpTime]] || Non-secure || User || 0x5E8D0E22<br />
|-<br />
| 0.920-3.60 || [[SceKernelThreadMgr#SceThreadmgr|SceThreadmgr]] || Non-secure || User || 0x859A24B1<br />
|}<br />
<br />
== Types ==<br />
<br />
=== Class Types ===<br />
<br />
<source lang="C"><br />
<br />
// this is a generic type which is not specific for SceKernelThreadMgr. It is used in class creation in many modules.<br />
typedef struct SceObjectBase {<br />
uint32_t sce_reserved[2]; //[0] seems to be SceKernelObject*<br />
uint32_t data[];<br />
} SceObjectBase;<br />
<br />
typedef struct _SceCacheObj {<br />
SceObjectBase base;<br />
int unk8;<br />
int unkC;<br />
} SceCacheObj;<br />
<br />
typedef struct _SceWaitableObj {<br />
SceObjectBase base;<br />
int unk8;<br />
int unkC;<br />
int unk10;<br />
int unk14;<br />
int unk18;<br />
int unk1C;<br />
int unk20;<br />
int unk24;<br />
} SceWaitableObj;<br />
<br />
typedef struct _SceFastMutexObj {<br />
SceObjectBase base;<br />
int unk8;<br />
int unkC;<br />
int unk10;<br />
int unk14;<br />
int unk18;<br />
int unk1C;<br />
int unk20;<br />
int unk24;<br />
int unk28;<br />
int unk2C;<br />
int unk30;<br />
int unk34;<br />
int unk38;<br />
int unk3C;<br />
int unk40;<br />
int unk44;<br />
int unk48;<br />
int unk4C;<br />
int unk50;<br />
int unk54;<br />
int unk58;<br />
int unk5C;<br />
int unk60;<br />
int unk64;<br />
int unk68;<br />
int unk6C;<br />
int unk70;<br />
int unk74;<br />
int unk78;<br />
int unk7C;<br />
} SceFastMutexObj;<br />
<br />
typedef struct _SceAlarmObj {<br />
SceObjectBase base;<br />
int unk8;<br />
int unkC;<br />
int unk10;<br />
int unk14;<br />
int unk18;<br />
int unk1C;<br />
int unk20;<br />
int unk24;<br />
int unk28;<br />
int unk2C;<br />
int unk30;<br />
int unk34;<br />
int unk38;<br />
int unk3C;<br />
int unk40;<br />
int unk44;<br />
int unk48;<br />
int unk4C;<br />
int unk50;<br />
int unk54;<br />
int unk58;<br />
int unk5C;<br />
int unk60;<br />
int unk64;<br />
int unk68;<br />
int unk6C;<br />
int unk70;<br />
int unk74;<br />
int unk78;<br />
int unk7C;<br />
} SceAlarmObj;<br />
<br />
typedef struct _SceDelayObj {<br />
SceObjectBase base;<br />
int unk8;<br />
int unkC;<br />
int unk10;<br />
int unk14;<br />
int unk18;<br />
int unk1C;<br />
int unk20;<br />
int unk24;<br />
int unk28;<br />
int unk2C;<br />
int unk30;<br />
int unk34;<br />
int unk38;<br />
int unk3C;<br />
int unk40;<br />
int unk44;<br />
int unk48;<br />
int unk4C;<br />
int unk50;<br />
int unk54;<br />
int unk58;<br />
int unk5C;<br />
int unk60;<br />
int unk64;<br />
int unk68;<br />
int unk6C;<br />
int unk70;<br />
int unk74;<br />
int unk78;<br />
int unk7C;<br />
} SceDelayObj;<br />
<br />
typedef struct _SceLwMutexObj {<br />
SceObjectBase base;<br />
int unk8;<br />
int unkC;<br />
int unk10;<br />
int unk14;<br />
int unk18;<br />
int unk1C;<br />
int attr_20;<br />
int unk24;<br />
int unk28;<br />
int initCount_2C;<br />
SceKernelLwMutexWork* work_30;<br />
int unk34;<br />
int unk38;<br />
int unk3C;<br />
int unk40;<br />
int unk44;<br />
int unk48;<br />
int unk4C;<br />
int unk50;<br />
int unk54;<br />
int unk58;<br />
int unk5C;<br />
int unk60;<br />
int unk64;<br />
int unk68;<br />
int unk6C;<br />
int unk70;<br />
int unk74;<br />
int unk78;<br />
int unk7C;<br />
} SceLwMutexObj;<br />
<br />
typedef struct _SceCondObj {<br />
SceObjectBase base;<br />
int unk8;<br />
int unkC;<br />
int unk10;<br />
int unk14;<br />
int unk18;<br />
int unk1C;<br />
int attr_20;<br />
int unk24;<br />
SceKernelCondOptParam* option_28;<br />
SceUID mutexId_2C;<br />
int unk30;<br />
int unk34;<br />
int unk38;<br />
int unk3C;<br />
int unk40;<br />
int unk44;<br />
int unk48;<br />
int unk4C;<br />
int unk50;<br />
int unk54;<br />
int unk58;<br />
int unk5C;<br />
int unk60;<br />
int unk64;<br />
int unk68;<br />
int unk6C;<br />
int unk70;<br />
int unk74;<br />
int unk78;<br />
int unk7C;<br />
} SceCondObj;<br />
<br />
typedef struct _SceEventFlagObj {<br />
SceObjectBase base;<br />
int unk8;<br />
int unkC;<br />
int unk10;<br />
int unk14;<br />
int unk18;<br />
int unk1C;<br />
int attr_20;<br />
int unk24;<br />
int bits_28;<br />
int bits_2C;<br />
int unk30;<br />
int unk34;<br />
int unk38;<br />
int unk3C;<br />
int unk40;<br />
int unk44;<br />
int unk48;<br />
int unk4C;<br />
int unk50;<br />
int unk54;<br />
int unk58;<br />
int unk5C;<br />
int unk60;<br />
int unk64;<br />
int unk68;<br />
int unk6C;<br />
int unk70;<br />
int unk74;<br />
int unk78;<br />
int unk7C;<br />
} SceEventFlagObj;<br />
<br />
typedef struct _SceLwCondObj {<br />
SceObjectBase base;<br />
int unk8;<br />
int unkC;<br />
int unk10;<br />
int unk14;<br />
int unk18;<br />
int unk1C;<br />
int unk20;<br />
int unk24;<br />
int unk28;<br />
int unk2C;<br />
int unk30;<br />
int unk34;<br />
int unk38;<br />
int unk3C;<br />
int unk40;<br />
int unk44;<br />
int unk48;<br />
int unk4C;<br />
int unk50;<br />
int unk54;<br />
int unk58;<br />
int unk5C;<br />
int unk60;<br />
int unk64;<br />
int unk68;<br />
int unk6C;<br />
int unk70;<br />
int unk74;<br />
int unk78;<br />
int unk7C;<br />
} SceLwCondObj;<br />
<br />
typedef struct _SceMsgPipeObj {<br />
SceObjectBase base;<br />
int unk8;<br />
int unkC;<br />
int unk10;<br />
int unk14;<br />
int unk18;<br />
int unk1C;<br />
int unk20;<br />
int unk24;<br />
int unk28;<br />
int unk2C;<br />
int unk30;<br />
int unk34;<br />
int unk38;<br />
int unk3C;<br />
int unk40;<br />
int unk44;<br />
int unk48;<br />
int unk4C;<br />
int unk50;<br />
int unk54;<br />
int unk58;<br />
int unk5C;<br />
int unk60;<br />
int unk64;<br />
int unk68;<br />
int unk6C;<br />
int unk70;<br />
int unk74;<br />
int unk78;<br />
int unk7C;<br />
} SceMsgPipeObj;<br />
<br />
typedef struct _SceMutexObj {<br />
SceObjectBase base;<br />
int unk8;<br />
int unkC;<br />
int unk10;<br />
int unk14;<br />
int unk18;<br />
int unk1C;<br />
int attr_20;<br />
int unk24;<br />
int unk28;<br />
int unk2C;<br />
int unk30;<br />
int unk34;<br />
int initCount_38;<br />
int initCount_3C;<br />
int unk40;<br />
int ceilingPriority_44;<br />
int unk48;<br />
int unk4C;<br />
int unk50;<br />
int unk54;<br />
int unk58;<br />
int unk5C;<br />
int unk60;<br />
int unk64;<br />
int unk68;<br />
int unk6C;<br />
int unk70;<br />
int unk74;<br />
int unk78;<br />
int unk7C;<br />
} SceMutexObj;<br />
<br />
typedef struct _SceRWLockObj {<br />
SceObjectBase base;<br />
int unk8;<br />
int unkC;<br />
int unk10;<br />
int unk14;<br />
int unk18;<br />
int unk1C;<br />
int unk20;<br />
int unk24;<br />
int unk28;<br />
int unk2C;<br />
int unk30;<br />
int unk34;<br />
int unk38;<br />
int unk3C;<br />
int unk40;<br />
int unk44;<br />
int unk48;<br />
int unk4C;<br />
int unk50;<br />
int unk54;<br />
int unk58;<br />
int unk5C;<br />
int unk60;<br />
int unk64;<br />
int unk68;<br />
int unk6C;<br />
int unk70;<br />
int unk74;<br />
int unk78;<br />
int unk7C;<br />
} SceRWLockObj;<br />
<br />
typedef struct SceKernelSemaOptParam {<br />
/** Size of the ::SceKernelSemaOptParam structure. */<br />
SceSize size;<br />
} SceKernelSemaOptParam;<br />
<br />
typedef struct _SceSemaObj {<br />
SceObjectBase base;<br />
int unk8;<br />
int unkC;<br />
int unk10;<br />
int unk14;<br />
int unk18;<br />
int unk1C;<br />
int attr_20;<br />
int unk24;<br />
SceKernelSemaOptParam* option_28;<br />
int initVal_2C;<br />
int maxVal_30;<br />
int initVal_34;<br />
int unk_38;<br />
int unk_3C;<br />
int unk40;<br />
int unk44;<br />
int unk48;<br />
int unk4C;<br />
int unk50;<br />
int unk54;<br />
int unk58;<br />
int unk5C;<br />
int unk60;<br />
int unk64;<br />
int unk68;<br />
int unk6C;<br />
int unk70;<br />
int unk74;<br />
int unk78;<br />
int unk7C;<br />
} SceSemaObj;<br />
<br />
typedef struct _SceSimpleEventObj {<br />
SceObjectBase base;<br />
int unk8;<br />
int unkC;<br />
int unk10;<br />
int unk14;<br />
int unk18;<br />
int unk1C;<br />
int unk20;<br />
int unk24;<br />
int unk28;<br />
int unk2C;<br />
int unk30;<br />
int unk34;<br />
int unk38;<br />
int unk3C;<br />
int unk40;<br />
int unk44;<br />
int unk48;<br />
int unk4C;<br />
int unk50;<br />
int unk54;<br />
int unk58;<br />
int unk5C;<br />
int unk60;<br />
int unk64;<br />
int unk68;<br />
int unk6C;<br />
int unk70;<br />
int unk74;<br />
int unk78;<br />
int unk7C;<br />
} SceSimpleEventObj;<br />
<br />
typedef struct _SceTimerObj {<br />
SceObjectBase base;<br />
int unk8;<br />
int unkC;<br />
int unk10;<br />
int unk14;<br />
int unk18;<br />
int unk1C;<br />
int unk20;<br />
int unk24;<br />
int unk28;<br />
int unk2C;<br />
int unk30;<br />
int unk34;<br />
int unk38;<br />
int unk3C;<br />
int unk40;<br />
int unk44;<br />
int unk48;<br />
int unk4C;<br />
int unk50;<br />
int unk54;<br />
int unk58;<br />
int unk5C;<br />
int unk60;<br />
int unk64;<br />
int unk68;<br />
int unk6C;<br />
int unk70;<br />
int unk74;<br />
int unk78;<br />
int unk7C;<br />
} SceTimerObj;<br />
<br />
typedef struct _SceCpuTimerObj {<br />
SceObjectBase base;<br />
int unk8;<br />
int unkC;<br />
int unk10;<br />
int unk14;<br />
int unk18;<br />
int unk1C;<br />
int unk20;<br />
int unk24;<br />
int unk28;<br />
int unk2C;<br />
int unk30;<br />
int unk34;<br />
int unk38;<br />
int unk3C;<br />
int unk40;<br />
int unk44;<br />
int unk48;<br />
int unk4C;<br />
int unk50;<br />
int unk54;<br />
} SceCpuTimerObj;<br />
<br />
typedef int (*SceKernelCallbackFunction)(int notifyId, int notifyCount, int notifyArg, void *common);<br />
<br />
typedef struct _SceCallbackObj<br />
{<br />
SceObjectBase base;<br />
int unk8;<br />
int unkC;<br />
int unk10;<br />
int unk14;<br />
int unk18;<br />
int attr_1C;<br />
int unk20;<br />
int unk24;<br />
SceKernelCallbackFunction func_28;<br />
int unk2C;<br />
int unk30;<br />
int unk34;<br />
void *arg_38;<br />
int unk3C;<br />
int unk40;<br />
int unk44;<br />
int unk48;<br />
int unk4C;<br />
int unk50;<br />
int unk54;<br />
int unk58;<br />
int unk5C;<br />
int unk60;<br />
int unk64;<br />
int unk68;<br />
int unk6C;<br />
int unk70;<br />
int unk74;<br />
int unk78;<br />
int unk7C;<br />
} SceCallbackObj;<br />
<br />
typedef struct _SceRegisterCallbackObj<br />
{<br />
SceObjectBase base;<br />
int unk8;<br />
int unkC;<br />
int unk10;<br />
int unk14;<br />
int unk18;<br />
int unk1C;<br />
int unk20;<br />
int unk24;<br />
int unk28;<br />
int unk2C;<br />
} SceRegisterCallbackObj;<br />
<br />
typedef struct _SceThreadObj<br />
{<br />
SceObjectBase base;<br />
int unk8;<br />
int unkC;<br />
int unk10;<br />
int unk14;<br />
int unk18;<br />
int unk1C;<br />
int attr_unk20;<br />
int unk_24;<br />
int unk28;<br />
int unk2C;<br />
int unk30;<br />
int unk34;<br />
int unk38;<br />
int unk3C;<br />
int unk40;<br />
int unk44;<br />
int unk48;<br />
int unk4C;<br />
int unk50;<br />
int unk54;<br />
int unk58;<br />
int unk5C;<br />
SceUID pid_60;<br />
int unk_64;<br />
int unk68;<br />
int unk6C;<br />
int unk70;<br />
int unk74;<br />
int unk78;<br />
int unk7C;<br />
int unk80;<br />
int unk84;<br />
int unk88;<br />
int unk8C;<br />
int unk90;<br />
int unk94;<br />
int unk98;<br />
int unk9C;<br />
int unkA0;<br />
int unkA4;<br />
int unkA8;<br />
int unkAC;<br />
int unkB0;<br />
int unkB4;<br />
int unkB8;<br />
int unkBC;<br />
int unkC0;<br />
int unkC4;<br />
int unkC8;<br />
int attr_CC;<br />
int attr_D0;<br />
int priority_D4;<br />
int priority_D8;<br />
int unk_DC;<br />
int priority_E0;<br />
int unk_E4;<br />
int unkE8;<br />
int unkEC;<br />
int unkF0;<br />
int unkF4;<br />
int unkF8;<br />
int unkFC;<br />
int unk100;<br />
int unk104;<br />
int unk108;<br />
int unk10C;<br />
int unk110;<br />
int unk114;<br />
int unk118;<br />
int unk11C;<br />
int unk120;<br />
int unk124;<br />
int unk128;<br />
int unk12C;<br />
int unk130;<br />
int unk134;<br />
int unk138;<br />
int unk13C;<br />
int unk140;<br />
int unk144;<br />
int unk148;<br />
int unk14C;<br />
int unk150;<br />
int unk154;<br />
int unk158;<br />
int unk15C;<br />
int unk160;<br />
int unk164;<br />
int unk168;<br />
int unk16C;<br />
int unk170;<br />
int unk174;<br />
int unk178;<br />
int unk17C;<br />
int unk180;<br />
int unk184;<br />
int unk188;<br />
int unk18C;<br />
int unk190;<br />
int unk194;<br />
int unk198;<br />
int unk19C;<br />
int unk1A0;<br />
int unk1A4;<br />
int unk1A8;<br />
int unk1AC;<br />
int unk1B0;<br />
int unk1B4;<br />
int unk1B8;<br />
int unk1BC;<br />
int unk1C0;<br />
int unk1C4;<br />
int unk1C8;<br />
int unk1CC;<br />
int unk1D0;<br />
int unk1D4;<br />
int unk1D8;<br />
int unk1DC;<br />
int unk1E0;<br />
int unk1E4;<br />
int unk1E8;<br />
int unk1EC;<br />
int unk1F0;<br />
int unk1F4;<br />
int unk1F8;<br />
int unk1FC;<br />
} SceThreadObj;<br />
<br />
typedef struct _SceThreadEventObj<br />
{<br />
SceObjectBase base;<br />
int unk8;<br />
int unkC;<br />
int unk10;<br />
int unk14;<br />
int unk18;<br />
int unk1C;<br />
int unk20;<br />
int unk24;<br />
int unk28;<br />
int unk2C;<br />
int unk30;<br />
int unk34;<br />
int unk38;<br />
int unk3C;<br />
int unk40;<br />
int unk44;<br />
int unk48;<br />
int unk4C;<br />
int unk50;<br />
int unk54;<br />
int unk58;<br />
int unk5C;<br />
int unk60;<br />
int unk64;<br />
int unk68;<br />
int unk6C;<br />
int unk70;<br />
int unk74;<br />
int unk78;<br />
int unk7C;<br />
} SceThreadEventObj;<br />
<br />
typedef struct _SceWorkQueueObj<br />
{<br />
SceObjectBase base;<br />
int unk8;<br />
int unkC;<br />
int unk10;<br />
int unk14;<br />
int atomic_lock;<br />
int unk1C;<br />
int unk20;<br />
int unk24;<br />
int unk28;<br />
int unk2C;<br />
int unk30;<br />
int unk34;<br />
unsigned long long obj_counter;<br />
int unk40;<br />
int unk44;<br />
int unk48;<br />
int unk4C;<br />
int unk50;<br />
SceUID sema_uid;<br />
int unk58;<br />
int unk5C;<br />
int unk60;<br />
int unk64;<br />
int unk68;<br />
int unk6C;<br />
int unk70;<br />
int unk74;<br />
int unk78;<br />
int unk7C;<br />
} SceWorkQueueObj;<br />
<br />
typedef int (*SceKernelWorkQueueWorkFunction)(void *args);<br />
<br />
typedef struct _SceWorkTaskObj<br />
{<br />
SceObjectBase base;<br />
int unk8;<br />
int unkC;<br />
int unk10;<br />
int unk14;<br />
int atomic_lock;<br />
int unk1C;<br />
int unk20;<br />
int unk24;<br />
SceWorkQueueObj *queue_obj;<br />
int unk2C;<br />
int unk30;<br />
int unk34;<br />
SceUID task_uid;<br />
int unk3C;<br />
unsigned long long obj_counter;<br />
int unk48;<br />
int unk4C;<br />
int some_flag;<br />
int unk54;<br />
SceUID work_queue_uid;<br />
SceKernelWorkQueueWorkFunction func;<br />
void *args;<br />
SceUID current_thread_uid;<br />
int unk68;<br />
int unk6C;<br />
int unk70;<br />
SceUID pid;<br />
int unk78;<br />
int unk7C;<br />
} SceWorkTaskObj;<br />
<br />
typedef struct _SceExcpObj<br />
{<br />
SceObjectBase base;<br />
int unk8;<br />
int unkC;<br />
int unk10;<br />
int unk14;<br />
int unk18;<br />
int unk1C;<br />
int unk20;<br />
int unk24;<br />
int unk28;<br />
int unk2C;<br />
int unk30;<br />
int unk34;<br />
int unk38;<br />
int unk3C;<br />
int unk40;<br />
int unk44;<br />
int unk48;<br />
int unk4C;<br />
int unk50;<br />
int unk54;<br />
int unk58;<br />
int unk5C;<br />
int unk60;<br />
int unk64;<br />
int unk68;<br />
int unk6C;<br />
int unk70;<br />
int unk74;<br />
int unk78;<br />
int unk7C;<br />
} SceExcpObj;<br />
<br />
typedef struct _SceEventObj<br />
{<br />
SceObjectBase base;<br />
int unk8;<br />
int unkC;<br />
int unk10;<br />
int unk14;<br />
int unk18;<br />
int unk1C;<br />
int unk20;<br />
int unk24;<br />
int unk28;<br />
int unk2C;<br />
int unk30;<br />
int unk34;<br />
} SceEventObj;<br />
</source><br />
<br />
=== ThreadMgr types ===<br />
<br />
For <code>SceProcessObj</code>, see [[SceProcessmgr#Types|SceProcessmgr page]].<br />
<br />
<source lang="C"><br />
typedef struct SceKernelFastMutex {<br />
SceUInt8 data[0x40];<br />
} SceKernelFastMutex;<br />
<br />
typedef struct IntrRequest {<br />
struct IntrRequest *next;<br />
int type; // In 0-3, 8-0x14, 0x18-0x19<br />
int from_cache; // 0 = alloc from heap, otherwise comes from Threadmgr link list<br />
int padding;<br />
int arguments[4];<br />
} IntrRequest;<br />
<br />
typedef struct ThreadMgrCpuCB { // size is 0x880-bytes<br />
ThreadCB *pRunningThreadCB;<br />
ThreadCB *pNextRunningThreadCB;<br />
int data_0x08;<br />
struct {<br />
SceUID pid;<br />
SceUID thid;<br />
} current[2];<br />
SceUInt32 currentThreadPriority;<br />
struct {<br />
ThreadCB *next;<br />
ThreadCB *prev;<br />
} standbyList;<br />
SceKernelSpinlock lock;<br />
int unk_2C[2];<br />
ThreadCB *pIdleThreadCB; // idle thread for this CPU<br />
SceUInt64 unk_38;<br />
IntrRequest *intrRequestQueue;<br />
int unk_44;<br />
void *SwitchStackBlock_base; // 0x1000 size - idk what for<br />
SceUInt8 unk_4C[0x14];<br />
SceUInt32 priorityQueueBitmap[0x20 / sizeof(SceUInt32)];<br />
struct {<br />
ThreadCB *next;<br />
ThreadCB *prev;<br />
} priorityQueue[0x100];<br />
} ThreadMgrCpuCB;<br />
<br />
typedef struct SceKernelThreadmgrPrivate { // size is 0x28B8-bytes<br />
ThreadMgrCpuCB cpuCB[4];<br />
SceKernelSpinlock threadMgrCBLock;<br />
SceUInt8 data[0x6B4];<br />
} SceKernelThreadmgrPrivate;<br />
<br />
typedef struct SceKernelThreadStatus { // size is 0x100<br />
int mode; // kernel:0, user:1<br />
<br />
unsigned int reg[0xF];<br />
<br />
unsigned int cpsr_kern;<br />
int unk_0x44; // maybe DACR for user<br />
int unk_0x48; // maybe DACR for kernel<br />
int unk_0x4C; // ex:0xF00000<br />
<br />
int unk_0x50;<br />
void *ptr_0x54; // maybe user tls?<br />
unsigned int TTBR1;<br />
unsigned int unk_0x5C; // maybe cpu ctx<br />
<br />
int unk_0x60;<br />
unsigned int ptr_0x64; // maybe paddr<br />
int unk_0x68;<br />
int unk_0x6C;<br />
<br />
int unk_0x70;<br />
int unk_0x74;<br />
int unk_0x78;<br />
int unk_0x7C;<br />
<br />
int unk_0x80;<br />
int unk_0x84;<br />
int unk_0x88;<br />
int unk_0x8C;<br />
<br />
int unk_0x90;<br />
int unk_0x94;<br />
int unk_0x98;<br />
int unk_0x9C;<br />
<br />
int unk_0xA0;<br />
int unk_0xA4;<br />
int unk_0xA8; // ex:0x8F5<br />
int unk_0xAC;<br />
<br />
unsigned int DFAR;<br />
int unk_0xB4;<br />
int unk_0xB8; // ex:0x2000, some size?<br />
int unk_0xBC; // ex:user(0xFF), kernel(0xF0)? maybe?<br />
<br />
const void *pc;<br />
unsigned int cpsr;<br />
unsigned int unk_0xC8; // fpcr?<br />
int unk_0xCC;<br />
<br />
int unk_0xD0;<br />
int unk_0xD4;<br />
int unk_0xD8;<br />
int unk_0xDC;<br />
<br />
int unk_0xE0;<br />
int unk_0xE4;<br />
int unk_0xE8;<br />
int unk_0xEC;<br />
<br />
int unk_0xF0;<br />
int unk_0xF4;<br />
int unk_0xF8;<br />
int unk_0xFC;<br />
} SceKernelThreadStatus;<br />
<br />
typedef struct SceKernelThreadFloatRegister { // size is 0x100<br />
union {<br />
unsigned int s_reg_i[0x40];<br />
float s_reg_f[0x40];<br />
uint64_t d_reg_i[0x20];<br />
double d_reg_f[0x20];<br />
};<br />
} SceKernelThreadFloatRegister;<br />
<br />
typedef struct SceKernelThreadNeonInfo { // size is 0x120<br />
SceKernelThreadFloatRegister float_register;<br />
unsigned int fpscr;<br />
unsigned int fpexc;<br />
unsigned int unk_0x108;<br />
unsigned int unk_0x10C;<br />
unsigned int unk_0x110;<br />
unsigned int unk_0x114;<br />
unsigned int unk_0x118;<br />
unsigned int unk_0x11C;<br />
} SceKernelThreadNeonInfo;<br />
<br />
typedef struct SceKernelThreadRegisterInfo { // size is 0x60<br />
unsigned int reg[0xD];<br />
unsigned int unk_0x34;<br />
unsigned int unk_0x38; // ex:0xB90B45<br />
unsigned int fpscr;<br />
unsigned int unk_0x40;<br />
unsigned int unk_0x44;<br />
unsigned int unk_0x48;<br />
unsigned int unk_0x4C;<br />
unsigned int sp;<br />
unsigned int lr;<br />
unsigned int pc;<br />
unsigned int cpsr;<br />
} SceKernelThreadRegisterInfo;<br />
<br />
typedef struct SceKernelThreadInfoInternal { // size is 0x128<br />
SceSize size;<br />
SceUID thid_user;<br />
SceUID processId;<br />
<br />
// offset:0xC<br />
char name[0x20];<br />
int pad_0x2C;<br />
<br />
// offset:0x30<br />
SceUInt attr;<br />
int status;<br />
SceKernelThreadEntry entry;<br />
void *stack;<br />
<br />
// offset:0x40<br />
SceSize stackSize;<br />
int unk_0x44;<br />
int unk_0x48;<br />
void *kernel_stack;<br />
<br />
// offset:0x50<br />
SceSize kernel_stack_size;<br />
int unk_0x54;<br />
int unk_0x58;<br />
int unk_0x5C;<br />
<br />
// offset:0x60<br />
int unk_0x60;<br />
int unk_0x64;<br />
int unk_0x68;<br />
void *ptr_0x6C; // kernel tls?<br />
<br />
// offset:0x70<br />
int unk_0x70;<br />
int unk_0x74;<br />
int initPriority;<br />
int currentPriority;<br />
<br />
// offset:0x80<br />
int initCpuAffinityMask;<br />
int currentCpuAffinityMask;<br />
int unk_0x88;<br />
int currentCpuId;<br />
<br />
// offset:0x90<br />
int lastExecutedCpuId;<br />
int waitType; // maybe<br />
int unk_0x98;<br />
SceKernelSysClock runClocks;<br />
<br />
int exitStatus;<br />
int unk_0xA8; // IsThreadDebugSuspended<br />
SceUInt intrPreemptCount;<br />
<br />
// offset:0xB0<br />
SceUInt threadPreemptCount;<br />
SceUInt threadReleaseCount;<br />
SceUID fNotifyCallback;<br />
int reserved;<br />
<br />
SceKernelThreadStatus *pStatus;<br />
SceKernelThreadNeonInfo *pNeonInfo;<br />
SceKernelThreadRegisterInfo *pUserRegisterInfo; // Is it set only when cause(0x10009)?<br />
int unk_0xCC;<br />
<br />
void *pUserTLS;<br />
int unk_0xD4;<br />
int unk_0xD8;<br />
void *ptr_0xDC;<br />
<br />
int unk_0xE0;<br />
int unk_0xE4;<br />
int unk_0xE8;<br />
int unk_0xEC;<br />
<br />
int unk_0xF0;<br />
int unk_0xF4;<br />
int unk_0xF8;<br />
int unk_0xFC;<br />
<br />
void *ptr_0x100;<br />
int unk_0x104;<br />
int unk_0x108;<br />
int unk_0x10C;<br />
<br />
int unk_0x110;<br />
int unk_0x114;<br />
int unk_0x118;<br />
int unk_0x11C;<br />
<br />
int unk_0x120;<br />
int unk_0x124;<br />
} __attribute__((packed)) SceKernelThreadInfoInternal;<br />
<br />
/** @name Basic thread functions<br />
*/<br />
/*@{*/<br />
<br />
/**<br />
* @defgroup Thread attributes<br />
* Defining thread attributes<br />
* Specified in attr argument of sceKernelCreateThread()<br />
*/<br />
/*@{*/<br />
#define SCE_KERNEL_THREAD_ATTR_NOUSE_VFP (0x01000000U) /**< Do not use VFP */<br />
#define SCE_KERNEL_THREAD_ATTR_VM (0x04000000U) /**< (Unofficial name) Virtual Machine thread (can use ForVM functions on it) */<br />
/*@}*/<br />
<br />
/**<br />
* @defgroup Thread priority<br />
* Defining thread priorities<br />
*/<br />
/*@{*/<br />
#define SCE_KERNEL_HIGHEST_PRIORITY_USER (64) /**< Highest priority of user mode threads */<br />
#define SCE_KERNEL_LOWEST_PRIORITY_USER (191) /**< Lowest priority of user mode threads */<br />
<br />
#define SCE_KERNEL_DEFAULT_PRIORITY ((SceInt32)0x10000100) /**< Default priority (whole system) */<br />
<br />
#define SCE_KERNEL_INDIVIDUAL_QUEUE_HIGHEST_PRIORITY (64) /**< Highest priority of individual queue area */<br />
#define SCE_KERNEL_INDIVIDUAL_QUEUE_LOWEST_PRIORITY (127) /**< Lowest priority of individual queue area */<br />
#define SCE_KERNEL_COMMON_QUEUE_HIGHEST_PRIORITY (128) /**< Highest priority of common queue area */<br />
#define SCE_KERNEL_COMMON_QUEUE_LOWEST_PRIORITY (191) /**< Lowest priority of common queue area */<br />
<br />
/**<br />
* Default priority (for users)<br />
* The default priority for game applications is converted to 160 internally.<br />
* You can also specify the default value ± offset (SCE_KERNEL_DEFAULT_PRIORITY_USER-10).<br />
*/<br />
#define SCE_KERNEL_DEFAULT_PRIORITY_USER SCE_KERNEL_DEFAULT_PRIORITY<br />
<br />
#define SCE_KERNEL_CURRENT_THREAD_PRIORITY (0) /**< The priority of the currently executing thread */<br />
/*@}*/<br />
<br />
/**<br />
* @defgroup Thread stack size<br />
* Defining thread stack size<br />
*/<br />
/*@{*/<br />
#define SCE_KERNEL_STACK_SIZE_MAX SCE_KERNEL_1MiB /**< Maximum stack size */<br />
#define SCE_KERNEL_STACK_SIZE_MIN SCE_KERNEL_4KiB /**< Minimum stack size */<br />
<br />
#define SCE_KERNEL_STACK_SIZE_DEFAULT SCE_KERNEL_STACK_SIZE_MIN /**< Default stack size */<br />
#define SCE_KERNEL_STACK_SIZE_DEFAULT_USER_MAIN (0x00040000) /**< Default stack size of user main thread (byte) */<br />
<br />
#define SCE_KERNEL_THREAD_STACK_SIZE_MAX SCE_KERNEL_32MiB /**< Maximum stack size */<br />
#define SCE_KERNEL_THREAD_STACK_SIZE_MIN SCE_KERNEL_4KiB /**< Minimum stack size */<br />
<br />
#define SCE_KERNEL_THREAD_STACK_SIZE_DEFAULT SCE_KERNEL_THREAD_STACK_SIZE_MIN /**< Default stack size */<br />
#define SCE_KERNEL_THREAD_STACK_SIZE_DEFAULT_USER_MAIN SCE_KERNEL_256KiB /**< Default stack size of user main thread (byte) */<br />
/*@}*/<br />
<br />
/**<br />
* @defgroup Thread state<br />
* Defining thread state<br />
*/<br />
/*@{*/<br />
#define SCE_KERNEL_THREAD_STATUS_RUNNING (0x00000001U) /**< RUNNING status */<br />
#define SCE_KERNEL_THREAD_STATUS_READY (0x00000002U) /**< READY status */<br />
#define SCE_KERNEL_THREAD_STATUS_STANDBY (0x00000004U) /**< STANDBY status */<br />
#define SCE_KERNEL_THREAD_STATUS_WAITING (0x00000008U) /**< WAITING status */<br />
#define SCE_KERNEL_THREAD_STATUS_DORMANT (0x00000010U) /**< DORMANT status */<br />
#define SCE_KERNEL_THREAD_STATUS_DELETED (0x00000020U) /**< DELETED status */<br />
#define SCE_KERNEL_THREAD_STATUS_DEAD (0x00000040U) /**< DEAD status */<br />
#define SCE_KERNEL_THREAD_STATUS_STAGNANT (0x00000080U) /**< STAGNANT status */<br />
#define SCE_KERNEL_THREAD_STATUS_SUSPENDED (0x00000100U) /**< SUSPENDED status */<br />
<br />
#define SCE_KERNEL_THREAD_STATUS_MASK (0x0000ffffU) /**< Valid thread state mask */<br />
/*@}*/<br />
<br />
/**<br />
* @defgroup Thread wait type<br />
* Defining thread wait types<br />
*/<br />
/*@{*/<br />
#if SCE_PSP2_SDK_VERSION < 0x01000000<br />
#define SCE_KERNEL_WAITTYPE_DELAY (0x00000001) /**< Thread delay */<br />
#define SCE_KERNEL_WAITTYPE_WAITTHEND (0x00000002) /**< End of thread */<br />
#define SCE_KERNEL_WAITTYPE_EVENTFLAG (0x00000004) /**< Event flag */<br />
#define SCE_KERNEL_WAITTYPE_MUTEX (0x00000008) /**< Mutex */<br />
#define SCE_KERNEL_WAITTYPE_FAST_MUTEX (0x00000010) /**< Fast mutex */<br />
#define SCE_KERNEL_WAITTYPE_FAST_MUTEX_SPIN (0x00000020) /**< Fast mutex (spin) */<br />
#define SCE_KERNEL_WAITTYPE_SEMAPHORE (0x00000040) /**< Semaphore */<br />
#define SCE_KERNEL_WAITTYPE_EVENT (0x00000080) /**< Single event */<br />
#define SCE_KERNEL_WAITTYPE_COND (0x00000100) /**< Condition variable */<br />
#define SCE_KERNEL_WAITTYPE_MSG_PIPE (0x00000200) /**< Message pipe */<br />
#define SCE_KERNEL_WAITTYPE_RW_LOCK (0x00000400) /**< Reader / writer lock */<br />
#define SCE_KERNEL_WAITTYPE_SIGNAL (0x00000800) /**< Signal */<br />
#define SCE_KERNEL_WAITTYPE_LW_MUTEX (0x00001000) /**< Lightweight mutex */<br />
#define SCE_KERNEL_WAITTYPE_LW_COND (0x00002000) /**< Lightweight condition variable */<br />
#define SCE_KERNEL_WAITTYPE_MP_EVENTS (0x00008000) /**< Event multiplexing */<br />
<br />
#define SCE_KERNEL_WAITTYPE_DELAY_CB (0x00010001) /**< With thread delay callback check */<br />
#define SCE_KERNEL_WAITTYPE_WAITTHEND_CB (0x00010002) /**< With thread termination callback check */<br />
#define SCE_KERNEL_WAITTYPE_EVENTFLAG_CB (0x00010004) /**< With event flag callback check */<br />
#define SCE_KERNEL_WAITTYPE_MUTEX_CB (0x00010008) /**< With mutex callback check */<br />
#define SCE_KERNEL_WAITTYPE_FAST_MUTEX_CB (0x00010010) /**< With fast mutex callback check */<br />
#define SCE_KERNEL_WAITTYPE_FAST_MUTEX_SPIN_CB (0x00010020) /**< With fast mutex (spin) callback check */<br />
#define SCE_KERNEL_WAITTYPE_SEMAPHORE_CB (0x00010040) /**< With semaphore callback check */<br />
#define SCE_KERNEL_WAITTYPE_EVENT_CB (0x00010080) /**< With single event callback check */<br />
#define SCE_KERNEL_WAITTYPE_COND_CB (0x00010100) /**< With condition variable callback check */<br />
#define SCE_KERNEL_WAITTYPE_MSG_PIPE_CB (0x00010200) /**< With message pipe callback check */<br />
#define SCE_KERNEL_WAITTYPE_RW_LOCK_CB (0x00010400) /**< With reader / writer lock callback check */<br />
#define SCE_KERNEL_WAITTYPE_SIGNAL_CB (0x00010800) /**< With signal callback check */<br />
#define SCE_KERNEL_WAITTYPE_LW_MUTEX_CB (0x00011000) /**< With lightweight mutex callback check */<br />
#define SCE_KERNEL_WAITTYPE_LW_COND_CB (0x00012000) /**< With lightweight condition variable callback check */<br />
#define SCE_KERNEL_WAITTYPE_MP_EVENTS_CB (0x00018000) /**< With event multiplexing callback check */<br />
#else<br />
#define SCE_KERNEL_WAITTYPE_DELAY (0x00000001U) /**< Thread delay */<br />
#define SCE_KERNEL_WAITTYPE_WAITTHEND (0x00000002U) /**< End of thread */<br />
#define SCE_KERNEL_WAITTYPE_SIGNAL (0x00000004U) /**< Signal */<br />
#define SCE_KERNEL_WAITTYPE_WAITTHSUSPEND (0x00000008U) /**< Suspend thread */<br />
#define SCE_KERNEL_WAITTYPE_EVENTFLAG (0x00000010U) /**< Event flag */<br />
#define SCE_KERNEL_WAITTYPE_SEMAPHORE (0x00000020U) /**< Semaphore */<br />
#define SCE_KERNEL_WAITTYPE_MUTEX (0x00000040U) /**< Mutex */<br />
#define SCE_KERNEL_WAITTYPE_RW_LOCK (0x00000080U) /**< Reader / writer lock */<br />
#define SCE_KERNEL_WAITTYPE_COND_SIGNAL (0x00000100U) /**< Condition variable (signal) */<br />
#define SCE_KERNEL_WAITTYPE_COND_MUTEX (0x00000200U) /**< Condition variable (mutex) */<br />
#define SCE_KERNEL_WAITTYPE_FAST_MUTEX (0x00001000U) /**< Fast mutex */<br />
#define SCE_KERNEL_WAITTYPE_FAST_MUTEX_SPIN (0x00002000U) /**< Fast mutex (spin) */<br />
#define SCE_KERNEL_WAITTYPE_EVENT (0x00010000U) /**< Single event */<br />
#define SCE_KERNEL_WAITTYPE_MP_EVENTS (0x00020000U) /**< Event multiplexing */<br />
#define SCE_KERNEL_WAITTYPE_MSG_PIPE (0x00040000U) /**< Message pipe */<br />
#define SCE_KERNEL_WAITTYPE_LW_MUTEX (0x00100000U) /**< Lightweight mutex */<br />
#define SCE_KERNEL_WAITTYPE_LW_COND_SIGNAL (0x00200000U) /**< Lightweight condition variable (signal) */<br />
#define SCE_KERNEL_WAITTYPE_LW_COND_LW_MUTEX (0x00400000U) /**< Lightweight condition variable (mutex) */<br />
<br />
#define SCE_KERNEL_WAITTYPE_DELAY_CB (0x80000001U) /**< With thread delay callback check */<br />
#define SCE_KERNEL_WAITTYPE_WAITTHEND_CB (0x80000002U) /**< With thread termination callback check */<br />
#define SCE_KERNEL_WAITTYPE_SIGNAL_CB (0x80000004U) /**< With signal callback check */<br />
#define SCE_KERNEL_WAITTYPE_WAITTHSUSPEND_CB (0x80000008U) /**< With suspend thread callback check */<br />
#define SCE_KERNEL_WAITTYPE_EVENTFLAG_CB (0x80000010U) /**< With event flag callback check */<br />
#define SCE_KERNEL_WAITTYPE_SEMAPHORE_CB (0x80000020U) /**< With semaphore callback check */<br />
#define SCE_KERNEL_WAITTYPE_MUTEX_CB (0x80000040U) /**< With mutex callback check */<br />
#define SCE_KERNEL_WAITTYPE_RW_LOCK_CB (0x80000080U) /**< With reader / writer lock callback check */<br />
#define SCE_KERNEL_WAITTYPE_COND_SIGNAL_CB (0x80000100U) /**< With condition variable (signal) callback check */<br />
#define SCE_KERNEL_WAITTYPE_COND_MUTEX_CB (0x80000200U) /**< With condition variable (mutex) callback check */<br />
#define SCE_KERNEL_WAITTYPE_FAST_MUTEX_CB (0x80001000U) /**< With fast mutex callback check */<br />
#define SCE_KERNEL_WAITTYPE_FAST_MUTEX_SPIN_CB (0x80002000U) /**< With fast mutex (spin) callback check */<br />
#define SCE_KERNEL_WAITTYPE_EVENT_CB (0x80010000U) /**< With single event callback check */<br />
#define SCE_KERNEL_WAITTYPE_MP_EVENTS_CB (0x80020000U) /**< With event multiplexing callback check */<br />
#define SCE_KERNEL_WAITTYPE_MSG_PIPE_CB (0x80040000U) /**< With message pipe callback check */<br />
#define SCE_KERNEL_WAITTYPE_LW_MUTEX_CB (0x80100000U) /**< With lightweight mutex callback check */<br />
#define SCE_KERNEL_WAITTYPE_LW_COND_SIGNAL_CB (0x80200000U) /**< With lightweight condition variable (signal) callback check */<br />
#define SCE_KERNEL_WAITTYPE_LW_COND_LW_MUTEX_CB (0x80400000U) /**< With lightweight condition variable (mutex) callback check */<br />
#endif<br />
/*@}*/<br />
<br />
/**<br />
* @defgroup UID<br />
* Thread ID definition<br />
*/<br />
/*@{*/<br />
#define SCE_KERNEL_THREAD_ID_SELF (0) /**< UID representing own thread */<br />
/*@}*/<br />
<br />
/**<br />
* @defgroup UID class<br />
* Class definition of UID managed by thread manager (for User)<br />
*/<br />
/*@{*/<br />
#define SCE_KERNEL_THREADMGR_UID_CLASS_THREAD (1) /**< Thread class */<br />
#define SCE_KERNEL_THREADMGR_UID_CLASS_SEMA (2) /**< Semaphore class */<br />
#define SCE_KERNEL_THREADMGR_UID_CLASS_EVENT_FLAG (3) /**< Event flag class */<br />
#define SCE_KERNEL_THREADMGR_UID_CLASS_MUTEX (4) /**< Mutex class */<br />
#define SCE_KERNEL_THREADMGR_UID_CLASS_COND (5) /**< Condition variable class */<br />
#define SCE_KERNEL_THREADMGR_UID_CLASS_TIMER (6) /**< Timer class */<br />
#define SCE_KERNEL_THREADMGR_UID_CLASS_MSG_PIPE (7) /**< Message pipe class */<br />
#define SCE_KERNEL_THREADMGR_UID_CLASS_CALLBACK (8) /**< Callback class */<br />
#define SCE_KERNEL_THREADMGR_UID_CLASS_THREAD_EVENT (9) /**< Thread event class */<br />
#define SCE_KERNEL_THREADMGR_UID_CLASS_LW_MUTEX (10) /**< Lightweight mutex class */<br />
#define SCE_KERNEL_THREADMGR_UID_CLASS_LW_COND (11) /**< Lightweight condition variable class */<br />
#define SCE_KERNEL_THREADMGR_UID_CLASS_RW_LOCK (12) /**< Reader / writer lock class */<br />
#define SCE_KERNEL_THREADMGR_UID_CLASS_SIMPLE_EVENT (13) /**< Simple event class */<br />
/*@}*/<br />
<br />
/**<br />
* @defgroup CPU affinity mask<br />
* CPU affinity mask definition<br />
*/<br />
/*@{*/<br />
/**<br />
* @brief Default CPU affinity mask<br />
*<br />
* If the default CPU affinity mask is specified for a thread,<br />
* the CPU affinity mask specified for the process to which it belongs is inherited.<br />
*/<br />
#define SCE_KERNEL_THREAD_CPU_AFFINITY_MASK_DEFAULT (0)<br />
/*@}*/<br />
<br />
/**<br />
* @brief Thread entry type<br />
*<br />
* Thread entry function type. Specify to sceKernelCreateThread().<br />
* The argument block of the thread given by the argument of sceKernelStartThread() is copied onto the<br />
* stack of the started thread, and is received from the started thread through the argument of the entry function.<br />
*<br />
* When a thread entry function is terminated with return, the thread terminates,<br />
* and the return value of the entry function becomes the termination status of that thread.<br />
* The thread exit status can be obtained with sceKernelWaitThreadEnd() or<br />
* sceKernelGetThreadExitStatus() if the thread is not deleted.<br />
*<br />
* @param argSize The argument size given by sceKernelStartThread() is passed.<br />
* @param pArgBlock The address on the stack where the argument block given by sceKernelStartThread() is copied is passed.<br />
* @return Thread exit status<br />
*/<br />
typedef SceInt32 (*SceKernelThreadEntry)(SceSize argSize, void *pArgBlock);<br />
<br />
/**<br />
* @brief Stack change function type<br />
*<br />
* The type of function to call when the stack changes. Specify to sceKernelCallWithChangeStack().<br />
*<br />
* With sceKernelCallWithChangeStack(), the stack is switched as soon as the stack change function is called.<br />
* As soon as the stack change function ends with return, it returns to the original stack.<br />
*<br />
* @param pArg Arbitrary pointer to pass to stack change function<br />
* @return Return value of sceKernelCallWithChangeStack()<br />
*/<br />
typedef SceInt32 (*SceKernelChangeStackFunction)(void *pArg);<br />
<br />
/**<br />
* @brief Thread additional data<br />
*<br />
* This structure is used to store additional data given when creating a thread with sceKernelCreateThread().<br />
*<br />
* Provided for future expansion.<br />
*<br />
*/<br />
typedef struct _SceKernelThreadOptParam { // Min size is 4 bytes. Max size is 0x14 bytes.<br />
SceSize size; /**< Size of this structure (sizeof(SceKernelThreadOptParam)) */<br />
SceUInt32 attr; /**< A bit pattern that specifies valid members in a structure */<br />
SceUInt32 kStackMemType;<br />
SceUInt32 uStackMemType;<br />
SceUInt32 uTLSMemType;<br />
SceUInt32 uStackMemid;<br />
SceUInt32 data_0x18;<br />
} SceKernelThreadOptParam;<br />
<br />
/**<br />
* @brief Thread information structure<br />
*<br />
* A structure used to store thread information with sceKernelGetThreadInfo().<br />
*/<br />
typedef struct _SceKernelThreadInfo {<br />
SceSize size; /**< Size of this structure (sizeof(SceKernelThreadInfo)) */<br />
SceUID processId; /**< Process ID to which the thread belongs */<br />
char name[SCE_UID_NAMELEN+1]; /**< Thread name */<br />
SceUInt32 attr; /**< Thread attributes */<br />
SceUInt32 status; /**< Thread state */<br />
SceKernelThreadEntry entry; /**< Thread entry function address */<br />
void *pStack; /**< Thread stack address (bottom) */<br />
SceSize stackSize; /**< Thread stack size */<br />
SceInt32 initPriority; /**< Thread initial priority */<br />
SceInt32 currentPriority; /**< Thread current priority */<br />
SceInt32 initCpuAffinityMask; /**< Thread initial CPU affinity mask */<br />
SceInt32 currentCpuAffinityMask; /**< Thread current CPU affinity mask */<br />
SceInt32 currentCpuId; /**< CPU number to which the thread currently belongs */<br />
SceInt32 lastExecutedCpuId; /**< CPU number to which the thread was last executed */<br />
SceUInt32 waitType; /**< Type when the thread is waiting */<br />
SceUID waitId; /**< UID of the target synchronization object when the thread is waiting */<br />
SceInt32 exitStatus; /**< Thread exit status */<br />
SceKernelSysClock runClocks; /**< Time (in microseconds) executed since the thread was created */<br />
SceUInt32 intrPreemptCount; /**< Number of times the thread was preempted by interrupt handling */<br />
SceUInt32 threadPreemptCount; /**< Number of times the thread has been preempted by other thread operations */<br />
SceUInt32 threadReleaseCount; /**< Number of times the thread has relinquished execution */<br />
SceInt32 changeCpuCount; /**< Number of CPUs to which the thread is moved */<br />
SceInt32 fNotifyCallback; /**< A flag indicating whether the thread is notified of the callback */<br />
SceInt32 reserved; /**< Reserved area */<br />
} SceKernelThreadInfo;<br />
<br />
/**<br />
* @brief Thread operating status on each CPU<br />
*<br />
* This structure is used by sceKernelGetThreadRunStatus() to obtain the operating status of threads on each CPU.<br />
*<br />
*/<br />
typedef struct _SceKernelThreadRunStatus {<br />
SceSize size; /**< Size of this structure (sizeof(SceKernelThreadRunStatus)) */<br />
struct {<br />
SceUID processId; /**< Process ID to which the running thread belongs */<br />
SceUID threadId; /**< Thread ID being executed */<br />
SceInt32 priority; /**< Priority of the running thread */<br />
} cpuInfo[SCE_KERNEL_MAX_CPU]; /**< Information about individual CPUs */<br />
} SceKernelThreadRunStatus;<br />
<br />
/**<br />
* @brief System state<br />
*<br />
* This structure is used to get the system status with sceKernelGetSystemInfo().<br />
*<br />
*/<br />
typedef struct _SceKernelSystemInfo {<br />
SceSize size; /**< Size of this structure (sizeof(SceKernelSystemInfo)) */<br />
SceUInt32 activeCpuMask; /**< Currently available CPU mask */<br />
struct {<br />
SceKernelSysClock idleClock; /**< Time when there was no thread to execute */<br />
SceUInt32 comesOutOfIdleCount; /**< Number of transitions from a state where there is no thread to execute to another state */<br />
SceUInt32 threadSwitchCount; /**< Number of context switches that occurred */<br />
} cpuInfo[SCE_KERNEL_MAX_CPU]; /**< Information about individual CPUs */<br />
} SceKernelSystemInfo;<br />
<br />
/*@}*//* Basic thread functions */<br />
<br />
/** @name VFP exception<br />
*/<br />
/*@{*/<br />
<br />
/**<br />
* @defgroup Defining VFP exceptions<br />
* Bit pattern that specifies a VFP exception<br />
*/<br />
/*@{*/<br />
#define SCE_KERNEL_VFP_EXCEPTION_MASK_QCE (0x08000000U) /**< QCE flag interrupt enable */<br />
#define SCE_KERNEL_VFP_EXCEPTION_MASK_IDE (0x00000080U) /**< IDE flag interrupt enable */<br />
#define SCE_KERNEL_VFP_EXCEPTION_MASK_IXE (0x00000010U) /**< IXE flag interrupt enable */<br />
#define SCE_KERNEL_VFP_EXCEPTION_MASK_UFE (0x00000008U) /**< UFE flag interrupt enable */<br />
#define SCE_KERNEL_VFP_EXCEPTION_MASK_OFE (0x00000004U) /**< OFE flag interrupt enable */<br />
#define SCE_KERNEL_VFP_EXCEPTION_MASK_DZE (0x00000002U) /**< DZE flag interrupt enable */<br />
#define SCE_KERNEL_VFP_EXCEPTION_MASK_IOE (0x00000001U) /**< IOE flag interrupt enable */<br />
<br />
/**<br />
* Valid VFP exception mask<br />
*/<br />
#define SCE_KERNEL_VFP_EXCEPTION_MASK_ALL (SCE_KERNEL_VFP_EXCEPTION_MASK_QCE | SCE_KERNEL_VFP_EXCEPTION_MASK_IDE | \<br />
SCE_KERNEL_VFP_EXCEPTION_MASK_IXE | SCE_KERNEL_VFP_EXCEPTION_MASK_UFE | \<br />
SCE_KERNEL_VFP_EXCEPTION_MASK_OFE | SCE_KERNEL_VFP_EXCEPTION_MASK_DZE | \<br />
SCE_KERNEL_VFP_EXCEPTION_MASK_IOE)<br />
/*@}*/<br />
<br />
/*@}*//* VFP exception */<br />
<br />
/** @name Common to synchronization<br />
*/<br />
/*@{*/<br />
<br />
/**<br />
* @defgroup Synchronization object common attributes<br />
* Attributes that can be set in common with synchronization objects<br />
*/<br />
/*@{*/<br />
#define SCE_KERNEL_ATTR_SINGLE (0x00000000U) /**< Multiple threads cannot wait simultaneously (event flags only) */<br />
#define SCE_KERNEL_ATTR_MULTI (0x00001000U) /**< Multiple threads can wait at the same time (event flags only) */<br />
#define SCE_KERNEL_ATTR_TH_FIFO (0x00000000U) /**< Waiting thread queuing is FIFO */<br />
#define SCE_KERNEL_ATTR_TH_PRIO (0x00002000U) /**< Queues for waiting threads are ordered by thread priority */<br />
#define SCE_KERNEL_ATTR_MS_FIFO (0x00000000U) /**< Unused */<br />
#define SCE_KERNEL_ATTR_MS_PRIO (0x00000000U) /**< Unused */<br />
#define SCE_KERNEL_ATTR_OPENABLE (0x00000080U) /**< Object can be referenced */<br />
/*@}*/<br />
<br />
/**<br />
* @defgroup Referencing synchronization objects<br />
* Definitions for references to synchronization objects<br />
*/<br />
/*@{*/<br />
#define SCE_KERNEL_OPEN_LIMIT_MAX (127) /**< Maximum value that can be specified when limiting the number of simultaneous references of synchronization objects */<br />
/*@}*/<br />
<br />
/*@}*//* Common to synchronization */<br />
<br />
/** @name Callback<br />
*/<br />
/*@{*/<br />
<br />
/**<br />
* @brief Callback function type<br />
*<br />
* After the callback function is notified by sceKernelNotifyCallback(), the callback function<br />
* confirms the notification by sceKernelCheckCallback() or executes a waiting function with a<br />
* function to check for notifications such as sceKernelWaitSemaCB().<br />
* It is possible to delete your own registration by returning a value other than 0 as the return value of the callback function.<br />
*<br />
* Note<br />
* - The callback function is called as the context of the thread that generated the callback.<br />
* In other words, the callback function can be called only by the callback generated by the own thread by the explicit callback<br />
* check by sceKernelCheckCallback() or the wait function with callback check such as sceKernelWaitSemaCB(). is. To receive<br />
* the callback notification, the thread that generated the callback must use sceKernelCheckCallback(), sceKernelWaitSemaCB(), etc.<br />
* - The sceKernelCheckCallback() and sceKernelDeleteCallback() functions cannot be used inside the callback function.<br />
* In addition, if you call a wait function with CB such as sceKernelWaitSemaCB() function in the callback function, nesting occurs, causing a stack overflow.<br />
* Avoid processing that waits for more callbacks in the callback function.<br />
*<br />
* @param notifyId When a callback is notified from an event that registered a callback with sceKernelRegisterCallbackToEvent(),<br />
* the identifier of the notification source event is passed.<br />
* If not notified from the event, SCE_UID_INVALID_UID is passed.<br />
* @param notifyCount Number of callback notifications until this callback function is executed is passed.<br />
* @param notifyArg Argument given by sceKernelNotifyCallback() is passed.<br />
* @param pCommon Argument given by sceKernelCreateCallback() is passed.<br />
* @retval 0 Normal<br />
* @retval Non-zero value Remove this callback<br />
*/<br />
typedef SceInt32 (*SceKernelCallbackFunction)(SceUID notifyId, SceInt32 notifyCount, SceInt32 notifyArg, void *pCommon);<br />
<br />
/**<br />
* @brief Callback state<br />
*<br />
* This structure is used to get the callback status with sceKernelGetCallbackInfo().<br />
*/<br />
typedef struct _SceKernelCallbackInfo {<br />
SceSize size; /**< Size of this structure (sizeof(SceKernelCallbackInfo) */<br />
SceUID callbackId; /**< Callback identifier */<br />
char name[SCE_UID_NAMELEN + 1]; /**< Name of the callback specified with sceKernelCreateCallback() */<br />
SceUInt32 attr; /**< Callback attribute specified by sceKernelCreateCallback() */<br />
SceUID threadId; /**< Identifier of the thread to which the callback belongs */<br />
SceKernelCallbackFunction callbackFunc; /**< Callback function registered with sceKernelCreateCallback() */<br />
SceUID notifyId; /**< Caller notification source identifier */<br />
SceInt32 notifyCount; /**< Number of times sceKernelNotifyCallback() has been executed for this callback that is still delayed without the callback function being called */<br />
SceInt32 notifyArg; /**< Argument given by sceKernelNotifyCallback() for this callback */<br />
void *pCommon; /**< pCommon argument registered with sceKernelCreateCallback() */<br />
} SceKernelCallbackInfo;<br />
<br />
/*@}*//* Callback */<br />
<br />
/** @name Thread event<br />
*/<br />
/*@{*/<br />
<br />
/**<br />
* @defgroup Thread event handler type<br />
* Defining thread events that trigger thread event handlers<br />
*/<br />
/*@{*/<br />
#define SCE_KERNEL_THREAD_EVENT_TYPE_START (0x04) /**< Thread start event */<br />
#define SCE_KERNEL_THREAD_EVENT_TYPE_EXIT (0x08) /**< Thread end event */<br />
<br />
/**<br />
* Valid thread event mask<br />
*/<br />
#define SCE_KERNEL_THREAD_EVENT_TYPE_ALL (SCE_KERNEL_THREAD_EVENT_TYPE_START | SCE_KERNEL_THREAD_EVENT_TYPE_EXIT)<br />
/*@}*/<br />
<br />
/**<br />
* @defgroup Thread specification for thread event handler<br />
* Thread specification macro in sceKernelRegisterThreadEventHandler()<br />
*/<br />
/*@{*/<br />
#define SCE_KERNEL_THREAD_ID_USER ((SceUID)0xfffffff0) /**< Specify all user threads */<br />
/*@}*/<br />
<br />
/**<br />
* @brief Thread event handler type<br />
*<br />
* Thread event handler type.<br />
* @param type The thread event handler call cause is passed.<br />
* - SCE_KERNEL_THREAD_EVENT_TYPE_START: thread started<br />
* - SCE_KERNEL_THREAD_EVENT_TYPE_EXIT : thread terminated<br />
* @param threadId Identifier of the thread that caused the thread event handler to be called is passed.<br />
* @param arg Argument when calling the thread event handler is passed.<br />
* @param pCommon pCommon specified in sceKernelRegisterThreadEventHandler() is passed as it is.<br />
* @retval SCE_OK Success<br />
* @retval Any value other than SCE_OK Remove this thread event handler<br />
*/<br />
typedef SceInt32 (*SceKernelThreadEventHandler)(SceInt32 type, SceUID threadId, SceInt32 arg, void *pCommon);<br />
<br />
/*@}*//* Thread event */<br />
<br />
/** @name An event<br />
*/<br />
/*@{*/<br />
<br />
/**<br />
* @defgroup Event object attributes<br />
* Definition of attributes to be specified when creating an event object<br />
*/<br />
/*@{*/<br />
#define SCE_KERNEL_EVENT_ATTR_MANUAL_RESET (0x00000000U) /**< Each bit of the event remains in the event notification state until it is manually transitioned to the event non notification state. */<br />
#define SCE_KERNEL_EVENT_ATTR_AUTO_RESET (0x00000100U) /**< Each bit of the event automatically returns to the event non notification state when one waiting thread is woken up. */<br />
<br />
#define SCE_KERNEL_ATTR_NOTIFY_CB_ALL (0x00000000U) /**< When an event is notified, all callbacks registered in the event object are notified. */<br />
#define SCE_KERNEL_ATTR_NOTIFY_CB_WAKEUP_ONLY (0x00000800U) /**< When an event is notified, only the callback of the thread that is waiting for the event and wakes up among the callbacks registered in the event object is notified. */<br />
/*@}*/<br />
<br />
/**<br />
* @defgroup Event type<br />
* Definition of event to be notified<br />
*/<br />
/*@{*/<br />
#define SCE_KERNEL_EVENT_IN (0x00000001U) /* Input event */<br />
#define SCE_KERNEL_EVENT_OUT (0x00000002U) /* Output event */<br />
#define SCE_KERNEL_EVENT_CREATE (0x00000004U) /* Generate event */<br />
#define SCE_KERNEL_EVENT_DELETE (0x00000008U) /* Delete event */<br />
#define SCE_KERNEL_EVENT_ERROR (0x00000010U) /* Error event */<br />
#define SCE_KERNEL_EVENT_OPEN (0x00000100U) /* Reference event */<br />
#define SCE_KERNEL_EVENT_CLOSE (0x00000200U) /* Reference end event */<br />
#define SCE_KERNEL_EVENT_TIMER (0x00008000U) /* Timer event */<br />
#define SCE_KERNEL_EVENT_DATA_EXIST (0x00010000U) /* Event that is notified when data exists in the message pipe buffer (level trigger) */<br />
<br />
#define SCE_KERNEL_EVENT_USER_DEFINED_MASK (0xff000000U) /* User-defined event mask */<br />
<br />
/*@}*/<br />
<br />
/**<br />
* @brief Event object state<br />
*<br />
* This structure is used to acquire the event object status with sceKernelGetEventInfo().<br />
*/<br />
typedef struct _SceKernelEventInfo {<br />
SceSize size; /**< Size of this structure (sizeof(SceKernelEventInfo)) */<br />
SceUID eventId; /**< Event object identifier */<br />
char name[SCE_UID_NAMELEN + 1]; /**< Name of the event specified when creating the event object */<br />
SceUInt32 attr; /**< Event attributes specified when creating the event object */<br />
SceUInt32 eventPattern; /**< Bit pattern of the current event */<br />
SceUInt64 userData; /**< User data added to the last notified event */<br />
SceUInt32 numWaitThreads; /**< Number of threads waiting for the event object */<br />
SceInt32 reserved[1]; /**< Reserved area */<br />
} SceKernelEventInfo;<br />
<br />
/**<br />
* @defgroup Standby mode for event object multiple standby<br />
* Definition of standby mode specified in sceKernelWaitMultipleEvents()<br />
*/<br />
/*@{*/<br />
#define SCE_KERNEL_EVENT_WAIT_MODE_OR (0x00000001U) /**< Wait until one of the waits specified in the event wait condition list is met */<br />
#define SCE_KERNEL_EVENT_WAIT_MODE_AND (0x00000002U) /**< Wait until all waits specified in the event wait condition list are satisfied */<br />
/*@}*/<br />
<br />
/**<br />
* @brief Structure for event wait condition list<br />
*<br />
* Structure for event waiting condition list passed to sceKernelWaitMultipleEvents().<br />
*/<br />
typedef struct _SceKernelWaitEvent {<br />
SceUID eventId; /**< Event object identifier */<br />
SceUInt32 eventPattern; /**< Pattern of events to wait */<br />
} SceKernelWaitEvent;<br />
<br />
/**<br />
* @brief Structure for event waiting result acquisition list<br />
*<br />
* Structure for event waiting result acquisition list to be passed to sceKernelWaitMultipleEvents().<br />
*/<br />
typedef struct _SceKernelResultEvent {<br />
SceUID eventId; /**< Event object identifier */<br />
SceInt32 result; /**< Wait result (equivalent to return value of sceKernelWaitEvent()) */<br />
SceUInt32 resultPattern; /**< Event pattern when waiting completes */<br />
SceInt32 reserved[1]; /**< Reserved area */<br />
SceUInt64 userData; /**< User data received when waiting completed */<br />
} SceKernelResultEvent;<br />
<br />
/*@}*//* An event */<br />
<br />
/**<br />
* @name Event flag<br />
*/<br />
/*@{*/<br />
<br />
/**<br />
* @defgroup Event flag attributes<br />
* Definition of attributes to be specified when generating eventflags<br />
*/<br />
/*@{*/<br />
#define SCE_KERNEL_EVF_ATTR_TH_FIFO SCE_KERNEL_ATTR_TH_FIFO /**< Event flag waiting thread queuing is FIFO */<br />
#define SCE_KERNEL_EVF_ATTR_TH_PRIO SCE_KERNEL_ATTR_TH_PRIO /**< Event flag waiting threads are queued in order of thread priority. */<br />
#define SCE_KERNEL_EVF_ATTR_SINGLE SCE_KERNEL_ATTR_SINGLE /**< Multiple threads cannot wait at the same time */<br />
#define SCE_KERNEL_EVF_ATTR_MULTI SCE_KERNEL_ATTR_MULTI /**< Multiple threads can wait at the same time */<br />
/*@}*/<br />
<br />
/**<br />
* @defgroup Event flag wait mode<br />
* Definition of standby mode specified for eventflag standby<br />
*/<br />
/*@{*/<br />
#define SCE_KERNEL_EVF_WAITMODE_AND (0x00000000U) /**< Waiting for AND */<br />
#define SCE_KERNEL_EVF_WAITMODE_OR (0x00000001U) /**< Waiting for OR */<br />
#define SCE_KERNEL_EVF_WAITMODE_CLEAR_ALL (0x00000002U) /**< Clear all bits after waiting */<br />
#define SCE_KERNEL_EVF_WAITMODE_CLEAR_PAT (0x00000004U) /**< After waiting, clear the bit specified in bitPattern */<br />
/*@}*/<br />
<br />
/**<br />
* @brief Additional data for event flag<br />
*<br />
* This structure is used to store additional data to be given when creating an event flag with sceKernelCreateEventFlag().<br />
*<br />
* 将来の拡張のために用意されています。<br />
*<br />
*/<br />
typedef struct _SceKernelEventFlagOptParam {<br />
SceSize size; /**< Size of this structure (sizeof(SceKernelEventFlagOptParam)) */<br />
} SceKernelEventFlagOptParam;<br />
<br />
/**<br />
* @brief Event flag status<br />
*<br />
* This structure is used to acquire the event flag status with sceKernelGetEventFlagInfo().<br />
*<br />
*/<br />
typedef struct _SceKernelEventFlagInfo {<br />
SceSize size; /**< Size of this structure (sizeof(SceKernelEventFlagInfo)) */<br />
SceUID evfId; /**< Event flag identifier */<br />
char name[SCE_UID_NAMELEN + 1]; /**< Name of the eventflag specified by sceKernelCreateEventFlag() */<br />
SceUInt32 attr; /**< Event flag attribute specified by sceKernelCreateEventFlag() */<br />
SceUInt32 initPattern; /**< Initial bit pattern of event flag */<br />
SceUInt32 currentPattern; /**< Current bit pattern of event flag */<br />
SceUInt32 numWaitThreads; /**< Number of threads waiting for an event */<br />
} SceKernelEventFlagInfo;<br />
<br />
/*@}*//* Event flag */<br />
<br />
/**<br />
* @name Semaphore<br />
*/<br />
/*@{*/<br />
<br />
/**<br />
* @defgroup Semaphore attributes<br />
* Definition of attributes to be specified when creating a semaphore<br />
*/<br />
/*@{*/<br />
#define SCE_KERNEL_SEMA_ATTR_TH_FIFO SCE_KERNEL_ATTR_TH_FIFO /**< Semaphore waiting thread queuing is FIFO */<br />
#define SCE_KERNEL_SEMA_ATTR_TH_PRIO SCE_KERNEL_ATTR_TH_PRIO /**< Semaphore waiting thread queuing is ordered by thread priority */<br />
/*@}*/<br />
<br />
/**<br />
* @brief Additional semaphore data<br />
*<br />
* This structure is used to store additional data given when creating a semaphore with sceKernelCreateSema().<br />
*<br />
* Provided for future expansion.<br />
*<br />
*/<br />
typedef struct _SceKernelSemaOptParam {<br />
SceSize size; /**< Size of this structure (sizeof(SceKernelSemaOptParam)) */<br />
} SceKernelSemaOptParam;<br />
<br />
/**<br />
* @brief Semaphore state<br />
*<br />
* This structure is used to get the semaphore status with sceKernelGetSemaInfo().<br />
*<br />
*/<br />
typedef struct _SceKernelSemaInfo {<br />
SceSize size; /**< Size of this structure (sizeof(SceKernelSemaInfo)) */<br />
SceUID semaId; /**< Semaphore identifier */<br />
char name[SCE_UID_NAMELEN + 1]; /**< Name of the semaphore specified by sceKernelCreateSema() */<br />
SceUInt32 attr; /**< Semaphore attributes specified with sceKernelCreateSema() */<br />
SceInt32 initCount; /**< Initial number of semaphores specified by sceKernelCreateSema() */<br />
SceInt32 currentCount; /**< Current number of semaphore resources */<br />
SceInt32 maxCount; /**< Maximum number of semaphore resources specified by sceKernelCreateSema() */<br />
SceInt32 numWaitThreads; /**< Number of threads waiting for the semaphore */<br />
} SceKernelSemaInfo;<br />
<br />
/*@}*//* Semaphore */<br />
<br />
/**<br />
* @name Mutex<br />
*/<br />
/*@{*/<br />
<br />
/**<br />
* @defgroup Mutex attribute<br />
* Definition of attributes to be specified when creating a mutex<br />
*/<br />
/*@{*/<br />
#define SCE_KERNEL_MUTEX_ATTR_TH_FIFO SCE_KERNEL_ATTR_TH_FIFO /**< Mutex wait thread queuing is FIFO */<br />
#define SCE_KERNEL_MUTEX_ATTR_TH_PRIO SCE_KERNEL_ATTR_TH_PRIO /**< Mutes waiting threads are queued in order of thread priority */<br />
#define SCE_KERNEL_MUTEX_ATTR_RECURSIVE (0x00000002U) /**< Mutex can be recursively locked */<br />
#define SCE_KERNEL_MUTEX_ATTR_CEILING (0x00000004U) /**< Use the mutex priority sealing function */<br />
/*@}*/<br />
<br />
/**<br />
* @brief Mutex additional data<br />
*<br />
* This structure is used to store additional data given when creating mutexes with sceKernelCreateMutex().<br />
*<br />
* Provided for future expansion.<br />
*<br />
*/<br />
typedef struct _SceKernelMutexOptParam {<br />
SceSize size; /**< Size of this structure (sizeof(SceKernelMutexOptParam)) */<br />
SceInt32 ceilingPriority; /**< Priority ceiling priority */<br />
} SceKernelMutexOptParam;<br />
<br />
/**<br />
* @brief Mutex state<br />
*<br />
* This structure is used to get the mutex status with sceKernelGetMutexInfo().<br />
*<br />
*/<br />
typedef struct _SceKernelMutexInfo {<br />
SceSize size; /**< Size of this structure (sizeof(SceKernelMutexInfo)) */<br />
SceUID mutexId; /**< Mutex identifier */<br />
char name[SCE_UID_NAMELEN + 1]; /**< Name of the mutex specified by sceKernelCreateMutex() */<br />
SceUInt32 attr; /**< Mutex attributes specified with sceKernelCreateMutex() */<br />
SceInt32 initCount; /**< Initial lock count of mutex specified by sceKernelCreateMutex() */<br />
SceInt32 currentCount; /**< Current number of mutex locks */<br />
SceUID currentOwnerId; /**< Identifier of the thread that currently owns the mutex */<br />
SceUInt32 numWaitThreads; /**< Number of threads waiting for the mutex */<br />
SceInt32 ceilingPriority; /**< Priority ceiling priority (0 if priority ceiling function is not used) */<br />
} SceKernelMutexInfo;<br />
<br />
/*@}*//* Mutex */<br />
<br />
<br />
/**<br />
* @name Lightweight mutex<br />
*/<br />
/*@{*/<br />
<br />
/**<br />
* @defgroup Lightweight mutex attribute<br />
* Definition of attributes to be specified when creating a lightweight mutex<br />
*/<br />
/*@{*/<br />
#define SCE_KERNEL_LW_MUTEX_ATTR_TH_FIFO SCE_KERNEL_ATTR_TH_FIFO /**< Lightweight mutex wait thread queuing is FIFO */<br />
#define SCE_KERNEL_LW_MUTEX_ATTR_TH_PRIO SCE_KERNEL_ATTR_TH_PRIO /**< Queues for lightweight mutex wait threads are ordered by thread priority */<br />
#define SCE_KERNEL_LW_MUTEX_ATTR_RECURSIVE (0x00000002U) /**< Lightweight mutex can be recursively locked */<br />
/*@}*/<br />
<br />
/**<br />
* @brief Light mutex work area<br />
*<br />
* A structure used to store work areas used by lightweight mutexes.<br />
* The lightweight mutex work area must be reserved in the user memory space.<br />
* All operations on the lightweight mutex are performed via the SceKernelLwMutexWork structure.<br />
*<br />
* Since the SceKernelLwMutexWork structure is used as a work area by the kernel, after creating<br />
* a lightweight mutex with sceKernelCreateLwMutex(), the user program must not directly<br />
* reference / manage the contents until it is deleted with sceKernelDeleteLwMutex(). The address cannot be moved.<br />
*<br />
* The SceKernelLwMutexWork structure must be arranged with 8-byte alignment on the memory.<br />
*<br />
*/<br />
typedef struct _SceKernelLwMutexWork {<br />
SceInt64 data[4]; /**< Light mutex work area */<br />
} SceKernelLwMutexWork;<br />
<br />
/**<br />
* @brief Additional data for lightweight mutex<br />
*<br />
* This structure is used to store additional data given when creating a lightweight mutex with sceKernelCreateLwMutex().<br />
*<br />
* Provided for future expansion.<br />
*<br />
*/<br />
typedef struct _SceKernelLwMutexOptParam {<br />
SceSize size; /**< Size of this structure (sizeof(SceKernelLwMutexOptParam)) */<br />
} SceKernelLwMutexOptParam;<br />
<br />
/**<br />
* @brief Light mutex state<br />
*<br />
* A structure used to obtain the status of a lightweight mutex with sceKernelGetLwMutexInfo().<br />
*<br />
*/<br />
typedef struct _SceKernelLwMutexInfo {<br />
SceSize size; /**< Size of this structure (sizeof(SceKernelLwMutexInfo)) */<br />
SceUID uid; /**< Lightweight mutex identifier */<br />
char name[SCE_UID_NAMELEN + 1]; /**< Name of the mutex specified by sceKernelCreateLwMutex() */<br />
SceUInt32 attr; /**< Mutex attributes specified with sceKernelCreateLwMutex() */<br />
SceKernelLwMutexWork *pWork; /**< Mutex work area specified by sceKernelCreateLwMutex() */<br />
SceInt32 initCount; /**< Initial number of lw mutex locks specified by sceKernelCreateLwMutex() */<br />
SceInt32 currentCount; /**< Current lock count of lightweight mutex */<br />
SceUID currentOwnerId; /**< Identifier of the thread that currently owns the lightweight mutex */<br />
SceUInt32 numWaitThreads; /**< Number of threads waiting for the lightweight mutex */<br />
} SceKernelLwMutexInfo;<br />
<br />
/*@}*//* Lightweight mutex */<br />
<br />
/** @name Condition variable<br />
*/<br />
/*@{*/<br />
<br />
/**<br />
* @defgroup Condition variable attributes<br />
* Defining attributes to be specified when creating a condition variable<br />
*/<br />
/*@{*/<br />
#define SCE_KERNEL_COND_ATTR_TH_FIFO SCE_KERNEL_ATTR_TH_FIFO /**< Condition variable wait thread queuing is FIFO */<br />
#define SCE_KERNEL_COND_ATTR_TH_PRIO SCE_KERNEL_ATTR_TH_PRIO /**< Condition variable wait thread queuing is in order of thread priority */<br />
/*@}*/<br />
<br />
/**<br />
* @brief Additional data for condition variables<br />
*<br />
* This structure is used to store additional data given when creating a condition variable with sceKernelCreateCond().<br />
*<br />
* Provided for future expansion.<br />
*<br />
*/<br />
typedef struct _SceKernelCondOptParam {<br />
SceSize size; /**< Size of this structure (sizeof(SceKernelMutexOptParam)) */<br />
} SceKernelCondOptParam;<br />
<br />
/**<br />
* @brief Condition variable state<br />
*<br />
* This structure is used to acquire the condition variable status with sceKernelGetCondInfo().<br />
*<br />
*/<br />
typedef struct _SceKernelCondInfo {<br />
SceSize size; /**< Size of this structure (sizeof(SceKernelCondInfo)) */<br />
SceUID condId; /**< Condition variable identifier */<br />
char name[SCE_UID_NAMELEN + 1]; /**< Condition variable name specified in sceKernelCreateCond() */<br />
SceUInt32 attr; /**< Condition variable attribute specified in sceKernelCreateCond() */<br />
SceUID mutexId; /**< Mutex associated with the condition variable specified by sceKernelCreateCond() */<br />
SceUInt32 numWaitThreads; /**< Number of threads waiting for the condition variable */<br />
} SceKernelCondInfo;<br />
<br />
/*@}*//* Condition variable */<br />
<br />
/** @name Lightweight condition variable<br />
*/<br />
/*@{*/<br />
<br />
/**<br />
* @defgroup Lightweight condition variable attributes<br />
* Definition of attributes to be specified when creating lightweight condition variables<br />
*/<br />
/*@{*/<br />
#define SCE_KERNEL_LW_COND_ATTR_TH_FIFO SCE_KERNEL_ATTR_TH_FIFO /**< Lightweight condition variable waiting thread queuing is FIFO */<br />
#define SCE_KERNEL_LW_COND_ATTR_TH_PRIO SCE_KERNEL_ATTR_TH_PRIO /**< Lightweight condition variable waiting thread queuing is ordered by thread priority */<br />
/*@}*/<br />
<br />
/**<br />
* @brief Lightweight condition variable work area<br />
*<br />
* A structure used to store the work area used by the lightweight condition variable.<br />
* The work area for lightweight condition variables must be allocated in the user memory space.<br />
* All operations on lightweight condition variables are done via the SceKernelLwCondWork structure.<br />
*<br />
* Since the SceKernelLwCondWork structure is used as a work area by the kernel, once a<br />
* lightweight condition variable is created with sceKernelCreateLwCond(), the contents must not be directly<br />
* referenced / operated by the user program until it is deleted with sceKernelDeleteLwCond(). The address cannot be moved.<br />
*/<br />
typedef struct _SceKernelLwCondWork {<br />
SceInt32 data[4]; /**< Lightweight condition variable work area */<br />
} SceKernelLwCondWork;<br />
<br />
/**<br />
* @brief Additional data for lightweight condition variables<br />
*<br />
* This structure is used to store additional data given when creating a lightweight condition variable with sceKernelCreateLwCond().<br />
*<br />
* Provided for future expansion.<br />
*<br />
*/<br />
typedef struct _SceKernelLwCondOptParam {<br />
SceSize size; /**< Size of this structure (sizeof(SceKernelLwCondOptParam)) */<br />
} SceKernelLwCondOptParam;<br />
<br />
/**<br />
* @brief Lightweight condition variable state<br />
*<br />
* sceKernelGetLwCondInfo() is a structure used to obtain the status of a lightweight condition variable.<br />
*<br />
*/<br />
typedef struct _SceKernelLwCondInfo {<br />
SceSize size; /**< Size of this structure (sizeof(SceKernelLwCondInfo)) */<br />
SceUID uid; /**< Lightweight condition variable identifier */<br />
char name[SCE_UID_NAMELEN + 1]; /**< Name of the lightweight condition variable specified with sceKernelCreateLwCond() */<br />
SceUInt32 attr; /**< Attributes of lightweight condition variable specified by sceKernelCreateLwCond() */<br />
SceKernelLwCondWork *pWork; /**< Work area of lightweight condition variable specified by sceKernelCreateLwCond() */<br />
SceKernelLwMutexWork *pLwMutex; /**< Lightweight mutex work area associated with the lightweight condition variable specified by sceKernelCreateLwCond() */<br />
SceUInt32 numWaitThreads; /**< Number of threads waiting for lightweight condition variables */<br />
} SceKernelLwCondInfo;<br />
<br />
/*@}*//* Lightweight condition variable */<br />
<br />
/** @name Timer<br />
*/<br />
/*@{*/<br />
<br />
/**<br />
* @defgroup Type of timer event notification<br />
* Defining timer event notification types<br />
*/<br />
/*@{*/<br />
#define SCE_KERNEL_TIMER_TYPE_SET_EVENT (0) /**< Timer is notified by set type event */<br />
#define SCE_KERNEL_TIMER_TYPE_PULSE_EVENT (1) /**< Timer is notified by pulse type event */<br />
/*@}*/<br />
<br />
/**<br />
* @brief Additional data for timer<br />
*<br />
* This structure is used to store additional data given when a timer is created with sceKernelCreateTimer().<br />
*<br />
* Provided for future expansion.<br />
*/<br />
typedef struct _SceKernelTimerOptParam {<br />
SceSize size; /**< Size of this structure (sizeof(SceKernelTimerOptParam)) */<br />
} SceKernelTimerOptParam;<br />
<br />
/**<br />
* @brief Timer information<br />
*<br />
* Timer information acquisition structure.<br />
*/<br />
typedef struct _SceKernelTimerInfo {<br />
SceSize size; /**< Size of this structure (sizeof(SceKernelTimerInfo)) */<br />
SceUID timerId; /**< Timer identifier */<br />
char name[SCE_UID_NAMELEN + 1]; /**< Timer name specified by sceKernelCreateTimer() */<br />
SceUInt32 attr; /**< Timer attribute specified by sceKernelCreateTimer() */<br />
SceInt32 fActive; /**< Timer start flag (if 1, counter is running) */<br />
SceKernelSysClock baseTime; /**< Timer reference process time */<br />
SceKernelSysClock currentTime; /**< Timer current time */<br />
SceKernelSysClock schedule; /**< Timer next scheduled event notification time (if an event is set) */<br />
SceKernelSysClock interval; /**< Timer event notification interval specified by sceKernelSetTimerEvent() */<br />
SceInt32 type; /**< Timer event notification type specified by sceKernelSetTimerEvent() */<br />
SceInt32 fRepeat; /**< Timer repeat flag specified by sceKernelSetTimerEvent() (1: periodic timer) */<br />
SceUInt32 numWaitThreads; /**< Number of threads waiting for timer */<br />
SceInt32 reserved[1]; /**< Reserved area */<br />
} SceKernelTimerInfo;<br />
<br />
/*@}*//* Timer */<br />
<br />
/** @name Simple event<br />
*/<br />
/*@{*/<br />
<br />
/**<br />
* @brief Simple event additional data<br />
*<br />
* This structure is used to store additional data given when a simple event is generated with sceKernelCreateSimpleEvent().<br />
*<br />
* Provided for future expansion.<br />
*<br />
*/<br />
typedef struct _SceKernelSimpleEventOptParam {<br />
SceSize size; /**< Size of this structure (sizeof(SceKernelSimpleEventOptParam)) */<br />
} SceKernelSimpleEventOptParam;<br />
<br />
/*@}*//* Simple event */<br />
<br />
/** @name Message pipe<br />
*/<br />
/*@{*/<br />
<br />
/**<br />
* @defgroup Message pipe attributes<br />
* Defining message pipe attributes<br />
*/<br />
/*@{*/<br />
#define SCE_KERNEL_MSG_PIPE_ATTR_TH_PRIO_S (0x00000001U) /**< The queue of the message sender's waiting thread is FIFO */<br />
#define SCE_KERNEL_MSG_PIPE_ATTR_TH_PRIO_R (0x00000002U) /**< The queue of the message receiver standby thread is FIFO */<br />
#define SCE_KERNEL_MSG_PIPE_ATTR_TH_PRIO (SCE_KERNEL_MSG_PIPE_ATTR_TH_PRIO_S | SCE_KERNEL_MSG_PIPE_ATTR_TH_PRIO_R) /**< Message queuing wait thread queuing is FIFO */<br />
<br />
#define SCE_KERNEL_MSG_PIPE_ATTR_TH_FIFO_S (0x00000004U) /**< Queues for waiting threads on the message sender side are in order of thread priority */<br />
#define SCE_KERNEL_MSG_PIPE_ATTR_TH_FIFO_R (0x00000008U) /**< Queues for message receiver standby threads are ordered by thread priority */<br />
#define SCE_KERNEL_MSG_PIPE_ATTR_TH_FIFO (SCE_KERNEL_MSG_PIPE_ATTR_TH_FIFO_S | SCE_KERNEL_MSG_PIPE_ATTR_TH_FIFO_R) /**< Queues for message send / receive waiting threads are ordered by thread priority */<br />
/*@}*/<br />
<br />
/**<br />
* @defgroup Message pipe wait mode<br />
* Message pipe wait mode<br />
*/<br />
/*@{*/<br />
#define SCE_KERNEL_MSG_PIPE_MODE_ASAP (0x00000000U) /**< Complete if you can send and receive even 1 byte of data */<br />
#define SCE_KERNEL_MSG_PIPE_MODE_FULL (0x00000001U) /**< Complete when all data of the specified size has been sent and received */<br />
<br />
#define SCE_KERNEL_MSG_PIPE_MODE_WAIT (0x00000000U) /**< Block threads until send / receive processing is complete (synchronous mode) */<br />
#define SCE_KERNEL_MSG_PIPE_MODE_DONT_WAIT (0x00000010U) /**< Issue a send / receive request and return immediately (asynchronous mode) */<br />
<br />
#define SCE_KERNEL_MSG_PIPE_MODE_DONT_REMOVE (0x00000100U) /**< Do not delete received data from the pipe (peak processing) */<br />
/*@}*/<br />
<br />
/**<br />
* @defgroup Message pipe type<br />
* Defining the pipe buffer type for a message pipe<br />
* Specify which budget to get memory from<br />
*/<br />
/*@{*/<br />
#define SCE_KERNEL_MSG_PIPE_TYPE_USER_MAIN (64) /**< User main area */<br />
#define SCE_KERNEL_MSG_PIPE_TYPE_USER_CDRAM (66) /**< User CDRAM area (not mounted) */<br />
/*@}*/<br />
<br />
/**<br />
* @defgroup Message pipe optional attributes<br />
* Macros that can be specified in the attr member of SceKernelMsgPipeOptParam<br />
*/<br />
/*@{*/<br />
#define SCE_KERNEL_MSG_PIPE_OPT_ATTR_OPEN_LIMITATION (0x00000100U) /**< Specify openLimit */<br />
/*@}*/<br />
<br />
/**<br />
* Buffer information for message pipe discontinuous data transmission / reception<br />
*<br />
* sceKernelSendMsgPipeVector(), sceKernelSendMsgPipeVectorCB(), sceKernelTrySendMsgPipeVector(),<br />
* sceKernelReceiveMsgPipeVector(), sceKernelReceiveMsgPipeVectorCB(), sceKernelTryReceiveMsgPipeVector()<br />
* are used to transmit and receive data.<br />
* This structure specifies a single contiguous memory range.<br />
*<br />
* Specify the base address in pBase.<br />
* Specify the size (byte) in bufSize.<br />
*<br />
*/<br />
typedef struct _SceKernelMsgPipeVector {<br />
void *pBase; /**< Buffer base address */<br />
SceSize bufSize; /**< Buffer size */<br />
} SceKernelMsgPipeVector;<br />
<br />
/**<br />
* @brief Message pipe status<br />
*<br />
* This structure is used to get the message pipe status with sceKernelGetMsgPipeInfo().<br />
*<br />
*/<br />
typedef struct _SceKernelMsgPipeInfo {<br />
SceSize size; /**< Size of this structure (sizeof(SceKernelMsgPipeInfo)) */<br />
SceUID msgPipeId; /**< Message pipe identifier */<br />
char name[SCE_UID_NAMELEN + 1]; /**< Name of the message pipe specified with sceKernelCreateMsgPipe() */<br />
SceUInt32 attr; /**< Message pipe attribute specified by sceKernelCreateMsgPipe() */<br />
SceSize bufferSize; /**< Total size of message pipe pipe buffer (bytes) */<br />
SceSize freeSize; /**< Empty pipe buffer size of message pipe (byte) */<br />
SceUInt32 numSendWaitThreads; /**< Number of threads waiting to be sent */<br />
SceUInt32 numReceiveWaitThreads; /**< Number of threads waiting to receive */<br />
} SceKernelMsgPipeInfo;<br />
<br />
/**<br />
* @brief Additional data for the message pipe<br />
*<br />
* This structure is used to store additional data given when creating a message pipe with sceKernelCreateMsgPipe().<br />
*<br />
* Specify a bit pattern that represents a valid member in attr.<br />
* The following macros can be specified by logical OR.<br />
* - SCE_KERNEL_MSG_PIPE_OPT_ATTR_OPEN_LIMITATION: Specify the maximum number that can be referenced simultaneously with sceKernelOpenMsgPipe() (openLimit)<br />
*<br />
* In openLimit, the maximum number of simultaneous references by sceKernelOpenMsgPipe() can be specified.<br />
* The maximum number that can be specified is (0..SCE_KERNEL_OPEN_LIMIT_MAX (127)).<br />
* If not specified, the number of simultaneous references is not limited.<br />
*<br />
* Be sure to call sizeof(SceKernelMsgPipeOptParam) for size.<br />
*<br />
*/<br />
typedef struct _SceKernelMsgPipeOptParam {<br />
SceSize size; /**< Size of this structure (sizeof(SceKernelMsgPipeOptParam)) */<br />
SceUInt32 attr; /**< A bit pattern that specifies a valid member of a structure */<br />
SceInt32 reserved[2]; /**< Reserved area */<br />
SceUInt32 openLimit; /**< Maximum number that can be referenced simultaneously with sceKernelOpenMsgPipe() (0..SCE_KERNEL_OPEN_LIMIT_MAX (127)) can be specified. If not specified, unlimited */<br />
} SceKernelMsgPipeOptParam;<br />
<br />
/*@}*//* Message pipe */<br />
<br />
/** @name Reader / writer lock<br />
*/<br />
/*@{*/<br />
<br />
/**<br />
* @defgroup Reader / writer lock attribute<br />
* Definition of attributes to be specified when creating a reader / writer lock<br />
*/<br />
/*@{*/<br />
#define SCE_KERNEL_RW_LOCK_ATTR_TH_FIFO SCE_KERNEL_ATTR_TH_FIFO /**< Reader / writer lock waiting thread queuing is FIFO */<br />
#define SCE_KERNEL_RW_LOCK_ATTR_TH_PRIO SCE_KERNEL_ATTR_TH_PRIO /**< Queued reader / writer lock waiting threads are ordered by thread priority */<br />
#define SCE_KERNEL_RW_LOCK_ATTR_RECURSIVE (0x00000002U) /**< Reader / writer lock can be recursively locked */<br />
#define SCE_KERNEL_RW_LOCK_ATTR_CEILING (0x00000004U) /**< Use the priority sealing function when the reader / writer lock is locked (not implemented) */<br />
/*@}*/<br />
<br />
/**<br />
* @defgroup Reader / writer lock cancel flag<br />
* Definition of flag to be specified when canceling reader / writer lock<br />
*/<br />
/*@{*/<br />
#define SCE_KERNEL_RW_LOCK_CANCEL_WITH_WRITE_LOCK (1) /**< Acquire light lock atomically after cancellation */<br />
/*@}*/<br />
<br />
/**<br />
* @brief Additional data for reader / writer lock<br />
*<br />
* This structure is used to store additional data given when creating a reader / writer lock with sceKernelCreateRWLock().<br />
*<br />
* Provided for future expansion.<br />
*<br />
*/<br />
typedef struct _SceKernelRWLockOptParam {<br />
SceSize size; /**< Size of this structure (sizeof(SceKernelRWLockOptParam)) */<br />
} SceKernelRWLockOptParam;<br />
<br />
/**<br />
* @brief Reader / writer lock status<br />
*<br />
* This structure is used to acquire the reader / writer lock status with sceKernelGetRWLockInfo().<br />
*<br />
*/<br />
typedef struct _SceKernelRWLockInfo {<br />
SceSize size; /**< Size of this structure (sizeof(SceKernelRWLockInfo)) */<br />
SceUID rwLockId; /**< Reader / writer lock identifier */<br />
char name[SCE_UID_NAMELEN + 1]; /**< Name of reader / writer lock specified by sceKernelCreateRWLock() */<br />
SceUInt32 attr; /**< Reader / writer lock attribute specified by sceKernelCreateRWLock() */<br />
SceInt32 lockCount; /**< Current number of locks of reader / writer lock */<br />
SceUID writeOwnerId; /**< Identifier of the thread that currently holds (owns) the reader / writer lock */<br />
SceUInt32 numReadWaitThreads; /**< Number of threads waiting for reader / writer lock with read lock */<br />
SceUInt32 numWriteWaitThreads; /**< Number of threads waiting for reader / writer lock with write lock */<br />
} SceKernelRWLockInfo;<br />
<br />
/*@}*//* Reader / writer lock */<br />
<br />
typedef struct SceKernelWorkqueueCreateInfo { // size is 0x40-bytes<br />
SceSize size;<br />
SceUID wqueue_id;<br />
char name[0x20];<br />
SceInt32 unk_0x28;<br />
SceInt32 unk_0x2C;<br />
SceInt32 unk_0x30;<br />
SceInt32 unk_0x34;<br />
SceInt32 unk_0x38;<br />
SceInt32 unk_0x3C;<br />
} SceKernelWorkqueueCreateInfo;<br />
<br />
typedef struct SceKernelWorktaskCreateInfo { // size is 0x34-bytes<br />
SceSize size;<br />
SceUID wtask_id;<br />
char name[0x20];<br />
const void *func;<br />
void *argp;<br />
SceUID wqueue_id;<br />
} SceKernelWorktaskCreateInfo;<br />
<br />
typedef struct SceThreadmgrForDriver_E605ED7A_t { // size is 0x58-bytes<br />
SceSize size;<br />
SceUID wtaskId;<br />
SceUID processId;<br />
SceInt32 unk_0x0C;<br />
char name[0x20];<br />
const void *func;<br />
void *argp;<br />
SceUID wqueue_id;<br />
SceUID unk_0x3C;<br />
SceUID unk_0x40;<br />
void *unk_0x44;<br />
SceInt32 unk_0x48;<br />
SceInt32 unk_0x4C;<br />
SceUID processId2;<br />
SceInt32 unk_0x54;<br />
} SceThreadmgrForDriver_E605ED7A_t;<br />
<br />
<br />
#define SCE_KERNEL_WORKQUEUE_HAS_THREAD_NUMBER (1 << 0)<br />
#define SCE_KERNEL_WORKQUEUE_HAS_PRIORITY (1 << 1)<br />
#define SCE_KERNEL_WORKQUEUE_HAS_STACK_SIZE (1 << 2)<br />
#define SCE_KERNEL_WORKQUEUE_HAS_CPU_AFFINITY_MASK (1 << 3)<br />
<br />
typedef struct SceKernelCreateWorkQueueParam {<br />
SceSize;<br />
SceUInt32 nThread;<br />
SceUInt32 initPriority;<br />
SceSize stackSize;<br />
SceUInt32 cpuAffinityMask;<br />
} SceKernelCreateWorkQueueParam;<br />
</source><br />
<br />
== Possible function names according to SceTestBridge ==<br />
<br />
<source><br />
sceTestBridgeThreadMgrCallCoredumpHandler -> ??<br />
sceTestBridgeThreadMgrClearThreadMgrTestMode -> sceKernelClearThreadMgrTestModeForKernel<br />
sceTestBridgeThreadMgrDeleteStopThreadEvf -> ??<br />
sceTestBridgeThreadMgrExitDeleteThreadInSyscall -> sceKernelExitDeleteThread<br />
sceTestBridgeThreadMgrFastMutexLockUnlock -> ??<br />
sceTestBridgeThreadMgrFastMutexShowStat -> ??<br />
sceTestBridgeThreadMgrFastMutexStart -> ??<br />
sceTestBridgeThreadMgrFastMutexStop -> ??<br />
sceTestBridgeThreadMgrGetLwMutexInfoAll -> looks like _sceKernelGetLwMutexInfoById<br />
sceTestBridgeThreadMgrIsCoredumpHandlerRegistered<br />
sceTestBridgeThreadMgrRegisterCoredumpHandler -> sceCoredumpRegisterCoredumpHandler<br />
sceTestBridgeThreadMgrResumeThread -> sceKernelResumeThreadForVM<br />
sceTestBridgeThreadMgrRunningInSyscall -> ??<br />
sceTestBridgeThreadMgrSetAndDeleteSuspendThreadEvf -> ??<br />
sceTestBridgeThreadMgrSetThreadMgrTestMode -> sceKernelSetThreadMgrTestModeForKernel<br />
sceTestBridgeThreadMgrSpawnPriorityThread -> ??<br />
sceTestBridgeThreadMgrStopThread -> sceKernelStopThreadForKernel<br />
sceTestBridgeThreadMgrSuspendThread -> sceKernelSuspendThreadForVM<br />
sceTestBridgeThreadMgrUnregisterCoredumpHandler -> sceCoredumpUnregisterCoredumpHandler<br />
sceTestBridgeThreadMgrWaitInSyscall -> ??<br />
sceTestBridgeThreadMgrWaitInSyscall2 -> ??<br />
sceTestbridgeApi -> ??<br />
</source><br />
<br />
== Thread Priority ==<br />
<br />
Basic Priority Table<br />
<br />
{| class="wikitable"<br />
! General Priority !! Internal Priority !! Description<br />
|-<br />
| 0 || - || Current running thread priority<br />
|-<br />
| < 0x100000E0 || - || Error with 0x80028023<br />
|-<br />
| >= 0x10000120 || - || Error with 0x80028023<br />
|-<br />
| 0x10000100 || 0xA0 || For GAME Process without some thread attr<br />
|-<br />
| 0x10000100 || 0x60 || For GAME Process<br />
|-<br />
| 0x10000100 || 0x60 || For MiniApp Process<br />
|-<br />
| 0x10000100 || 0x60 || For Shell Process<br />
|-<br />
| 0x10000100 || 0x60 || For Kernel Process<br />
|}<br />
<br />
Internal Priority Table<br />
<br />
{| class="wikitable"<br />
! Allowed Internal Priority !! Description<br />
|-<br />
| 0x40 - 0xBF || For User GAME Process<br />
|-<br />
| 0x40 - 0xFB || For User non-GAME Process (Kernel, shell, miniapp)<br />
|-<br />
| 1 - 0xFB || For non-User Process<br />
|}<br />
<br />
== Threadmgr SGI events ==<br />
<br />
{| class="wikitable"<br />
! Event !! Description<br />
|-<br />
| 0x0 || changeThreadCpuAffinityMask<br />
|-<br />
| 0x1 || changeThreadPriority<br />
|-<br />
| 0x2 || changeThreadPriorityAndCpuAffinityMask<br />
|-<br />
| 0x3 || atomic core orr<br />
|-<br />
| 0x4-0x7 || N/A<br />
|-<br />
| 0x8 || debugSuspendThread<br />
|-<br />
| 0x9 || stopThread<br />
|-<br />
| 0xA || suspendThreadForVM<br />
|-<br />
| 0xB || setCpuRegisterForDebugger<br />
|-<br />
| 0xC || getCpuRegisterForDebugger<br />
|-<br />
| 0xD || setVfpRegisterForDebugger<br />
|-<br />
| 0xE || getVfpRegisterForDebugger<br />
|-<br />
| 0xF || N/A<br />
|-<br />
| 0x10 || pmonThreadChangeEnableCounter<br />
|-<br />
| 0x11 || pmonThreadSetCounter<br />
|-<br />
| 0x12 || pmonThreadGetCounter<br />
|-<br />
| 0x13 || some msgpipe function?<br />
|-<br />
| 0x14 || some msgpipe function?<br />
|-<br />
| 0x15-0x17 || N/A<br />
|-<br />
| 0x18 || DTrace XCall Async<br />
|-<br />
| 0x18 || DTrace XCall Sync<br />
|}<br />
<br />
== SceThreadmgrForDriver ==<br />
<br />
=== sceKernelSetEventWithNotifyCallbackForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.995 || not present. Present in ForKernel. [[SceKernelThreadMgr#sceKernelSetEventWithNotifyCallbackForKernel]]<br />
|-<br />
| 3.60 || 0xB7DF3EDF<br />
|}<br />
<br />
=== sceKernelRegisterKTLSForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xB645C7EF<br />
|}<br />
<br />
Temp name was sceKernelAllocateKTLSForDriver. <code>sceKernelAllocateKTLS</code> symbol is present in old SCE modules but <code>sceKernelRegisterKTLS</code> is more suitable and used more often.<br />
<br />
<source lang="C"><br />
typedef void SceKernelKTLSFreeCallback(void* ktls_data, void* pUserdata);<br />
<br />
/**<br />
* @brief Registers a kernel TLS slot.<br />
*<br />
* There are 8 KTLS slots available. However, slot 0 and 1 cannot be accessed via the KTLS API.<br />
* Thus, only 6 slots can be registered and used by external callers.<br />
*<br />
* @param[in] size Size of the KTLS data to allocate<br />
* @param[in,opt] freeCb Callback invoked when the KTLS data of a thread is freed (during thread termination)<br />
* @param[in,opt] pUserdata User-provided data passed to freeCb<br />
* @retval (>=0) KTLS index of the registered slot<br />
* @retval (<0) Error code<br />
* @note If no free KTLS slots are available, SCE_KERNEL_ERROR_KERNEL_TLS_FULL (0x80028081) is returned.<br />
*/<br />
SceInt32 sceKernelRegisterKTLSForDriver(SceSize size, SceKernelKTLSFreeCallback* freeCb, void* pUserdata);<br />
</source><br />
<br />
=== sceKernelUnregisterKTLSForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x8C3C1F78<br />
|}<br />
<br />
<source lang="C"><br />
/**<br />
* @brief Unregisters a Kernel TLS slot.<br />
*<br />
* @param[in] index KTLS index returned by sceKernelRegisterKTLS()<br />
* @retval SCE_OK Success<br />
* @retval (<0) Error code<br />
* @note A KTLS index can only be unregistered if no thread has KTLS data allocated for this index.<br />
* Otherwise, error SCE_KERNEL_ERROR_KERNEL_TLS_BUSY (0x80028083) is returned.<br />
*/<br />
SceInt32 sceKernelUnregisterKTLSForDriver(SceInt32 index);<br />
</source><br />
<br />
=== SceThreadmgrForDriver_89CA5698 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x89CA5698<br />
|}<br />
<br />
<source lang="C"><br />
/**<br />
* @brief Returns the pointer to KTLS data from a slot.<br />
*<br />
* @param[in] index KTLS index returned by sceKernelRegisterKTLS()<br />
* @param[in] thid ID of the thread whose KTLS data should be retrieved, or 0 for the current thread<br />
* @param[in] allocate Controls behavior if the KTLS data for the slot has not been allocated yet for this thread:<br />
* SCE_TRUE => allocate and return the new allocation<br />
* SCE_FALSE => don't allocate; return NULL<br />
* @retval non-NULL Pointer to the KTLS data<br />
* @retval NULL Error / KTLS data is not allocated (if allocate == SCE_FALSE)<br />
*/<br />
ScePVoid SceThreadmgrForDriver_89CA5698(SceInt32 index, SceUID thid, SceBool allocate);<br />
</source><br />
<br />
=== SceThreadmgrForDriver_3A72C6D8 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x3A72C6D8<br />
|}<br />
<br />
Wrapper for [[SceKernelThreadMgr#SceThreadmgrForDriver_89CA5698]].<br />
<br />
<source lang="C"><br />
ScePVoid SceThreadmgrForDriver_3A72C6D8(SceInt32 index) {<br />
return SceThreadmgrForDriver_89CA5698(index, 0, SCE_TRUE);<br />
}<br />
</source><br />
<br />
=== sceKernelPMonSetControlRegisterForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-2.060.011 || not present. Present in [[#SceThreadmgrForKernel]].<br />
|-<br />
| 2.100.081-3.740.011 || 0x1AAFA818<br />
|}<br />
<br />
=== sceKernelPMonSetUserEnableRegisterForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-2.060.011 || not present. Present in [[#SceThreadmgrForKernel]].<br />
|-<br />
| 2.100.081-3.740.011 || 0x5053B005<br />
|}<br />
<br />
=== sceKernelWaitThreadEndCBForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x9EF4F62C<br />
|}<br />
<br />
=== sceKernelWaitThreadEndForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x3E20216F<br />
|}<br />
<br />
=== sceKernelWaitEventFlagCBForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x8A35F714<br />
|}<br />
<br />
=== sceKernelWaitEventFlagForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x0C1D3F20<br />
|}<br />
<br />
<source lang="C"><br />
/**<br />
* @brief Event flag wait<br />
*<br />
* This system call waits for the event flag specified by evfId to be set according to the wait release condition specified by waitMode.<br />
* If the event flag specified by evfId already satisfies the wait release condition specified by waitMode,<br />
* the issuing thread continues execution without transitioning to the waiting state (WAITING).<br />
*<br />
* When SCE_KERNEL_EVF_WAITMODE_AND is specified for waitMode, it waits until all the bits specified by bitPattern become 1.<br />
* If SCE_KERNEL_EVF_WAITMODE_OR is specified for waitMode, wait until one of the bits specified in bitPattern becomes 1.<br />
* If SCE_KERNEL_EVF_WAITMODE_CLEAR_ALL is additionally specified for waitMode, all the eventflag bits<br />
* are cleared to 0 when the wait release condition is satisfied and this thread is released.<br />
* If SCE_KERNEL_EVF_WAITMODE_CLEAR_PAT is additionally specified for waitMode, the bit specified<br />
* by bitPattern is cleared to 0 when the wait release condition is satisfied and this thread is released.<br />
*<br />
* The event flag value is returned to pResultPat in the following cases. NULL can be specified if no value is required.<br />
* - If the wait release condition is satisfied (SCE_OK is returned),<br />
* the event flag value before clearing by specifying SCE_KERNEL_EVF_WAITMODE_CLEAR_ALL,<br />
* SCE_KERNEL_EVF_WAITMODE_CLEAR_PAT is returned immediately after the condition is satisfied.<br />
* - After exiting the wait state, the event flag value just before exiting from the wait state is returned when<br />
* exiting except when the wait release condition is satisfied (when SCE_KERNEL_ERROR_WAIT_CANCEL,<br />
* SCE_KERNEL_ERROR_WAIT_DELETE, SCE_KERNEL_ERROR_WAIT_TIMEOUT errors are returned).<br />
* When canceling with sceKernelCancelEventFlag(), the eventflag value set at the time of cancellation is returned.<br />
*<br />
* When pTimeout is specified, the timeout operation specified in microseconds is set.<br />
* If pTimeout is NULL, timeout operation is not performed.<br />
* Note that if pTimeout is specified, the value pointed to by pTimeout is updated when the system call ends.<br />
* If the condition is met within the time, it is updated with the remaining time. If not established,<br />
* the value pointed to by pTimeout is updated with 0. In this case, error SCE_KERNEL_ERROR_WAIT_TIMEOUT is returned.<br />
*<br />
* Another thread cannot execute sceKernelWaitEventFlag() and sceKernelPollEventFlag() for an event flag with<br />
* the SCE_KERNEL_EVF_ATTR_SINGLE attribute that already has a waiting thread.<br />
* In this case, an error is returned immediately to the thread that executed sceKernelWaitEventFlag() or sceKernelPollEventFlag() later.<br />
*<br />
* If multiple threads are waiting for an event flag with the SCE_KERNEL_EVF_ATTR_MULTI attribute, a thread queue is created.<br />
* In this case, a single sceKernelSetEventFlag() may release the waiting status of multiple threads.<br />
*<br />
* In the case of the event flag of the SCE_KERNEL_EVF_ATTR_TH_FIFO attribute, the thread queue is<br />
* arranged in the order in which it waits first.<br />
* In the event flag of the SCE_KERNEL_EVF_ATTR_TH_PRIO attribute, the thread with the highest<br />
* priority among the waiting threads starts first and is arranged in the order of thread priority.<br />
*<br />
* If there is a thread with SCE_KERNEL_EVF_WAITMODE_CLEAR_ALL specified or SCE_KERNEL_EVF_WAITMODE_CLEAR_PAT specified in the<br />
* queue and the wait release condition for that thread is satisfied, the event flag is cleared at the same time as the wait release.<br />
* Threads that are lined up behind the thread that has specified SCE_KERNEL_EVF_WAITMODE_CLEAR_ALL or SCE_KERNEL_EVF_WAITMODE_CLEAR_PAT<br />
* will see the event flag after being cleared, so the wait may not be released.<br />
*<br />
* @param evfId Specifies the identifier of the event flag to wait for.<br />
* @param bitPattern Specify the comparison value with the eventflag.<br />
* @param waitMode Specifies the wait mode. Specify one of the following:<br />
* - SCE_KERNEL_EVF_WAITMODE_AND: Waiting for AND<br />
* - SCE_KERNEL_EVF_WAITMODE_OR : Wait for OR<br />
* In addition, you can optionally add either of the following specifications as a logical sum.<br />
* - SCE_KERNEL_EVF_WAITMODE_CLEAR_ALL: After waiting, clear all bits<br />
* - SCE_KERNEL_EVF_WAITMODE_CLEAR_PAT: After waiting, clear the bit specified in bitPattern<br />
* @param pResultPat Specifies a pointer to the SceUInt32 type variable that receives the eventflag value when waiting is established.<br />
* If NULL is specified, the event flag value is not received.<br />
* @param pTimeout Specify a pointer to the SceUInt32 type variable that stores the upper limit (microseconds) of the waiting time.<br />
* If NULL is specified, wait indefinitely. When the wait condition is satisfied, the remaining time is returned.<br />
* @retval SCE_OK Success<br />
* @retval (<0) Error code<br />
*/<br />
SceInt32 sceKernelWaitEventFlagForDriver(SceUID evfId, SceUInt32 bitPattern, SceUInt32 waitMode, SceUInt32 *pResultPat, SceUInt32 *pTimeout);<br />
</source><br />
<br />
=== sceKernelWaitEventCBForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x360C655C<br />
|}<br />
<br />
=== sceKernelWaitEventForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xC529EA32<br />
|}<br />
<br />
<source lang="C">int sceKernelWaitEventForDriver(SceUID eventId, SceUInt32 waitPattern, SceUInt32 *pResultPattern, SceUInt64 *pUserData, SceUInt32 *pTimeout);</source><br />
<br />
=== sceKernelUnregisterThreadEventHandlerForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x2C8ED6F0<br />
|}<br />
<br />
=== sceKernelUnregisterCallbackFromEventAllForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x8DADBD16<br />
|}<br />
<br />
=== sceKernelUnregisterCallbackFromEventForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x2E48D81C<br />
|}<br />
<br />
=== sceKernelUnlockWriteRWLockForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x94A73797<br />
|}<br />
<br />
=== sceKernelUnlockReadRWLockForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xDE1B9EEE<br />
|}<br />
<br />
=== sceKernelTryLockWriteRWLockForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xA96F2E5A<br />
|}<br />
<br />
=== sceKernelTryLockReadRWLockForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xFC2B5A50<br />
|}<br />
<br />
=== sceKernelStopTimerForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x474F214B<br />
|}<br />
<br />
<source lang="C">int sceKernelStopTimerForDriver(SceUID timerId);</source><br />
<br />
=== sceKernelStartTimerForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x84C4CE4D<br />
|}<br />
<br />
<source lang="C">int sceKernelStartTimerForDriver(SceUID timerId);</source><br />
<br />
=== sceKernelSignalSemaForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xD270498B<br />
|}<br />
<br />
=== sceKernelSignalCondAllForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x6EC78CD0<br />
|}<br />
<br />
=== sceKernelSetTimerTimeWideForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x85195A16<br />
|}<br />
<br />
=== sceKernelSetEventFlagForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931 || in ForKernel<br />
|-<br />
| 3.60 || 0xD4780C3E<br />
|}<br />
<br />
=== sceKernelSetEventForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x9EA3A45C<br />
|}<br />
<br />
=== _sceKernelExtendKernelStackWideForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xE54FD746<br />
|}<br />
<br />
Temp name was sceKernelRunWithStackForDriver.<br />
<br />
This takes a function and runs it exclusively on the current core on its own stack.<br />
<br />
<source lang="c"><br />
// stack_size should be 0x2000<br />
int _sceKernelExtendKernelStackWideForDriver(int stack_size, void *func, void *args);<br />
</source><br />
<br />
=== sceKernelExtendKernelStackWideForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xA2C801A5<br />
|}<br />
<br />
Temp name was sceKernelRunWithStack2ForDriver.<br />
<br />
<source lang="c"><br />
// stack_size should be 0x2000<br />
SceInt64 sceKernelExtendKernelStackWideForDriver(int stack_size, void *func, void *args);<br />
</source><br />
<br />
=== sceKernelRegisterCallbackToEventForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x832A7E0C<br />
|}<br />
<br />
=== sceKernelPulseEventWithNotifyCallbackForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x714A107A<br />
|}<br />
<br />
=== sceKernelPulseEventForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x2427C81B<br />
|}<br />
<br />
=== sceKernelPollSemaForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x4FDDFE24<br />
|}<br />
<br />
=== sceKernelPollEventFlagForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x76C6555B<br />
|}<br />
<br />
<source lang="C"><br />
/**<br />
* @brief Event flag polling<br />
*<br />
* Polls the event flag specified by evfId.<br />
*<br />
* sceKernelPollEventFlag() is a system call that removes the function to enter standby state from sceKernelWaitEventFlag().<br />
* Unlike sceKernelWaitEventFlag(), an error (SCE_KERNEL_ERROR_EVF_COND) is returned immediately if the wait release condition is not satisfied.<br />
* In this case, SCE_KERNEL_EVF_WAITMODE_CLEAR_ALL / SCE_KERNEL_EVF_WAITMODE_CLEAR_PAT specification is ignored.<br />
*<br />
* @param evfId Specify the event flag identifier to be polled.<br />
* @param bitPattern Specify the comparison value with the eventflag.<br />
* @param waitMode Specify the wait mode. Specify one of the following:<br />
* - SCE_KERNEL_EVF_WAITMODE_AND: Waiting for AND<br />
* - SCE_KERNEL_EVF_WAITMODE_OR : Wait for OR<br />
* In addition, you can optionally add one of the following specifications as a logical sum.<br />
* - SCE_KERNEL_EVF_WAITMODE_CLEAR_ALL: Clear all bits after waiting<br />
* - SCE_KERNEL_EVF_WAITMODE_CLEAR_PAT: After waiting, clear the bit specified in bitPattern<br />
* @param pResultPat Specify a pointer to the SceUInt32 type variable that receives the eventflag value when waiting is established.<br />
* @retval SCE_OK Success<br />
* @retval (<0) Error code<br />
*/<br />
SceInt32 sceKernelPollEventFlagForDriver(SceUID evfId, SceUInt32 bitPattern, SceUInt32 waitMode, SceUInt32 *pResultPat);<br />
</source><br />
<br />
=== sceKernelNotifyCallbackForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xC3E00919<br />
|}<br />
<br />
=== sceKernelGetTimerTimeWideForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xC1286004<br />
|}<br />
<br />
<source lang="C">SceUInt64 sceKernelGetTimerTimeWideForDriver(SceUID timerId);</source><br />
<br />
=== sceKernelGetTimerBaseWideForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xA6D11DD3<br />
|}<br />
<br />
<source lang="C">SceUInt64 sceKernelGetTimerBaseWideForDriver(SceUID timerId);</source><br />
<br />
=== sceKernelGetThreadmgrUIDClassForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x0A20775A<br />
|}<br />
<br />
=== sceKernelGetThreadTLSAddrForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x66EEA46A<br />
|}<br />
<br />
=== sceKernelGetThreadStackFreeSizeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x7B278A0B<br />
|}<br />
<br />
=== sceKernelGetThreadCpuAffinityMaskForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x83DC703D<br />
|}<br />
<br />
=== sceKernelGetCallbackCountForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x0892D8DF<br />
|}<br />
<br />
=== sceKernelCreateWorkQueueForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x771522C6<br />
|}<br />
<br />
<source lang="C">SceUID sceKernelCreateWorkQueueForDriver(const char *name, SceUInt32 flags, const SceKernelCreateWorkQueueParam *opt);</source><br />
<br />
=== sceKernelScheduleWorkTaskForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xE50E1185<br />
|}<br />
<br />
<source lang="C">SceUID sceKernelScheduleWorkTaskForDriver(SceUID wqueue_id, const char *name, const void *wtask_func, void *argp);</source><br />
<br />
=== sceKernelGetWorkqueueCreateInfoForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xB92709C4<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">int sceKernelGetWorkqueueCreateInfo(SceUID wqueue_id, SceKernelWorkqueueCreateInfo *info);</source><br />
<br />
=== sceKernelGetWorktaskCreateInfoForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x0B604A3C<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">int sceKernelGetWorktaskCreateInfo(SceUID wtask_id, SceKernelWorktaskCreateInfo *info);</source><br />
<br />
=== sceKernelGetWorkqueueInfoVectorForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x920EA1CA<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">int sceKernelGetWorkqueueInfoVector(int vis_level, void *dst, SceSize dst_size, SceUInt32 *nInfo);</source><br />
<br />
=== sceKernelGetProcWorkqueueInfoVectorForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x8C8A76EF<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">int sceKernelGetProcWorkqueueInfoVector(SceUID pid, int vis_level, void *dst, SceSize dst_size, SceUInt32 *nInfo);</source><br />
<br />
=== sceKernelGetWorktaskInfoVectorForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xE605ED7A<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">int sceKernelGetWorktaskInfoVector(int vis_level, SceThreadmgrForDriver_E605ED7A_t *dst, SceSize dst_size, SceUInt32 *nInfo);</source><br />
<br />
=== sceKernelGetProcWorktaskInfoVectorForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xB4CED111<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">int sceKernelGetProcWorktaskInfoVector(SceUID pid, int vis_level, SceThreadmgrForDriver_E605ED7A_t *dst, SceSize dst_size, SceUInt32 *nInfo);</source><br />
<br />
=== sceKernelWaitWorktaskForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x12FC0FAB<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">int sceKernelWaitWorktask(SceUID wtask_id, SceInt32 *timeout);</source><br />
<br />
=== sceKernelWaitWorktask2ForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xB247EC4B<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
with user stack overflow detect?<br />
<br />
<source lang="C">int sceKernelWaitWorktask2(SceUID wtask_id, SceInt32 *timeout);</source><br />
<br />
=== sceKernelDeleteThreadForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0xAC834F3F<br />
|}<br />
<br />
<source lang="C"><br />
/**<br />
* @brief Delete thread<br />
*<br />
* Deletes the thread specified by threadId.<br />
*<br />
* Accordingly, the stack area and thread management area are released. The target thread must be in the DORMANT state.<br />
*<br />
* Since the own thread cannot be in the DORMANT state, it cannot be set as the target thread<br />
* (this results in an SCE_KERNEL_ERROR_NOT_DORMANT error).<br />
* Use sceKernelExitDeleteThread() to delete your own thread.<br />
*<br />
* @param threadId Specify the identifier of the thread to be deleted.<br />
* @retval SCE_OK Success<br />
* @retval Negative value Error code<br />
*/<br />
SceInt32 sceKernelDeleteThreadForDriver(<br />
SceUID threadId<br />
);<br />
</source><br />
<br />
=== sceKernelDeleteSemaForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x16A35E58<br />
|}<br />
<br />
=== sceKernelDeleteMutexForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x0A912340<br />
|}<br />
<br />
<source lang="C">int sceKernelDeleteMutexForDriver(SceUID mutexid);</source><br />
<br />
=== sceKernelCloseEventFlagForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x71ECB352<br />
|}<br />
<br />
Temp name was sceKernelDeleteEventFlagForDriver.<br />
<br />
=== sceKernelCreateThreadForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0xC6674E7D<br />
|}<br />
<br />
<source lang="C"><br />
/**<br />
* @brief Thread generation that operates in the address space of its own process<br />
*<br />
* A thread that operates in the address space of its own process is created.<br />
*<br />
* Allocate a thread management area for the thread to be created, perform initialization, and secure a stack area.<br />
* The thread information to be created is specified as an argument, and the thread identifier (UID) is returned as the return value.<br />
*<br />
* The generated thread is in the DORMANT state.<br />
*<br />
* @param pName Specifies the name of the thread.<br />
* The name of the thread does not have to be unique because it is<br />
* used by the operator to identify it when debugging. The maximum name length is 31 bytes.<br />
* @param entry Specify the entry address of the thread. The thread entry point function<br />
* can receive memory block data with two arguments.<br />
* The argument is given by sceKernelStartThread() described later.<br />
* The thread is terminated by returning from this function, and the return value of the function is the thread termination status.<br />
* @param initPriority Specifies the initial priority of the thread. The smaller the number, the higher the priority.<br />
* The range from SCE_KERNEL_HIGHEST_PRIORITY_USER (= 64) to SCE_KERNEL_LOWEST_PRIORITY_USER (= 191) can be used.<br />
* By specifying SCE_KERNEL_DEFAULT_PRIORITY_USER, you can specify the default priority of the process to which the thread belongs.<br />
* For the default priority, it is also possible to specify with SCE_KERNEL_DEFAULT_PRIORITY_USER ± offset.<br />
* @param stackSize Specify the required stack size of the thread in bytes. The argument block given by<br />
* sceKernelStartThread () is copied onto the stack, so specify the stack size with this margin in mind.<br />
* An error will occur if a stack size less than 4 KiB is specified.<br />
* @param attr You can specify multiple thread attributes by logical OR.<br />
* @param cpuAffinityMask Specifies the initial CPU affinity mask for the thread.<br />
* A thread can run only on the thread specified in the CPU affinity mask.<br />
* The CPU affinity mask can be specified by the logical sum of the following macros.<br />
* - SCE_KERNEL_CPU_MASK_USER_0<br />
* - SCE_KERNEL_CPU_MASK_USER_1<br />
* - SCE_KERNEL_CPU_MASK_USER_2<br />
* The following macros are also available to represent all available CPUs.<br />
* - SCE_KERNEL_CPU_MASK_USER_ALL<br />
* @param pOptParam Argument for future expansion. Please specify NULL. Max size is 0x14.<br />
* @retval Positive value Thread identifier (UID)<br />
* @retval Negative value Error code<br />
*/<br />
SceUID sceKernelCreateThreadForDriver(<br />
const char *pName,<br />
SceKernelThreadEntry entry,<br />
SceInt32 initPriority,<br />
SceSize stackSize,<br />
SceUInt32 attr,<br />
SceInt32 cpuAffinityMask,<br />
const SceKernelThreadOptParam *pOptParam<br />
);<br />
</source><br />
<br />
=== sceKernelCreateSimpleEventForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x357A8177<br />
|}<br />
<br />
=== sceKernelCreateMutexForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xFBAA026E<br />
|}<br />
<br />
<source lang="C">SceUID sceKernelCreateMutexForDriver(const char *pName, SceUInt attr, int initCount, const SceKernelMutexOptParam *pOptParam);</source><br />
<br />
=== sceKernelCreateEventFlagForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x4336BAA4<br />
|}<br />
<br />
<source lang="C"><br />
/**<br />
* @brief Event flag generation<br />
*<br />
* Generate an event flag and set the initial value of the event flag. Returns the identifier of the generated event flag as a return value.<br />
*<br />
* @param pName Specifies the name of the eventflag.<br />
* The name of the eventflag does not need to be unique because it is used only for the purpose of operator<br />
* identification when debugging without interprocess communication.<br />
* However, if the SCE_KERNEL_ATTR_OPENABLE attribute is specified for attr,<br />
* a unique name must be specified in the system.<br />
* The maximum name length is 31 bytes.<br />
* @param attr Specifies the event flag attribute.<br />
* Specify the queue order from one of the following.<br />
* - SCE_KERNEL_EVF_ATTR_TH_FIFO: Waiting thread queuing is FIFO<br />
* - SCE_KERNEL_EVF_ATTR_TH_PRIO: Waiting thread queuing is based on the priority of threads.<br />
* Specify whether to wait for multiple threads from either of the following.<br />
* - SCE_KERNEL_EVF_ATTR_SINGLE: Multiple threads cannot wait simultaneously<br />
* - SCE_KERNEL_EVF_ATTR_MULTI: To generate an event flag that can be referenced by<br />
* sceKernelOpenEventFlag() that allows multiple threads to wait simultaneously, specify the following:<br />
* - SCE_KERNEL_ATTR_OPENABLE<br />
* @param initPattern Specifies the initial value of the eventflag.<br />
* @param pOptParam Argument for future expansion. Please specify NULL.<br />
* @retval (>=0) Event flag identifier (UID)<br />
* @retval (<0) Error code<br />
*/<br />
SceUID sceKernelCreateEventFlagForDriver(const char *pName, SceUInt32 attr, SceUInt32 initPattern, const SceKernelEventFlagOptParam *pOptParam);<br />
</source><br />
<br />
=== sceKernelClearEventFlagForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x4F1DA3BE<br />
|}<br />
<br />
=== sceKernelClearEventForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x9C335818<br />
|}<br />
<br />
<source lang="C">int sceKernelClearEventForDriver(SceUID eventId,SceUInt32 clearPattern);</source><br />
<br />
=== sceKernelChangeThreadPriority2ForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x63DAB420<br />
|}<br />
<br />
Temp name was sceKernelChangeThreadPriorityForDriver.<br />
<br />
=== sceKernelCancelCallbackForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xC040EC1C<br />
|}<br />
<br />
=== sceKernelCancelMsgPipeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x9D6A2311<br />
|}<br />
<br />
=== sceKernelCreateMsgPipeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xBF631145<br />
|}<br />
<br />
=== sceKernelDeleteMsgPipeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xB3453F88<br />
|}<br />
<br />
=== sceKernelSendMsgPipeVectorForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x67DD3BAD<br />
|}<br />
<br />
=== sceKernelTryReceiveMsgPipeVectorForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xCE09221A<br />
|}<br />
<br />
=== sceKernelTrySendMsgPipeVectorForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x4CF1BE58<br />
|}<br />
<br />
=== sceKernelIsThreadDebugSuspendedForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xA0B1AB21<br />
|}<br />
<br />
Used by SceCoredump maybe to get the state at the time of process crash.<br />
<br />
<source lang="C"><br />
/**<br />
* @param[in] thid thread id (kernel uid)<br />
* @return suspend state, else < 0 on error.<br />
*/<br />
int sceKernelIsThreadDebugSuspendedForDriver(SceUID thid);<br />
</source><br />
<br />
=== sceKernelDebugResumeThreadForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xEC8343DF<br />
|}<br />
<br />
=== sceKernelResumeThreadForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xE3CE20AA<br />
|}<br />
<br />
=== sceKernelCreateRemoteThreadForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990-3.65 || 0xC8E57BB4<br />
|}<br />
<br />
Some value are allowed if Thread name is "ScePsp2SwuCui".<br />
<br />
<source lang="C"><br />
/**<br />
* @brief Thread generation that does not operate in the address space of its own process<br />
*<br />
* A thread that does not operate in the address space of its own process is created.<br />
*<br />
* Allocate a thread management area for the thread to be created, perform initialization, and secure a stack area.<br />
* The thread information to be created is specified as an argument, and the thread identifier (UID) is returned as the return value.<br />
*<br />
* The generated thread is in the DORMANT state.<br />
*<br />
* @param pid Specifies the ID of the process the thread belongs to.<br />
* @param pName Specifies the name of the thread.<br />
* The name of the thread does not have to be unique because it is<br />
* used by the operator to identify it when debugging. The maximum name length is 31 bytes.<br />
* @param entry Specify the entry address of the thread. The thread entry point function<br />
* can receive memory block data with two arguments.<br />
* The argument is given by sceKernelStartThread() described later.<br />
* The thread is terminated by returning from this function, and the return value of the function is the thread termination status.<br />
* @param initPriority Specifies the initial priority of the thread. The smaller the number, the higher the priority.<br />
* The range from SCE_KERNEL_HIGHEST_PRIORITY_USER (= 64) to SCE_KERNEL_LOWEST_PRIORITY_USER (= 191) can be used.<br />
* By specifying SCE_KERNEL_DEFAULT_PRIORITY_USER, you can specify the default priority of the process to which the thread belongs.<br />
* For the default priority, it is also possible to specify with SCE_KERNEL_DEFAULT_PRIORITY_USER ± offset.<br />
* @param stackSize Specify the required stack size of the thread in bytes. The argument block given by<br />
* sceKernelStartThread () is copied onto the stack, so specify the stack size with this margin in mind.<br />
* An error will occur if a stack size less than 4 KiB is specified.<br />
* @param attr You can specify multiple thread attributes by logical OR.<br />
* @param cpuAffinityMask Specifies the initial CPU affinity mask for the thread.<br />
* A thread can run only on the thread specified in the CPU affinity mask.<br />
* The CPU affinity mask can be specified by the logical sum of the following macros.<br />
* - SCE_KERNEL_CPU_MASK_USER_0<br />
* - SCE_KERNEL_CPU_MASK_USER_1<br />
* - SCE_KERNEL_CPU_MASK_USER_2<br />
* The following macros are also available to represent all available CPUs.<br />
* - SCE_KERNEL_CPU_MASK_USER_ALL<br />
* @param pOptParam Argument for future expansion. Please specify NULL. Max size is 0x14.<br />
* @retval Positive value Thread identifier (UID)<br />
* @retval Negative value Error code<br />
*/<br />
SceUID sceKernelCreateRemoteThreadForDriver(<br />
SceUID pid,<br />
const char *pName,<br />
SceKernelThreadEntry entry,<br />
SceInt32 initPriority,<br />
SceSize stackSize,<br />
SceUInt32 attr,<br />
SceInt32 cpuAffinityMask,<br />
const SceKernelThreadOptParam *pOptParam<br />
);<br />
</source><br />
<br />
=== sceKernelGetThreadIdListForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xEA7B8AEF<br />
|}<br />
<br />
This function is used to query and obtain the number of threads within a process.<br />
<br />
<source lang="C"><br />
/**<br />
* @brief Retrieve a list of all threads belonging to a process.<br />
* @param[in] pid The process to query.<br />
* @param[out] ids The list of thread IDs. Can be NULL if output is not required.<br />
* @param[in] n The max number of thread IDs to copy out.<br />
* @param[out] copy_count The number of thread IDs copied.<br />
* @return The number of threads within the process, else < 0 on error.<br />
*/<br />
int sceKernelGetThreadIdListForDriver(SceUID pid, SceUID *ids, int n, int *copy_count);<br />
</source><br />
<br />
=== sceKernelGetThreadCpuRegistersForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x5022689D<br />
|}<br />
<br />
This function is used to get the state of the registers for a SUSPENDED thread. It returns the registers in a two part structure. It is uncertain what the difference is between the two parts. It seems like it is a usermode/kernel separation. It could also be a current/exception difference. In normal usage on a suspended thread it seems to be the usermode aspect that contains valid values. When you query a suspended thread that has no had the opportunity to start yet, the kernel side is filled.<br />
<br />
<source lang="C"><br />
/** Structure representing all ARM registers */<br />
typedef struct ArmCpuRegisters {<br />
uint32_t r0;<br />
uint32_t r1;<br />
uint32_t r2;<br />
uint32_t r3;<br />
uint32_t r4;<br />
uint32_t r5;<br />
uint32_t r6;<br />
uint32_t r7;<br />
uint32_t r8;<br />
uint32_t r9;<br />
uint32_t r10;<br />
uint32_t r11;<br />
uint32_t r12;<br />
uint32_t sp;<br />
uint32_t lr;<br />
uint32_t pc;<br />
uint32_t cpsr;<br />
uint32_t fpscr;<br />
} ArmCpuRegisters;<br />
<br />
/** Structure containing a threads register states. */<br />
typedef struct ThreadCpuRegisters {<br />
ArmCpuRegisters entry[2];<br />
} ThreadCpuRegisters;<br />
<br />
/**<br />
* @brief Query the state of the registers for a suspended thread.<br />
*<br />
* The registers returned are the usermode/kernel set for the requested thread.<br />
* It is uncertain if usermode/kernel is correct representation and instead it could be current/exception.<br />
* The thread provided must be suspended for this function to succeed.<br />
*<br />
* @param[in] thid The thread to query.<br />
* @param[out] registers The set of registers belonging to the thread.<br />
* @return Zero on success, else < 0 on error.<br />
*/<br />
int sceKernelGetThreadCpuRegistersForDriver(SceUID thid, ThreadCpuRegisters *registers);<br />
</source><br />
<br />
=== sceKernelChangeThreadSuspendStatusForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x04C6764B<br />
|}<br />
<br />
This function allows you to change the status of a suspended thread. Most of the valid suspend bits are unknown, but some can be used to prevent the kernel rethrowing exceptions or pull threads into the running/ready state.<br />
<br />
<source lang="C"><br />
/**<br />
* @brief Change the thread suspension status to another value.<br />
*<br />
* More research needs to be done to find out exactly what each status actually means. Some examples of useful scenarios:<br />
* When handling an exception changing the status to 0x1002 (on a newly suspended thread) will stop the kernel rethrowing the same exception.<br />
* When resuming a suspended thread changing the status to 2 will allow it to resume.<br />
*<br />
* @param[in] thid The thread to change.<br />
* @param[in] status The new status for suspension.<br />
* @return Zero on success, else < 0 on error.<br />
*/<br />
int sceKernelChangeThreadSuspendStatusForDriver(SceUID thid, int status);<br />
</source><br />
<br />
=== sceKernelChangeActiveCpuMaskForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x001173F8<br />
|}<br />
<br />
=== sceKernelGetThreadCurrentPriorityForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x01414F0B<br />
|}<br />
<br />
=== sceKernelCreateCallbackForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x1C41614C<br />
|}<br />
<br />
=== sceKernelWaitThreadEndCB_089ForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x0373C5E3<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
=== sceKernelDeleteCallbackForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x3A7E17F6<br />
|}<br />
<br />
=== sceKernelExitThreadForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x0C8A38E1<br />
|}<br />
<br />
<source lang="C"><br />
/**<br />
* @brief End of own thread<br />
*<br />
* Terminates the own thread normally and shifts to the DORMANT state.<br />
* sceKernelExitThread() is a system call that does not return to the context of the issuer.<br />
*<br />
* Resources (memory, semaphores, etc.) acquired by the terminating thread are not automatically released.<br />
* However, for mutexes only, mutexes that have been locked by the terminating thread are automatically unlocked.<br />
* The mutex is unlocked and not deleted.<br />
*<br />
* When the terminated thread is restarted with sceKernelStartThread(), the information included in the thread<br />
* management area, such as thread priority, is reset.<br />
* It will not inherit the one at the end.<br />
*<br />
* When a thread exits, exitStatus becomes the exit status of that thread.<br />
*<br />
* If the thread is terminated by a return from the entry function without using<br />
* sceKernelExitThread(), the return value of the entry function becomes the termination status.<br />
*<br />
* The end status of a thread can be obtained by sceKernelGetThreadExitStatus() and sceKernelGetThreadInfo(),<br />
* and when another thread waits for the end of the thread by sceKernelWaitThreadEnd(), it can be obtained by the return value.<br />
*<br />
* The thread exit status is saved while the thread exits and is in the DORMANT state,<br />
* but the value is lost if the thread is restarted or deleted with sceKernelStartThread().<br />
*<br />
* @param exitStatus Specify the value to be set for the termination status of the local thread.<br />
* @retval Negative value Error code<br />
*/<br />
SceInt32 sceKernelExitThreadForDriver(<br />
SceInt32 exitStatus<br />
);<br />
</source><br />
<br />
=== sceKernelLockMutex_089ForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x16AC80C5<br />
|}<br />
<br />
<source lang="C">int sceKernelLockMutex_089ForDriver(SceUID mutex_id, int unk1, int unk2);</source><br />
<br />
=== sceKernelExitDeleteThreadForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x1D17DECF<br />
|}<br />
<br />
<source lang="C"><br />
/**<br />
* @brief End and delete own thread<br />
*<br />
* Terminates the own thread normally and deletes it.<br />
* sceKernelExitDeleteThread() is a system call that does not return to the context of the issuer.<br />
*<br />
* Resources (memory, semaphores, etc.) acquired by the terminating thread are not automatically released.<br />
* However, for mutexes only, mutexes that have been locked by the terminating thread are automatically unlocked.<br />
* The mutex is unlocked and not deleted.<br />
*<br />
* When a thread exits, exitStatus becomes the exit status of that thread (sceKernelExitDeleteThread()<br />
* directly deletes the thread without going through the DORMANT state.<br />
* (It cannot be obtained by sceKernelGetThreadInfo(). The end status can be obtained by the return<br />
* value only when waiting for the end of the thread by sceKernelWaitThreadEnd().)<br />
*<br />
* @param exitStatus Specify the value to be set for the termination status of the local thread.<br />
* @retval Negative value Error code<br />
*/<br />
SceInt32 sceKernelExitDeleteThreadForDriver(<br />
SceInt32 exitStatus<br />
);<br />
</source><br />
<br />
=== sceKernelUnlockMutex_089ForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x1E82E5D0<br />
|}<br />
<br />
<source lang="C">int sceKernelUnlockMutex_089ForDriver(SceUID mutex_id, int unk1);</source><br />
<br />
=== sceKernelStartThread_089ForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x21F5419B<br />
|}<br />
<br />
<source lang="C"><br />
/**<br />
* @brief Thread activation<br />
*<br />
* Starts the thread specified by threadId and puts it in READY state.<br />
*<br />
* The argument block specified by argSize and argBlock is copied onto the thread stack, argSize is<br />
* passed directly to the first argument of the thread entry function, and the second argument of<br />
* the entry function is the argument copied onto the stack. The block address is passed.<br />
*<br />
* This system call does not queue activation requests. In other words, if the target thread is not<br />
* in the DORMANT state, an SCE_KERNEL_ERROR_NOT_DORMANT error is returned to the calling thread.<br />
*<br />
* @param threadId Specify the identifier of the thread to be started.<br />
* @param argSize Specify the size (byte) of the argument to be passed to the thread.<br />
* @param pArgBlock Specify the address of the argument to be passed to the thread.<br />
* @retval SCE_OK Success<br />
* @retval Negative value Error code<br />
*/<br />
SceInt32 sceKernelStartThread_089ForDriver(<br />
SceUID threadId,<br />
SceSize argSize,<br />
const void *pArgBlock<br />
);<br />
</source><br />
<br />
=== sceKernelTryLockMutex_089ForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x270993A6<br />
|}<br />
<br />
=== sceKernelGetSystemTimeLowForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x47F6DE49<br />
|}<br />
<br />
=== sceKernelDelayThreadForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x4B675D05<br />
|}<br />
<br />
=== sceKernelGetMutexInfo_089ForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x69B78A12<br />
|}<br />
<br />
<source lang="C">int sceKernelGetMutexInfo_089ForDriver(SceUID mutexid, SceKernelMutexInfo *info);</source><br />
<br />
=== sceKernelCancelMutex_089ForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x7204B846<br />
|}<br />
<br />
=== sceKernelChangeCurrentThreadAttrForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x751C9B7A<br />
|}<br />
<br />
=== sceKernelDelayThreadCBForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x9C0180E1<br />
|}<br />
<br />
=== sceKernelLockMutexCB_089ForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0xD06F2886<br />
|}<br />
<br />
=== sceKernelCheckWaitableStatusForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0xD9BD74EB<br />
|}<br />
<br />
=== sceKernelCheckCallbackForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0xE53E41F6<br />
|}<br />
<br />
=== sceKernelWaitThreadEnd_089ForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xF3489EF4<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
=== sceKernelGetSystemTimeWideForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0xF4EE4FA9<br />
|}<br />
<br />
=== sceKernelGetThreadInfoForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x283807E2<br />
|}<br />
<br />
<source lang="c"> int sceKernelGetThreadInfoForDriver(SceUID thid, SceKernelThreadInfo *info)</source><br />
<br />
=== sceKernelInitializeFastMutexForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xAF8E1266<br />
|}<br />
<br />
<source lang="c">int sceKernelInitializeFastMutexForDriver(void* mutex, const char* name, uint32_t attr, int unk)</source><br />
<br />
=== sceKernelLockFastMutexForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x70627F3A<br />
|}<br />
<br />
<source lang="c"> int sceKernelLockFastMutexForDriver(void* mutex)</source><br />
<br />
=== sceKernelUnlockFastMutexForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0xDB395782<br />
|}<br />
<br />
<source lang="c"> int sceKernelUnlockFastMutexForDriver(void* mutex)</source><br />
<br />
=== sceKernelFinalizeFastMutexForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x11FE84A1<br />
|}<br />
<br />
Temp name was sceKernelDeleteFastMutexForDriver.<br />
<br />
<source lang="c"> int sceKernelFinalizeFastMutexForDriver(void* mutex)</source><br />
<br />
=== sceKernelSignalCondToForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x61533DA9<br />
|}<br />
<br />
<source lang="c"> int sceKernelSignalCondToForDriver(SceUID condId, SceUID threadId)</source><br />
<br />
=== sceKernelCreateCondForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0xDB6CD34A<br />
|}<br />
<br />
<source lang="c"> SceUID sceKernelCreateCondForDriver(const char *name, SceUInt attr, SceUID mutexId, const SceKernelCondOptParam *option)</source><br />
<br />
=== sceKernelWaitCondForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0xCC7E027D<br />
|}<br />
<br />
<source lang="c"> int sceKernelWaitCondForDriver(SceUID condId, unsigned int *timeout)</source><br />
<br />
=== sceKernelReceiveMsgPipeVectorForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0xDA1F256B<br />
|}<br />
<br />
=== sceKernelReceiveMsgPipeVectorCBForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0xDA5C9AC6<br />
|}<br />
<br />
=== sceKernelGetThreadIdForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x59D06540<br />
|}<br />
<br />
<source lang="c"> SceUID sceKernelGetThreadIdForDriver(void);</source><br />
<br />
=== sceKernelDeleteCondForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0xAEE0D27C<br />
|}<br />
<br />
<source lang="c"> int sceKernelDeleteCondForDriver(SceUID cid);</source><br />
<br />
=== sceKernelCreateSemaForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x30E93C31<br />
|}<br />
<br />
<source lang="C"><br />
/**<br />
* Creates a new semaphore<br />
*<br />
* @par Example:<br />
* @code<br />
* int semaid;<br />
* semaid = sceKernelCreateSemaForDriver("MySema", 0, 1, 1, 0);<br />
* @endcode<br />
*<br />
* @param name - Specifies the name of the sema<br />
* @param attr - Sema attribute flags (normally set to 0)<br />
* @param initVal - Sema initial value<br />
* @param maxVal - Sema maximum value<br />
* @param option - Sema options (normally set to 0)<br />
* @return A semaphore id<br />
*/<br />
SceUID sceKernelCreateSemaForDriver(const char *name, SceUInt attr, int initVal, int maxVal, SceKernelSemaOptParam *option);<br />
</source><br />
<br />
=== sceKernelWaitSemaCBForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0xF55E4D86<br />
|}<br />
<br />
<source lang="C"><br />
/**<br />
* Lock a semaphore<br />
*<br />
* @par Example:<br />
* @code<br />
* sceKernelWaitSemaCBForDriver(sema_id, 1, 0);<br />
* @endcode<br />
*<br />
* @param sema_id - The sema id returned from ::sceKernelCreateSemaForDriver<br />
* @param signal - The value to wait for (i.e. if 1 then wait till reaches a signal state of 1)<br />
* @param timeout - Timeout in microseconds (assumed).<br />
*<br />
* @return < 0 on error.<br />
*/<br />
int sceKernelWaitSemaCBForDriver(SceUID sema_id, int signal, SceUInt *timeout);<br />
</source><br />
<br />
=== sceKernelWaitSemaForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x3C8B55A9<br />
|}<br />
<br />
<source lang="C"><br />
/**<br />
* Lock a semaphore<br />
*<br />
* @par Example:<br />
* @code<br />
* sceKernelWaitSemaForDriver(sema_id, 1, 0);<br />
* @endcode<br />
*<br />
* @param sema_id - The sema id returned from ::sceKernelCreateSemaForDriver<br />
* @param signal - The value to wait for (i.e. if 1 then wait till reaches a signal state of 1)<br />
* @param timeout - Timeout in microseconds (assumed).<br />
*<br />
* @return < 0 on error.<br />
*/<br />
int sceKernelWaitSemaForDriver(SceUID sema_id, int signal, SceUInt *timeout);<br />
</source><br />
<br />
=== sceKernelSignalCondForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0xAC616150<br />
|}<br />
<br />
<source lang="C">int sceKernelSignalCondForDriver(SceUID condId);</source><br />
<br />
=== sceKernelChangeThreadCpuAffinityMaskForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x6D0733A8<br />
|}<br />
<br />
<source lang="C"><br />
/**<br />
* @brief Thread CPU affinity mask setting<br />
*<br />
* Change the CPU affinity mask of the thread specified by threadId to cpuAffinityMask.<br />
* A thread can run only on the CPU specified by the CPU affinity mask.<br />
*<br />
* If the CPU affinity mask of a running thread is changed and cannot be executed on the current CPU, the thread is dispatched immediately.<br />
* As a result of scheduling, if a higher priority thread is running on the newly executable CPU, it is made to wait in the READY state.<br />
*<br />
* However, if the dispatch is disabled, the CPU affinity mask is changed immediately,<br />
* but the rescheduling process is delayed until dispatch is permitted.<br />
*<br />
* @param threadId Specify the identifier of the thread whose CPU affinity mask is to be changed.<br />
* You can specify your own thread with SCE_KERNEL_THREAD_ID_SELF.<br />
* @param cpuAffinityMask Specify the CPU affinity mask after the change.<br />
* The CPU affinity mask is expressed by the logical OR of the following macros.<br />
* - SCE_KERNEL_CPU_MASK_USER_0<br />
* - SCE_KERNEL_CPU_MASK_USER_1<br />
* - SCE_KERNEL_CPU_MASK_USER_2<br />
* The following macros are also available to specify all available CPUs.<br />
* - SCE_KERNEL_CPU_MASK_USER_ALL<br />
* @retval Positive value CPU affinity mask before change<br />
* @retval Negative value Error code<br />
*/<br />
SceInt32 sceKernelChangeThreadCpuAffinityMaskForDriver(<br />
SceUID threadId,<br />
SceInt32 cpuAffinityMask<br />
);<br />
</source><br />
<br />
=== sceKernelSetThreadAccessLevelForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.65 || 0x02EEDF17<br />
|}<br />
<br />
Temp name was sceKernelSetPermissionForDriver.<br />
<br />
<source lang="C"><br />
// return value is previous value<br />
int sceKernelSetThreadAccessLevelForDriver(int value);<br />
</source><br />
<br />
=== sceKernelGetProcessIdForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x9DCB4B7A<br />
|}<br />
<br />
Returns the process ID.<br />
<br />
<source lang="C">SceUID sceKernelGetProcessIdForDriver(void);</source><br />
<br />
=== sceKernelSetImpersonateIdForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x0486F239<br />
|}<br />
<br />
This is a guessed name. Temp name was sceKernelSetProcessIdToTLSForDriver.<br />
<br />
Sets impersonation ID for the current thread.<br />
<br />
Impersonation ID is used for access checks in e.g. [[SceIofilemgr]].<br />
<br />
<source lang="C"><br />
// Returns the previous impersonation ID<br />
ScePID sceKernelSetImpersonateIdForDriver(ScePID pid);<br />
</source><br />
<br />
=== sceKernelGetImpersonateIdForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0xFA54D49A<br />
|}<br />
<br />
This is a guessed name. Temp name was sceKernelGetProcessIdFromTLSForDriver.<br />
<br />
Returns the current thread's impersonation ID.<br />
<br />
Used by [[SceIofilemgr]], which calls the returned value <code>impersonateId</code>.<br />
<br />
<source lang="C"><br />
ScePID sceKernelGetImpersonateIdForDriver(void);<br />
</source><br />
<br />
=== sceKernelRegisterTimerForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990 || also in ForKernel<br />
|-<br />
| 3.60 || 0xC58DF384<br />
|}<br />
<br />
// seen: unk = 0, 2 so maybe UDCD bus<br />
<br />
<source lang="C">int sceKernelRegisterTimerForDriver(char *name, SceUInt32 time, void *function, int unk);</source><br />
<br />
=== sceKernelRegisterTimerWithOptForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990 || also in ForKernel<br />
|-<br />
| 0.990-3.60 || 0x10517330<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C"><br />
typedef struct SceKernelRegisterTimerOpt {<br />
SceUInt32 time;<br />
char *log_buffer_start;<br />
} SceKernelRegisterTimerOpt;<br />
<br />
int sceKernelRegisterTimerWithOptForDriver(char *name, SceKernelRegisterTimerOpt *pOpt, void *function, int unk);<br />
</source><br />
<br />
=== sceKernelCreateRWLockForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x04150799<br />
|}<br />
<br />
=== sceKernelCreateTimerForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x90656C98<br />
|}<br />
<br />
<source lang="C">SceUID sceKernelCreateTimerForDriver(const char *name, int attr, void *pOpt);</source><br />
<br />
=== sceKernelDelayThreadUnkCBForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x2B60B793<br />
|}<br />
<br />
=== sceKernelDelayThreadUnkForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xE9A99C50 <br />
|}<br />
<br />
<source lang="C">int sceKernelDelayThreadUnkForDriver(SceUInt32 nsec, SceUInt32 *some_time);</source><br />
<br />
=== sceKernelGetTHBPForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x453B764A<br />
|}<br />
<br />
Used by [[SceDeci4pSDbgp]].<br />
<br />
Get <b>t</b>hread <b>h</b>ardware <b>b</b>reak <b>p</b>oint.<br />
<br />
<source lang="C">int sceKernelGetTHBPForDriver(SceUID thid, SceUInt32 a2, int *a3, int *a4);</source><br />
<br />
=== sceKernelSetTHBPForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x385831A1<br />
|}<br />
<br />
<source lang="C">int sceKernelSetTHBPForDriver(SceUID pid, SceUInt32 a2, int a3, int a4);</source><br />
<br />
=== SceThreadmgrForDriver_86DAE59B ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x86DAE59B<br />
|}<br />
<br />
A guessed name is sceKernelGetAllowedCpuAffinityMaskForDriver.<br />
<br />
Get global CPU affinity mask.<br />
<br />
<source lang="C">int SceThreadmgrForDriver_86DAE59B(void);</source><br />
<br />
=== sceKernelCancelAlarmForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x44CCF310<br />
|}<br />
<br />
Used in [[SceCtrl]], [[SceTouch]].<br />
<br />
<source lang="C">int sceKernelCancelAlarmForDriver(SceUID uid_or_pid);</source><br />
<br />
=== sceKernelDebugSuspendThreadForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xFB3706CB<br />
|}<br />
<br />
<source lang="C">int sceKernelDebugSuspendThreadForDriver(SceUID threadId, SceUInt32 status);</source><br />
<br />
=== sceKernelGetEventFlagInfoForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x612277C9<br />
|}<br />
<br />
<source lang="C">int sceKernelGetEventFlagInfoForDriver(SceUID uid, SceKernelEventFlagInfo *pInfo);</source><br />
<br />
=== sceKernelGetThreadInfoForDebuggerForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xDD8D9429<br />
|}<br />
<br />
This is a guessed name. Old name was sceKernelGetThreadInfoInternalForDriver.<br />
<br />
<source lang="C">int sceKernelGetThreadInfoForDebuggerForDriver(SceUID thid, int a2, SceKernelThreadInfoInternal *pInfo);</source><br />
<br />
=== sceKernelGetVfpRegisterForDebuggerForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x5CDE387A<br />
|}<br />
<br />
Temp name was sceKernelGetThreadFloatRegisterForDriver.<br />
<br />
<source lang="C">int sceKernelGetVfpRegisterForDebuggerForDriver(SceUID thid, SceKernelThreadFloatRegister *pRegister);</source><br />
<br />
=== sceKernelGetUserThreadIdForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xF311808F<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">SceUID sceKernelGetUserThreadIdForDriver(SceUID thid_kern);</source><br />
<br />
=== sceKernelGetSemaInfoForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xC99DCF0D<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">int sceKernelGetSemaInfoForDriver(SceUID semaid, SceKernelSemaInfo *info);</source><br />
<br />
=== sceKernelGetEventFlagInfoForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x612277C9<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">int sceKernelGetEventFlagInfoForDriver(SceUID evfid, SceKernelEventFlagInfo *info);</source><br />
<br />
=== sceKernelGetLwMutexInfoForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x15287EF6<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">int sceKernelGetLwMutexInfoForDriver(SceUID lwmtxid, SceKernelLwMutexInfo *info);</source><br />
<br />
=== sceKernelGetMsgPipeInfoForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x207E0E18<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">int sceKernelGetMsgPipeInfoForDriver(SceUID msgpipe_id, SceKernelMsgPipeInfo *info);</source><br />
<br />
=== sceKernelGetLwCondInfoForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xC2AFFBD0<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">int sceKernelGetLwCondInfoForDriver(SceUID lwcond_id, SceKernelLwCondInfo *info);</source><br />
<br />
=== sceKernelGetThreadExitStatusForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x70131EA5<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">int sceKernelGetThreadExitStatusForDriver(SceUID thid, SceInt32 *status);</source><br />
<br />
=== SceThreadmgrForDriver_032E8F73 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x032E8F73<br />
|}<br />
<br />
=== sceKernelGetLwMutexInfoAllProcForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x069D8A20<br />
|}<br />
<br />
=== SceThreadmgrForDriver_09346D1A ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x09346D1A<br />
|}<br />
<br />
=== SceThreadmgrForDriver_0A4AD37A ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x0A4AD37A<br />
|}<br />
<br />
=== sceKernelGetEventPatternForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x0C6BCB8C<br />
|}<br />
<br />
=== SceThreadmgrForDriver_0D0644DA ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x0D0644DA<br />
|}<br />
<br />
=== SceThreadmgrForDriver_0EB0ABF0 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x0EB0ABF0<br />
|}<br />
<br />
=== SceThreadmgrForDriver_1096042E ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x1096042E<br />
|}<br />
<br />
=== SceThreadmgrForDriver_1378F6EF ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x1378F6EF<br />
|}<br />
<br />
=== sceKernelGetCurrentThreadVfpExceptionForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x14F8167C<br />
|}<br />
<br />
=== SceThreadmgrForDriver_154F2C2A_waitWorkQueue ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x154F2C2A<br />
|}<br />
<br />
=== sceKernelGetTimerInfoForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x19F3E92A<br />
|}<br />
<br />
<source lang="C">int sceKernelGetTimerInfoForDriver(SceUID timerId, void *pInfo);</source><br />
<br />
=== SceThreadmgrForDriver_20C228E4 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x20C228E4<br />
|}<br />
<br />
=== sceKernelGetMutexInfoAllProcForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x2322A2F3<br />
|}<br />
<br />
=== SceThreadmgrForDriver_25AB8F6B ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x25AB8F6B<br />
|}<br />
<br />
=== SceThreadmgrForDriver_2828F884 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x2828F884<br />
|}<br />
<br />
=== sceKernelDeleteSimpleEventForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x2BDE3B40<br />
|}<br />
<br />
=== SceThreadmgrForDriver_2E95B628 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x2E95B628<br />
|}<br />
<br />
=== SceThreadmgrForDriver_2F9F75AA ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x2F9F75AA<br />
|}<br />
<br />
=== SceThreadmgrForDriver_2FC0FFF6 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x2FC0FFF6<br />
|}<br />
<br />
=== sceKernelDeleteRWLockForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x32452017<br />
|}<br />
<br />
=== sceKernelGetTimerEventRemainingTimeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x3634FFE6<br />
|}<br />
<br />
<source lang="C">int sceKernelGetTimerEventRemainingTimeForDriver(SceUID timerId, SceUInt64 *time);</source><br />
<br />
=== SceThreadmgrForDriver_36F8E58A ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x36F8E58A<br />
|}<br />
<br />
=== sceKernelGetRWLockInfoForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x374C3267<br />
|}<br />
<br />
=== threadmgrGpuExceptionHandlerForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x37F51E91<br />
|}<br />
<br />
=== sceKernelChangeThreadPriorityAndCpuAffinityMaskForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x3857C94E<br />
|}<br />
<br />
=== SceThreadmgrForDriver_3A72C6D8 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x3A72C6D8<br />
|}<br />
<br />
=== SceThreadmgrForDriver_3C297724 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x3C297724<br />
|}<br />
<br />
=== SceThreadmgrForDriver_3F5E1D56 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x3F5E1D56<br />
|}<br />
<br />
=== SceThreadmgrForDriver_419E6736 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x419E6736<br />
|}<br />
<br />
=== SceThreadmgrForDriver_477F7C8A ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x477F7C8A<br />
|}<br />
<br />
=== SceThreadmgrForDriver_47F26712 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x47F26712<br />
|}<br />
<br />
Used to unregister a Threadmgr interrupt handler. See [[SceKernelThreadMgr#SceThreadmgrForDriver_6C2E3A49|SceThreadmgrForDriver_6C2E3A49]].<br />
<br />
<source lang="c"><br />
//Pass same slot and kind as to SceThreadmgrForDriver_6C2E3A49.<br />
int SceThreadmgrForDriver_47F26712(unsigned slot, unsigned kind);<br />
</source><br />
<br />
=== SceThreadmgrForDriver_48C06CD6_waitWorkQueue ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x48C06CD6<br />
|}<br />
<br />
=== sceKernelSetVfpRegisterForDebuggerForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x49A0B679<br />
|}<br />
<br />
=== SceThreadmgrForDriver_4A038803 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x4A038803<br />
|}<br />
<br />
=== SceThreadmgrForDriver_4DE77569 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x4DE77569<br />
|}<br />
<br />
=== SceThreadmgrForDriver_5311CFB5 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x5311CFB5<br />
|}<br />
<br />
Registers exception handler.<br />
<br />
Used by [[SceAppMgr]].<br />
<br />
<source lang="C">int SceThreadmgrForDriver_5311CFB5(int (* handler)(SceUID pid, SceUID thid, int cause_flag, void *argp), void *argp);</source><br />
<br />
=== SceThreadmgrForDriver_54566860 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x54566860<br />
|}<br />
<br />
=== sceKernelCountWaitingThreadsProcForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x54E1AF04<br />
|}<br />
<br />
=== SceThreadmgrForDriver_555CA6BB ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x555CA6BB<br />
|}<br />
<br />
=== SceThreadmgrForDriver_56C18B11 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x56C18B11<br />
|}<br />
<br />
=== SceThreadmgrForDriver_5870C73A ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x5870C73A<br />
|}<br />
<br />
=== SceThreadmgrForDriver_5D8F88B1 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x5D8F88B1<br />
|}<br />
<br />
=== sceKernelSetCpuRegisterForDebuggerForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x64E89DE9<br />
|}<br />
<br />
=== sceKernelGetRWLockInfoAllProcForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x6624E612<br />
|}<br />
<br />
=== SceThreadmgrForDriver_6657429E ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x6657429E<br />
|}<br />
<br />
=== SceThreadmgrForDriver_67022B18 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x67022B18<br />
|}<br />
<br />
=== SceThreadmgrForDriver_6C2E3A49 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x6C2E3A49<br />
|}<br />
<br />
Register a Threadmgr interrupt handler.<br />
<br />
<source lang="c"><br />
//Specify 0 or 1 for slot.<br />
//Specify one of the following for kind, to select which "interrupt" the handler is registered for:<br />
// 0 -> Thread events (To determine event, check argp->unk0: 1 = DeleteThread, 2 = StartThread)<br />
// 1 -> Vfp<br />
// 2 -> Gpu Exception<br />
// 3 -> Stack overflow<br />
// 4 -> Syscall Error - Illegal Context<br />
// 5 -> Syscall Error - Critical Usage<br />
// 6 -> Syscall Error - Illegal Number<br />
// 7 -> ApiDeclareSuicide (unknown what this is for)<br />
int SceThreadmgrForDriver_6C2E3A49(unsigned slot, unsigned kind, void (*handler)(int args, void* argp));<br />
</source><br />
<br />
=== SceThreadmgrForDriver_6D4C1EB7 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x6D4C1EB7<br />
|}<br />
<br />
=== SceThreadmgrForDriver_738FF63D ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x738FF63D<br />
|}<br />
<br />
=== sceKernelTryLockFastMutexForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x741F4707<br />
|}<br />
<br />
<source lang="C">int sceKernelTryLockFastMutexForDriver(void *pFastMutex);</source><br />
<br />
=== SceThreadmgrForDriver_767CA30C ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x767CA30C<br />
|}<br />
<br />
=== sceKernelCancelRWLockForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x7A4EF925<br />
|}<br />
<br />
=== SceThreadmgrForDriver_7D12344A ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x7D12344A<br />
|}<br />
<br />
=== SceThreadmgrForDriver_7E280B69 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x7E280B69<br />
|}<br />
<br />
=== SceThreadmgrForDriver_84EB1EA4 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x84EB1EA4<br />
|}<br />
<br />
=== SceThreadmgrForDriver_85F4DC8C ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x85F4DC8C<br />
|}<br />
<br />
=== sceKernelCancelSemaForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x8760C8ED<br />
|}<br />
<br />
=== SceThreadmgrForDriver_88206D29 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x88206D29<br />
|}<br />
<br />
=== SceThreadmgrForDriver_89CA5698 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x89CA5698<br />
|}<br />
<br />
=== SceThreadmgrForDriver_8C3C1F78 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x8C3C1F78<br />
|}<br />
<br />
=== SceThreadmgrForDriver_8C48E53B ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x8C48E53B<br />
|}<br />
<br />
=== sceKernelIsUserModeThreadForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x91382762<br />
|}<br />
<br />
=== sceKernelDeleteTimerForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x91A8F38B<br />
|}<br />
<br />
<source lang="C">int sceKernelDeleteTimerForDriver(SceUID timerId);</source><br />
<br />
=== sceKernelSetTimerEventForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x92A3DCDD<br />
|}<br />
<br />
<source lang="C">int sceKernelSetTimerEventForDriver(SceUID timerId, int type, SceUInt64 *time, SceBool repeat);</source><br />
<br />
=== SceThreadmgrForDriver_995F32E1 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x995F32E1<br />
|}<br />
<br />
=== SceThreadmgrForDriver_A64B00F6 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xA64B00F6<br />
|}<br />
<br />
=== SceThreadmgrForDriver_A90B1E01 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xA90B1E01<br />
|}<br />
<br />
=== SceThreadmgrForDriver_AB977C72 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xAB977C72<br />
|}<br />
<br />
=== SceThreadmgrForDriver_AF302193 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xAF302193<br />
|}<br />
<br />
=== SceThreadmgrForDriver_B4A05763 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xB4A05763<br />
|}<br />
<br />
=== sceKernelGetWaitingThreadListForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xB5C782A3<br />
|}<br />
<br />
=== SceThreadmgrForDriver_B6DA4669 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xB6DA4669<br />
|}<br />
<br />
=== sceKernelCancelEventForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xB6FA8305<br />
|}<br />
<br />
=== SceThreadmgrForDriver_C03799E2 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xC03799E2<br />
|}<br />
<br />
=== SceThreadmgrForDriver_C2DA6286 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xC2DA6286<br />
|}<br />
<br />
=== SceThreadmgrForDriver_C327CA7C ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xC327CA7C<br />
|}<br />
<br />
=== SceThreadmgrForDriver_C4456EC9 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xC4456EC9<br />
|}<br />
<br />
=== SceThreadmgrForDriver_C6741986 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xC6741986<br />
|}<br />
<br />
=== SceThreadmgrForDriver_C7F5FFE0 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xC7F5FFE0<br />
|}<br />
<br />
=== SceThreadmgrForDriver_CA704239 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xCA704239<br />
|}<br />
<br />
=== sceKernelGetTimerTimeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xCB795E13<br />
|}<br />
<br />
<source lang="C">int sceKernelGetTimerTimeForDriver(SceUID timerId, SceUInt64 *time);</source><br />
<br />
=== SceThreadmgrForDriver_CBA7FAAA ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xCBA7FAAA<br />
|}<br />
<br />
=== SceThreadmgrForDriver_CFA2FFAF ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xCFA2FFAF<br />
|}<br />
<br />
=== SceThreadmgrForDriver_D0262C55 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xD0262C55<br />
|}<br />
<br />
=== sceKernelPollEventForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xD08C71C6<br />
|}<br />
<br />
=== SceThreadmgrForDriver_D1FBDFA6 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xD1FBDFA6<br />
|}<br />
<br />
=== SceThreadmgrForDriver_D26BFF26 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xD26BFF26<br />
|}<br />
<br />
=== sceKernelGetTimerBaseForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xD41F53D4<br />
|}<br />
<br />
<source lang="C">int sceKernelGetTimerBaseForDriver(SceUID timerId, SceUInt64 *result);</source><br />
<br />
=== SceThreadmgrForDriver_D7455187 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xD7455187<br />
|}<br />
<br />
=== SceThreadmgrForDriver_D74F66BD ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xD74F66BD<br />
|}<br />
<br />
=== sceKernelGetFastMutexInfoForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xD7AF2E58<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">int sceKernelGetFastMutexInfoForDriver(void *pFastMutex, void *pInfo);</source><br />
<br />
=== sceKernelSetTimerTimeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xD978D16F<br />
|}<br />
<br />
<source lang="C">int sceKernelSetTimerTimeForDriver(SceUID timerId, SceUInt64 *time);</source><br />
<br />
=== sceKernelChangeThreadPriorityForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xDA1544D1<br />
|}<br />
<br />
=== sceKernelUIDInheritedEventClassInitForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xDBB77032<br />
|}<br />
<br />
=== SceThreadmgrForDriver_E0C7BCBB ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xE0C7BCBB<br />
|}<br />
<br />
=== SceThreadmgrForDriver_E2B57231 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xE2B57231<br />
|}<br />
<br />
=== sceKernelCancelEventWithSetPatternForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xE5CAD3E2<br />
|}<br />
<br />
=== SceThreadmgrForDriver_E6D80698 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xE6D80698<br />
|}<br />
<br />
=== SceThreadmgrForDriver_E938FB20 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xE938FB20<br />
|}<br />
<br />
=== SceThreadmgrForDriver_E9E50096 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xE9E50096<br />
|}<br />
<br />
=== sceKernelCancelEventFlagForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xEA211225<br />
|}<br />
<br />
=== sceKernelCancelTimerForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xF285C94F<br />
|}<br />
<br />
<source lang="C">int sceKernelCancelTimerForDriver(SceUID timerId, SceUInt32 *a2);</source><br />
<br />
=== SceThreadmgrForDriver_F2C9DC97 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xF2C9DC97<br />
|}<br />
<br />
=== sceKernelChangeThreadVfpExceptionForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xF4C81683<br />
|}<br />
<br />
=== SceThreadmgrForDriver_F5074173 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xF5074173<br />
|}<br />
<br />
=== SceThreadmgrForDriver_F8A6013B ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xF8A6013B<br />
|}<br />
<br />
=== SceThreadmgrForDriver_F96FE0D5 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xF96FE0D5<br />
|}<br />
<br />
=== SceThreadmgrForDriver_FD6150D5 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xFD6150D5<br />
|}<br />
<br />
=== SceThreadmgrForDriver_FD87586C ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xFD87586C<br />
|}<br />
<br />
=== sceKernelGetCallbackInfoForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xFDC044AC<br />
|}<br />
<br />
=== SceThreadmgrForDriver_FF8DA217 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xFF8DA217<br />
|}<br />
<br />
== SceThreadmgrForKernel ==<br />
<br />
=== sceKernelCpuScanThreadForProcessmgrForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.65 || 0x01369E06<br />
|}<br />
<br />
=== sceKernelSetDTraceThreadCBEnableForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xBE5247A2<br />
|-<br />
| 3.65 || 0x0AE9C713<br />
|}<br />
<br />
=== sceKernelSetSyslibtraceThreadCBEnableForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x5A410D2B<br />
|-<br />
| 3.65 || 0x4F2B45DC<br />
|}<br />
<br />
=== sceKernelSetThreadMgrTestModeForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.65 || 0x1394E856<br />
|}<br />
<br />
=== sceKernelClearThreadMgrTestModeForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.65 || 0x5D270A94<br />
|}<br />
<br />
=== sceKernelThreadMgrProcessCreateForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.65 || 0xB46502E6<br />
|}<br />
<br />
=== sceKernelThreadMgrProcessDeleteAfterPUIDCloseForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xF282AE42<br />
|-<br />
| 3.65 || 0x5A23A1BE<br />
|}<br />
<br />
=== sceKernelThreadMgrProcessDeleteBeforePUIDCloseForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x1928DFBB<br />
|-<br />
| 3.65 || 0x205506FC<br />
|}<br />
<br />
=== sceKernelRegisterKTLSForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-1.692.000 || 0xB645C7EF<br />
|-<br />
| 1.80-3.740.011 || not present. Still present in [[#SceThreadmgrForDriver]].<br />
|}<br />
<br />
Temp name was sceKernelAllocateKTLSForKernel.<br />
<br />
See [[#sceKernelRegisterKTLSForDriver]].<br />
<br />
=== sceKernelUnregisterKTLSForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-1.692.000 || 0x8C3C1F78<br />
|-<br />
| 1.80-3.740.011 || not present. Still present in [[#SceThreadmgrForDriver]].<br />
|}<br />
<br />
See [[#sceKernelUnregisterKTLSForDriver]].<br />
<br />
=== SceThreadmgrForKernel_89CA5698 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-1.692.000 || 0x89CA5698<br />
|-<br />
| 1.80-3.740.011 || not present. Still present in [[#SceThreadmgrForDriver]].<br />
|}<br />
<br />
See [[#SceThreadmgrForDriver_89CA5698]].<br />
<br />
=== SceThreadmgrForKernel_3A72C6D8 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-1.692.000 || 0x3A72C6D8<br />
|-<br />
| 1.80-3.740.011 || not present. Still present in [[#SceThreadmgrForDriver]].<br />
|}<br />
<br />
See [[#SceThreadmgrForDriver_3A72C6D8]].<br />
<br />
=== sceKernelSetEventWithNotifyCallbackForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.995 || 0xB7DF3EDF<br />
|-<br />
| 3.60 || not present. Moved to ForDriver. [[SceKernelThreadMgr#sceKernelSetEventWithNotifyCallbackForDriver]]<br />
|}<br />
<br />
=== sceKernelSetEventFlagForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931 || 0xD4780C3E<br />
|-<br />
| 3.60 || in ForDriver<br />
|}<br />
<br />
=== SceThreadmgrForKernel_05F5306C ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990 || 0x05F5306C<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
Uses [[KBL_Param#DIP_Switches|DIP switch]] 216.<br />
<br />
=== SceThreadmgrForKernel_CA84C603 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990 || 0xCA84C603<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
Uses [[KBL_Param#DIP_Switches|DIP switch]] 216.<br />
<br />
=== sceKernelGetDefaultCpuAffinityMaskForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990 || not present<br />
|-<br />
| 3.60 || 0x091322E5<br />
|-<br />
| 3.65 || 0xD9C097DD<br />
|}<br />
<br />
=== sceKernelDebugSuspendThreadForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || 0xFB3706CB<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
<source lang="C">int sceKernelDebugSuspendThreadForKernel(SceUID threadId, SceUInt32 status);</source><br />
<br />
=== SceThreadmgrForKernel_86DAE59B ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || 0x86DAE59B<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
Get maybe current CPU mask.<br />
<br />
<source lang="C">int SceThreadmgrForKernel_86DAE59B(void);</source><br />
<br />
=== sceKernelGetCurrentThreadUnkInfoForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || 0x332E127C<br />
|-<br />
| 3.60 || To ForDriver<br />
|}<br />
<br />
Get some current thread information.<br />
<br />
<source lang="C">int sceKernelGetCurrentThreadUnkInfoForKernel(void);</source><br />
<br />
=== SceThreadmgrForKernel_33E85E9E ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x33E85E9E<br />
|}<br />
<br />
<source lang="C"><br />
typedef struct SceThreadmgrForKernel_33E85E9E_buf { // size is 0x34 on FW 0.990<br />
SceSize size; // Size of this structure<br />
char unk[0x30];<br />
} SceThreadmgrForKernel_33E85E9E_buf;<br />
<br />
int SceThreadmgrForKernel_33E85E9E(SceThreadmgrForKernel_33E85E9E_buf *buf);<br />
</source><br />
<br />
=== sceKernelPMonThreadSetEventForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x6ECCDCBD<br />
|}<br />
<br />
=== sceKernelPMonSetControlRegisterForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-2.060.011 || 0x1AAFA818<br />
|-<br />
| 2.100.081-3.740.011 || not present. Moved to [[#SceThreadmgrForDriver]].<br />
|}<br />
<br />
See [[#sceKernelPMonSetControlRegisterForDriver]].<br />
<br />
=== sceKernelPMonSetUserEnableRegisterForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-2.060.011 || 0x5053B005<br />
|-<br />
| 2.100.081-3.740.011 || not present. Moved to [[#SceThreadmgrForDriver]].<br />
|}<br />
<br />
See [[#sceKernelPMonSetUserEnableRegisterForDriver]].<br />
<br />
=== sceKernelPMonThreadSetEnableCounterForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.610.011 || 0x72E5DA4E<br />
|-<br />
| 3.630.011-3.740.011 || 0x7F831213<br />
|}<br />
<br />
=== sceKernelPMonThreadSetCounterForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.610.011 || 0xD2BE5EFB<br />
|-<br />
| 3.630.011-3.740.011 || 0x7B3368F1<br />
|}<br />
<br />
=== sceKernelPMonThreadClearEnableCounterForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.610.011 || 0x43D13895<br />
|-<br />
| 3.630.011-3.740.011 || 0x1D2A6815<br />
|}<br />
<br />
=== sceKernelGetThreadIdListForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-1.692.000 || 0xEA7B8AEF<br />
|-<br />
| 1.80-3.740.011 || not present. Still present in [[SceThreadmgrForDriver]].<br />
|}<br />
<br />
See [[#sceKernelGetThreadIdListForDriver]].<br />
<br />
=== sceKernelCreateTimerForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990 || 0x90656C98<br />
|-<br />
| 3.60 || not present. Moved to ForDriver.<br />
|}<br />
<br />
<source lang="C">int sceKernelCreateTimerForKernel(const char *name, uint32_t attr);</source><br />
<br />
=== sceKernelLockMutex_089ForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x16AC80C5<br />
|}<br />
<br />
<source lang="C">int sceKernelLockMutex_089ForKernel(SceUID mutex_id, int unk1, int unk2);</source><br />
<br />
=== sceKernelUnlockMutex_089ForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x1E82E5D0<br />
|}<br />
<br />
<source lang="C">int sceKernelUnlockMutex_089ForKernel(SceUID mutex_id, int unk1);</source><br />
<br />
=== sceKernelLockMutexCB_089ForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xD06F2886<br />
|-<br />
| 3.60 || not present. Moved to ForDriver.<br />
|}<br />
<br />
=== sceKernelTryLockMutex_089ForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x270993A6<br />
|-<br />
| 3.60 || not present. Moved to ForDriver.<br />
|}<br />
<br />
=== sceKernelCreateMutexForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0xFBAA026E<br />
|}<br />
<br />
<source lang="C">SceUID sceKernelCreateMutexForKernel(const char *pName, SceUInt attr, int initCount, const SceKernelMutexOptParam *pOptParam);</source><br />
<br />
=== sceKernelDeleteMutexForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x0A912340<br />
|}<br />
<br />
<source lang="C">int sceKernelDeleteMutexForKernel(SceUID mutexid);</source><br />
<br />
=== sceKernelGetMutexInfo_089ForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x69B78A12<br />
|-<br />
| 3.60 || not present. Moved to ForDriver.<br />
|}<br />
<br />
<source lang="C">int sceKernelGetMutexInfo_089ForKernel(SceUID mutexid, SceKernelMutexInfo *info);</source><br />
<br />
=== sceKernelCancelMutex_089ForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x7204B846<br />
|-<br />
| 3.60 || not present. Moved to ForDriver.<br />
|}<br />
<br />
=== sceKernelSetThreadAccessLevelForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x02EEDF17<br />
|}<br />
<br />
Temp name was sceKernelSetPermissionForKernel.<br />
<br />
<source lang="C"><br />
// return value is previous value<br />
int sceKernelSetThreadAccessLevelForKernel(int value);<br />
</source><br />
<br />
=== sceKernelCreateSemaForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x30E93C31<br />
|}<br />
<br />
<source lang="C"><br />
/**<br />
* Creates a new semaphore<br />
*<br />
* @par Example:<br />
* @code<br />
* int semaid;<br />
* semaid = sceKernelCreateSemaForKernel("MySema", 0, 1, 1, 0);<br />
* @endcode<br />
*<br />
* @param name - Specifies the name of the sema<br />
* @param attr - Sema attribute flags (normally set to 0)<br />
* @param initVal - Sema initial value<br />
* @param maxVal - Sema maximum value<br />
* @param option - Sema options (normally set to 0)<br />
* @return A semaphore id<br />
*/<br />
SceUID sceKernelCreateSemaForKernel(const char *name, SceUInt attr, int initVal, int maxVal, SceKernelSemaOptParam *option);<br />
</source><br />
<br />
=== sceKernelSignalSemaForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xD270498B<br />
|}<br />
<br />
=== sceKernelWaitSemaForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x3C8B55A9<br />
|}<br />
<br />
<source lang="C"><br />
/**<br />
* Lock a semaphore<br />
*<br />
* @par Example:<br />
* @code<br />
* sceKernelWaitSemaForKernel(sema_id, 1, 0);<br />
* @endcode<br />
*<br />
* @param sema_id - The sema id returned from ::sceKernelCreateSemaForKernel<br />
* @param signal - The value to wait for (i.e. if 1 then wait till reaches a signal state of 1)<br />
* @param timeout - Timeout in microseconds (assumed).<br />
*<br />
* @return < 0 on error.<br />
*/<br />
int sceKernelWaitSemaForKernel(SceUID sema_id, int signal, SceUInt *timeout);<br />
</source><br />
<br />
=== sceKernelDeleteSemaForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x16A35E58<br />
|}<br />
<br />
=== sceKernelStartThread_089ForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990-1.69 || 0x21F5419B<br />
|-<br />
| 3.60 || not present. Moved to ForDriver.<br />
|}<br />
<br />
<source lang="C"><br />
/**<br />
* @brief Thread activation<br />
*<br />
* Starts the thread specified by threadId and puts it in READY state.<br />
*<br />
* The argument block specified by argSize and argBlock is copied onto the thread stack, argSize is<br />
* passed directly to the first argument of the thread entry function, and the second argument of<br />
* the entry function is the argument copied onto the stack. The block address is passed.<br />
*<br />
* This system call does not queue activation requests. In other words, if the target thread is not<br />
* in the DORMANT state, an SCE_KERNEL_ERROR_NOT_DORMANT error is returned to the calling thread.<br />
*<br />
* @param threadId Specify the identifier of the thread to be started.<br />
* @param argSize Specify the size (byte) of the argument to be passed to the thread.<br />
* @param pArgBlock Specify the address of the argument to be passed to the thread.<br />
* @retval SCE_OK Success<br />
* @retval Negative value Error code<br />
*/<br />
SceInt32 sceKernelStartThread_089ForKernel(<br />
SceUID threadId,<br />
SceSize argSize,<br />
const void *pArgBlock<br />
);<br />
</source><br />
<br />
=== sceKernelWaitThreadEnd_089ForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xF3489EF4<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
=== sceKernelDelayThreadForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x4B675D05<br />
|-<br />
| 3.60 || not present. Moved to ForDriver.<br />
|}<br />
<br />
=== sceKernelDelayThreadUnkCBForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990 || 0x2B60B793<br />
|-<br />
| 3.60 || not present. Moved to ForDriver.<br />
|}<br />
<br />
=== sceKernelDelayThreadUnkForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990 || 0xE9A99C50<br />
|-<br />
| 3.60 || not present. Moved to ForDriver.<br />
|}<br />
<br />
=== sceKernelStopThreadForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x150AEF74<br />
|}<br />
<br />
=== sceKernelSuspendThreadForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0xAEEE955F<br />
|}<br />
<br />
<source lang="C"><br />
// semaId must be strictly between 0 and 255<br />
int sceKernelSuspendThreadForKernel(SceUID threadId, SceUID semaId);<br />
</source><br />
<br />
=== sceKernelWaitThreadEndCB_089ForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x0373C5E3<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
=== sceKernelExitThreadForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x0C8A38E1<br />
|-<br />
| 3.60 || not present. Moved to ForDriver.<br />
|}<br />
<br />
<source lang="C"><br />
/**<br />
* @brief End of own thread<br />
*<br />
* Terminates the own thread normally and shifts to the DORMANT state.<br />
* sceKernelExitThread() is a system call that does not return to the context of the issuer.<br />
*<br />
* Resources (memory, semaphores, etc.) acquired by the terminating thread are not automatically released.<br />
* However, for mutexes only, mutexes that have been locked by the terminating thread are automatically unlocked.<br />
* The mutex is unlocked and not deleted.<br />
*<br />
* When the terminated thread is restarted with sceKernelStartThread(), the information included in the thread<br />
* management area, such as thread priority, is reset.<br />
* It will not inherit the one at the end.<br />
*<br />
* When a thread exits, exitStatus becomes the exit status of that thread.<br />
*<br />
* If the thread is terminated by a return from the entry function without using<br />
* sceKernelExitThread(), the return value of the entry function becomes the termination status.<br />
*<br />
* The end status of a thread can be obtained by sceKernelGetThreadExitStatus() and sceKernelGetThreadInfo(),<br />
* and when another thread waits for the end of the thread by sceKernelWaitThreadEnd(), it can be obtained by the return value.<br />
*<br />
* The thread exit status is saved while the thread exits and is in the DORMANT state,<br />
* but the value is lost if the thread is restarted or deleted with sceKernelStartThread().<br />
*<br />
* @param exitStatus Specify the value to be set for the termination status of the local thread.<br />
* @retval Negative value Error code<br />
*/<br />
SceInt32 sceKernelExitThreadForKernel(<br />
SceInt32 exitStatus<br />
);<br />
</source><br />
<br />
=== sceKernelExitDeleteThreadForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x1D17DECF<br />
|-<br />
| 3.60 || not present. Moved to ForDriver.<br />
|}<br />
<br />
<source lang="C"><br />
/**<br />
* @brief End and delete own thread<br />
*<br />
* Terminates the own thread normally and deletes it.<br />
* sceKernelExitDeleteThread() is a system call that does not return to the context of the issuer.<br />
*<br />
* Resources (memory, semaphores, etc.) acquired by the terminating thread are not automatically released.<br />
* However, for mutexes only, mutexes that have been locked by the terminating thread are automatically unlocked.<br />
* The mutex is unlocked and not deleted.<br />
*<br />
* When a thread exits, exitStatus becomes the exit status of that thread (sceKernelExitDeleteThread()<br />
* directly deletes the thread without going through the DORMANT state.<br />
* (It cannot be obtained by sceKernelGetThreadInfo(). The end status can be obtained by the return<br />
* value only when waiting for the end of the thread by sceKernelWaitThreadEnd().)<br />
*<br />
* @param exitStatus Specify the value to be set for the termination status of the local thread.<br />
* @retval Negative value Error code<br />
*/<br />
SceInt32 sceKernelExitDeleteThreadForKernel(<br />
SceInt32 exitStatus<br />
);<br />
</source><br />
<br />
=== sceKernelDelayThreadCBForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x9C0180E1<br />
|-<br />
| 3.60 || not present. Moved to ForDriver.<br />
|}<br />
<br />
=== sceKernelGetThreadCurrentPriorityForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x01414F0B<br />
|-<br />
| 3.60 || not present. Moved to ForDriver.<br />
|}<br />
<br />
=== sceKernelChangeCurrentThreadAttrForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x751C9B7A<br />
|-<br />
| 3.60 || not present. Moved to ForDriver.<br />
|}<br />
<br />
=== sceKernelCpuScanThreadForProcessmgrForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x3B4B8293<br />
|}<br />
<br />
<source lang="C">int sceKernelCpuScanThreadForProcessmgrForKernel(void *a1);</source><br />
<br />
=== sceKernelGetProcessIdForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-1.69 || 0x9DCB4B7A<br />
|-<br />
| 3.60 || not present. Moved to ForDriver.<br />
|}<br />
<br />
Returns the process ID.<br />
<br />
<source lang="C">SceUID sceKernelGetProcessIdForKernel(void);</source><br />
<br />
=== sceKernelChangeActiveCpuMaskForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x001173F8<br />
|-<br />
| 3.60 || not present. Moved to ForDriver.<br />
|}<br />
<br />
=== sceKernelCheckWaitableStatusForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xD9BD74EB<br />
|-<br />
| 3.60 || not present. Moved to ForDriver.<br />
|}<br />
<br />
=== sceKernelCheckCallbackForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xE53E41F6<br />
|-<br />
| 3.60 || not present. Moved to ForDriver.<br />
|}<br />
<br />
=== _sceKernelExtendKernelStackWideForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xE54FD746<br />
|}<br />
<br />
Temp name was sceKernelRunWithStackForKernel.<br />
<br />
This takes a function and runs it exclusively on the current core on its own stack.<br />
<br />
<source lang="c"><br />
// stack_size should be 0x2000<br />
int _sceKernelExtendKernelStackWideForKernel(int stack_size, void *func, void *args);<br />
</source><br />
<br />
=== sceKernelExtendKernelStackWideForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990-1.69 || 0xA2C801A5<br />
|-<br />
| 3.60 || not present. Moved to ForDriver.<br />
|}<br />
<br />
Temp name was sceKernelRunWithStack2ForKernel.<br />
<br />
<source lang="c"><br />
// stack_size should be 0x2000<br />
SceInt64 sceKernelExtendKernelStackWideForKernel(int stack_size, void *func, void *args);<br />
</source><br />
<br />
=== sceKernelExtendKernelStackWide2ForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990 || 0x236AF33A<br />
|-<br />
| 3.60 || unk<br />
|}<br />
<br />
<source lang="c"><br />
// stack_size should be 0x2000<br />
int sceKernelExtendKernelStackWide2ForKernel(int stack_size, void *func, void *args);<br />
</source><br />
<br />
=== sceKernelGetThreadContextInfoForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0xD8B9AC8D<br />
|-<br />
| 3.65-3.67 || 0x6C1F092F<br />
|}<br />
<br />
Temp name was sceKernelGetFaultingProcessForKernel.<br />
<br />
Returns information about the thread currently scheduled on caller CPU.<br />
<br />
This function can be called from an exception or interrupt handler, in which case it returns information about the thread that was interrupted.<br />
<br />
<source lang="C"><br />
struct SceKernelThreadContextInfo { // Previous name: SceKernelFaultingProcessInfo<br />
ScePID processId; //<! GUID of the process the currently scheduled thread<br />
SceUID threadId; //<! GUID of the thread currently scheduled<br />
};<br />
<br />
SceInt32 sceKernelGetThreadContextInfoForKernel(struct SceKernelThreadContextInfo * pInfo);<br />
</source><br />
<br />
=== sceKernelCloseEventFlagForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990 || 0x71ECB352<br />
|-<br />
| 3.60 || not present. Moved to ForDriver.<br />
|}<br />
<br />
Temp name was sceKernelDeleteEventFlagForKernel.<br />
<br />
See [[#sceKernelCloseEventFlagForDriver]].<br />
<br />
=== SceThreadmgrForKernel_E0833C77 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990-3.57 || not present. Added on FW 3.60.<br />
|-<br />
| 3.60 || 0xE0833C77<br />
|}<br />
<br />
=== sceKernelSetThreadMgrTestModeForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x333B26AD<br />
|}<br />
<br />
<source lang="C">int sceKernelSetThreadMgrTestModeForKernel(void);</source><br />
<br />
=== sceKernelClearThreadMgrTestModeForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0xE00333A6<br />
|}<br />
<br />
<source lang="C">int sceKernelClearThreadMgrTestModeForKernel(void);</source><br />
<br />
=== sceKernelSetThreadDebugCallbackForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x41CF346A<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C"><br />
typedef struct SceThreadDebugCallbackParam {<br />
union {<br />
struct {<br />
SceKernelThreadEntry entry;<br />
SceUID thid;<br />
SceUID pid;<br />
} create;<br />
struct {<br />
SceUID pid;<br />
SceUID thid;<br />
SceSize argc;<br />
void *argp;<br />
} start;<br />
};<br />
} SceThreadDebugCallbackParam;<br />
<br />
typedef int (* SceKernelThreadDebugCallback)(int a1, int a2, SceThreadDebugCallbackParam param);<br />
<br />
int (* sceKernelSetThreadDebugCallback)(SceKernelThreadDebugCallback callback);<br />
</source><br />
<br />
Code example:<br />
<source lang="C"><br />
int sceKernelThreadDebugCallback(int a1, int a2, SceThreadDebugCallbackParam param){<br />
// start thread<br />
if (a1 == 2 && a2 == 4) {<br />
ksceDebugPrintf(<br />
"%s:start pid:0x%08X thid:0x%08X argc:0x%08X argp:0x%08X\n",<br />
__FUNCTION__, param.start.pid, param.start.thid, param.start.argc, param.start.argp<br />
);<br />
} else if (a1 == 0 && a2 == 3) { // create thread<br />
} else if (a1 == 7 && a2 == 3) { // some timer (in SceThreadmgrTimer handler)<br />
} else if (a1 == 6 && a2 == 1) { // unknown (in SceThreadmgrForDriver_44CCF310)<br />
} else if (a1 == 1 && a2 == 2) { // delete thread (In sub_81000D78)<br />
}<br />
return 0;<br />
}<br />
</source><br />
<br />
=== SceThreadmgrForKernel_000DF999 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x000DF999<br />
|}<br />
<br />
=== sceKernelGetCpuRegisterForDebuggerForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x09444C33<br />
|}<br />
<br />
<source lang="C">int sceKernelGetCpuRegisterForDebuggerForKernel(SceUID threadId, void *pInfo);</source><br />
<br />
=== SceThreadmgrForKernel_09CEAAA4 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x09CEAAA4<br />
|}<br />
<br />
=== SceThreadmgrForKernel_14ADCC1F ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x14ADCC1F<br />
|}<br />
<br />
=== SceThreadmgrForKernel_15AAB4F9 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x15AAB4F9<br />
|}<br />
<br />
=== sceKernelWaitThreadSuspendForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x17A4E56B<br />
|}<br />
<br />
<source lang="C">int sceKernelWaitThreadSuspendForKernel(SceUID threadId, SceUInt32 *timeout);</source><br />
<br />
=== SceThreadmgrForKernel_2EC8E376 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x2EC8E376<br />
|}<br />
<br />
=== sceKernelGetThreadNameListProcForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x315869B6<br />
|}<br />
<br />
=== SceThreadmgrForKernel_3CD03673 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x3CD03673<br />
|}<br />
<br />
=== SceThreadmgrForKernel_41BCA03A ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x41BCA03A<br />
|}<br />
<br />
=== SceThreadmgrForKernel_4679280D ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x4679280D<br />
|}<br />
<br />
=== sceKernelDTraceAsyncXCallForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x4C3887B4<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">int sceKernelDTraceAsyncXCallForKernel(SceUInt32 targetCpu, int (* callback)(void *argp), void *argp, SceSize arg_len);</source><br />
<br />
=== sceKernelGetVfpRegisterForDebuggerForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x5785D18E<br />
|}<br />
<br />
=== sceKernelDTraceSyncXCallForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x5AB30D35<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">int sceKernelDTraceSyncXCallForKernel(SceUInt32 targetCpu, int (* callback)(void *argp), void *argp);</source><br />
<br />
=== SceThreadmgrForKernel_766028E7 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x766028E7<br />
|}<br />
<br />
=== SceThreadmgrForKernel_796D3A65 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x796D3A65<br />
|}<br />
<br />
=== SceThreadmgrForKernel_82F080A8 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x82F080A8<br />
|}<br />
<br />
=== sceKernelSetVfpRegisterForDebuggerForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x87B3D598<br />
|}<br />
<br />
=== SceThreadmgrForKernel_88D5BC33 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x88D5BC33<br />
|}<br />
<br />
=== SceThreadmgrForKernel_8B6F201E ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x8B6F201E<br />
|}<br />
<br />
sceKernelStopThread with arg 0x40000000.<br />
<br />
=== SceThreadmgrForKernel_8F3E9E35 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x8F3E9E35<br />
|}<br />
<br />
=== SceThreadmgrForKernel_97780FA6 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x97780FA6<br />
|}<br />
<br />
=== SceThreadmgrForKernel_9C96317A ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x9C96317A<br />
|}<br />
<br />
=== SceThreadmgrForKernel_9F5ECAD5 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x9F5ECAD5<br />
|}<br />
<br />
=== SceThreadmgrForKernel_A1939BC9 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xA1939BC9<br />
|}<br />
<br />
=== SceThreadmgrForKernel_A4127F82 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xA4127F82<br />
|}<br />
<br />
=== SceThreadmgrForKernel_AEA9213B ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xAEA9213B<br />
|}<br />
<br />
=== sceKernelSetCpuRegisterForDebuggerForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xC75A4609<br />
|}<br />
<br />
=== SceThreadmgrForKernel_CC1D6D9F ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xCC1D6D9F<br />
|}<br />
<br />
=== SceThreadmgrForKernel_CE99E69C ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xCE99E69C<br />
|}<br />
<br />
=== SceThreadmgrForKernel_D8117AFB ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xD8117AFB<br />
|}<br />
<br />
=== SceThreadmgrForKernel_DBE2EE32 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xDBE2EE32<br />
|}<br />
<br />
=== SceThreadmgrForKernel_E3CE20AA ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xE3CE20AA<br />
|}<br />
<br />
=== SceThreadmgrForKernel_E92C1784 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xE92C1784<br />
|}<br />
<br />
sceKernelWaitThreadSuspend with arg 0<br />
<br />
=== sceKernelIssueSimpleIntrRequestForKernel ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xF74B7E34<br />
|}<br />
<br />
=== SceThreadmgrForKernel_F9BD4A0D ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xF9BD4A0D<br />
|}<br />
<br />
=== SceThreadmgrForKernel_FA53F581 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xFA53F581<br />
|}<br />
<br />
== SceThreadmgr ==<br />
<br />
=== _sceKernelCloseTimer ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x22605E63<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
=== _sceKernelCloseMutex ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x21716C81<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
=== _sceKernelPollSema ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x20AF286A<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
=== _sceKernelCancelCallback ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x19A0C1B6<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
=== _sceKernelOpenMsgPipe ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x16EC5B7C<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
=== _sceKernelDeleteEventFlag ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x16C93704<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
=== _sceKernelDeleteThread ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x151E0020<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
Simply calls [[SceKernelThreadMgr#sceKernelDeleteThread|sceKernelDeleteThread()]];<br />
<br />
<source lang="C"><br />
/**<br />
* @brief Delete thread<br />
*<br />
* Deletes the thread specified by threadId.<br />
*<br />
* Accordingly, the stack area and thread management area are released. The target thread must be in the DORMANT state.<br />
*<br />
* Since the own thread cannot be in the DORMANT state, it cannot be set as the target thread<br />
* (this results in an SCE_KERNEL_ERROR_NOT_DORMANT error).<br />
* Use sceKernelExitDeleteThread() to delete your own thread.<br />
*<br />
* @param threadId Specify the identifier of the thread to be deleted.<br />
* @retval SCE_OK Success<br />
* @retval Negative value Error code<br />
*/<br />
SceInt32 _sceKernelDeleteThread(<br />
SceUID threadId<br />
);<br />
</source><br />
<br />
=== _sceKernelUnlockMutex ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x12948A63<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
=== sceKernelGetActiveCpuMask ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x0C3CBB8B<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
=== _sceKernelSignalCondAll ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x0F11545D<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
=== sceKernelUnregisterThreadEventHandler ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x2C8ED6F0<br />
|}<br />
<br />
=== sceKernelChangeActiveCpuMask ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x001173F8<br />
|}<br />
<br />
=== sceKernelGetThreadCurrentPriority ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x01414F0B<br />
|}<br />
<br />
=== sceKernelWaitThreadEndCB_089 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x0373C5E3<br />
|}<br />
<br />
=== sceKernelGetCallbackCount ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x038644D5<br />
|}<br />
<br />
=== _sceKernelTryReceiveMsgPipeVector ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x03CFCF00<br />
|}<br />
<br />
=== sceKernelCloseMutex ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x03E23AF6<br />
|}<br />
<br />
=== _sceKernelGetSemaInfo ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x0402C633<br />
|}<br />
<br />
=== _sceKernelWaitCond ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x040795C7<br />
|}<br />
<br />
=== _sceKernelWaitMultipleEventsCB ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x0558B7C1<br />
|}<br />
<br />
=== _sceKernelGetCondInfo ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x05C51CE1<br />
|}<br />
<br />
=== _sceKernelSignalLwCondAll ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x07D2584A<br />
|}<br />
<br />
=== sceKernelExitThread ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x0C8A38E1<br />
|}<br />
<br />
<source lang="C"><br />
/**<br />
* @brief End of own thread<br />
*<br />
* Terminates the own thread normally and shifts to the DORMANT state.<br />
* sceKernelExitThread() is a system call that does not return to the context of the issuer.<br />
*<br />
* Resources (memory, semaphores, etc.) acquired by the terminating thread are not automatically released.<br />
* However, for mutexes only, mutexes that have been locked by the terminating thread are automatically unlocked.<br />
* The mutex is unlocked and not deleted.<br />
*<br />
* When the terminated thread is restarted with sceKernelStartThread(), the information included in the thread<br />
* management area, such as thread priority, is reset.<br />
* It will not inherit the one at the end.<br />
*<br />
* When a thread exits, exitStatus becomes the exit status of that thread.<br />
*<br />
* If the thread is terminated by a return from the entry function without using<br />
* sceKernelExitThread(), the return value of the entry function becomes the termination status.<br />
*<br />
* The end status of a thread can be obtained by sceKernelGetThreadExitStatus() and sceKernelGetThreadInfo(),<br />
* and when another thread waits for the end of the thread by sceKernelWaitThreadEnd(), it can be obtained by the return value.<br />
*<br />
* The thread exit status is saved while the thread exits and is in the DORMANT state,<br />
* but the value is lost if the thread is restarted or deleted with sceKernelStartThread().<br />
*<br />
* @param exitStatus Specify the value to be set for the termination status of the local thread.<br />
* @retval Negative value Error code<br />
*/<br />
SceInt32 sceKernelExitThread(<br />
SceInt32 exitStatus<br />
);<br />
</source><br />
<br />
=== _sceKernelCreateSema ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x0D76458E<br />
|}<br />
<br />
=== sceKernelOpenMsgPipe ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x0E1CB9F6<br />
|}<br />
<br />
=== _sceKernelGetEventFlagInfo ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x106C216F<br />
|}<br />
<br />
=== _sceKernelSetEventWithNotifyCallback ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x118F646E<br />
|}<br />
<br />
=== sceKernelSignalCondTo ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x1269F4EC<br />
|}<br />
<br />
=== sceKernelCloseMsgPipe ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x1305A065<br />
|}<br />
<br />
=== _sceKernelCancelTimer ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x13117B21<br />
|}<br />
<br />
=== sceKernelChangeThreadCpuAffinityMask ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x15129174<br />
|}<br />
<br />
<source lang="C"><br />
/**<br />
* @brief Thread CPU affinity mask setting<br />
*<br />
* Change the CPU affinity mask of the thread specified by threadId to cpuAffinityMask.<br />
* A thread can run only on the CPU specified by the CPU affinity mask.<br />
*<br />
* If the CPU affinity mask of a running thread is changed and cannot be executed on the current CPU, the thread is dispatched immediately.<br />
* As a result of scheduling, if a higher priority thread is running on the newly executable CPU, it is made to wait in the READY state.<br />
*<br />
* However, if the dispatch is disabled, the CPU affinity mask is changed immediately,<br />
* but the rescheduling process is delayed until dispatch is permitted.<br />
*<br />
* @param threadId Specify the identifier of the thread whose CPU affinity mask is to be changed.<br />
* You can specify your own thread with SCE_KERNEL_THREAD_ID_SELF.<br />
* @param cpuAffinityMask Specify the CPU affinity mask after the change.<br />
* The CPU affinity mask is expressed by the logical OR of the following macros.<br />
* - SCE_KERNEL_CPU_MASK_USER_0<br />
* - SCE_KERNEL_CPU_MASK_USER_1<br />
* - SCE_KERNEL_CPU_MASK_USER_2<br />
* The following macros are also available to specify all available CPUs.<br />
* - SCE_KERNEL_CPU_MASK_USER_ALL<br />
* @retval Positive value CPU affinity mask before change<br />
* @retval Negative value Error code<br />
*/<br />
SceInt32 sceKernelChangeThreadCpuAffinityMask(<br />
SceUID threadId,<br />
SceInt32 cpuAffinityMask<br />
);<br />
</source><br />
<br />
=== sceKernelCloseCond ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x15C690E0<br />
|}<br />
<br />
=== sceKernelLockMutex_089 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x16AC80C5<br />
|}<br />
<br />
<source lang="C">int sceKernelLockMutex_089(SceUID mutex_id, int unk1, int unk2);</source><br />
<br />
=== sceKernelUnregisterCallbackFromEvent ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x18462B11<br />
|}<br />
<br />
=== _sceKernelWaitLwCond ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x18C65756<br />
|}<br />
<br />
=== sceKernelUnlockMutex ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x1A372EC8<br />
|}<br />
<br />
=== _sceKernelCancelMutex ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x1B74CB89<br />
|}<br />
<br />
=== sceKernelDeleteThread ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x1BBDE3D9<br />
|}<br />
<br />
<source lang="C"><br />
/**<br />
* @brief Delete thread<br />
*<br />
* Deletes the thread specified by threadId.<br />
*<br />
* Accordingly, the stack area and thread management area are released. The target thread must be in the DORMANT state.<br />
*<br />
* Since the own thread cannot be in the DORMANT state, it cannot be set as the target thread<br />
* (this results in an SCE_KERNEL_ERROR_NOT_DORMANT error).<br />
* Use sceKernelExitDeleteThread() to delete your own thread.<br />
*<br />
* @param threadId Specify the identifier of the thread to be deleted.<br />
* @retval SCE_OK Success<br />
* @retval Negative value Error code<br />
*/<br />
SceInt32 sceKernelDeleteThread(<br />
SceUID threadId<br />
);<br />
</source><br />
<br />
=== _sceKernelCancelSema ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x1CAF805D<br />
|}<br />
<br />
=== sceKernelExitDeleteThread ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x1D17DECF<br />
|}<br />
<br />
<source lang="C"><br />
/**<br />
* @brief End and delete own thread<br />
*<br />
* Terminates the own thread normally and deletes it.<br />
* sceKernelExitDeleteThread() is a system call that does not return to the context of the issuer.<br />
*<br />
* Resources (memory, semaphores, etc.) acquired by the terminating thread are not automatically released.<br />
* However, for mutexes only, mutexes that have been locked by the terminating thread are automatically unlocked.<br />
* The mutex is unlocked and not deleted.<br />
*<br />
* When a thread exits, exitStatus becomes the exit status of that thread (sceKernelExitDeleteThread()<br />
* directly deletes the thread without going through the DORMANT state.<br />
* (It cannot be obtained by sceKernelGetThreadInfo(). The end status can be obtained by the return<br />
* value only when waiting for the end of the thread by sceKernelWaitThreadEnd().)<br />
*<br />
* @param exitStatus Specify the value to be set for the termination status of the local thread.<br />
* @retval Negative value Error code<br />
*/<br />
SceInt32 sceKernelExitDeleteThread(<br />
SceInt32 exitStatus<br />
);<br />
</source><br />
<br />
=== sceKernelUnlockMutex_089 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x1E82E5D0<br />
|}<br />
<br />
<source lang="C">int sceKernelUnlockMutex_089(SceUID mutex_id, int unk1);</source><br />
<br />
=== _sceKernelWaitMultipleEvents ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x200CC503<br />
|}<br />
<br />
=== sceKernelTryLockWriteRWLock ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x206CBB66<br />
|}<br />
<br />
=== sceKernelDeleteSimpleEvent ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x208CFE28<br />
|}<br />
<br />
=== _sceKernelGetThreadCpuAffinityMask ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x212E6C35<br />
|}<br />
<br />
=== _sceKernelGetTimerEventRemainingTime ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x215FD24D<br />
|}<br />
<br />
=== _sceKernelPollEvent ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x21C7913E<br />
|}<br />
<br />
=== sceKernelStartThread_089 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x21F5419B<br />
|}<br />
<br />
<source lang="C"><br />
/**<br />
* @brief Thread activation<br />
*<br />
* Starts the thread specified by threadId and puts it in READY state.<br />
*<br />
* The argument block specified by argSize and argBlock is copied onto the thread stack, argSize is<br />
* passed directly to the first argument of the thread entry function, and the second argument of<br />
* the entry function is the argument copied onto the stack. The block address is passed.<br />
*<br />
* This system call does not queue activation requests. In other words, if the target thread is not<br />
* in the DORMANT state, an SCE_KERNEL_ERROR_NOT_DORMANT error is returned to the calling thread.<br />
*<br />
* @param threadId Specify the identifier of the thread to be started.<br />
* @param argSize Specify the size (byte) of the argument to be passed to the thread.<br />
* @param pArgBlock Specify the address of the argument to be passed to the thread.<br />
* @retval SCE_OK Success<br />
* @retval Negative value Error code<br />
*/<br />
SceInt32 sceKernelStartThread_089(<br />
SceUID threadId,<br />
SceSize argSize,<br />
const void *pArgBlock<br />
);<br />
</source><br />
<br />
=== _sceKernelExitCallback ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x2682E6ED<br />
|}<br />
<br />
=== sceKernelTryLockMutex_089 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x270993A6<br />
|}<br />
<br />
=== sceKernelSetTimerTimeWide ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x273B4A4D<br />
|}<br />
<br />
<source lang="C">int sceKernelSetTimerTimeWide(SceUID timerId, SceUInt64 time);</source><br />
<br />
=== _sceKernelOpenCond ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x27DD11EA<br />
|}<br />
<br />
=== _sceKernelGetThreadmgrUIDClass ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x27EE191B<br />
|}<br />
<br />
=== sceKernelOpenMutex_089 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x2928D2EC<br />
|}<br />
<br />
=== _sceKernelCancelEvent ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x29483405<br />
|}<br />
<br />
=== _sceKernelCreateMsgPipeWithLR ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x2AAC8BFD<br />
|}<br />
<br />
<source lang="C"><br />
typedef struct SceKernelCreateMsgPipeSyscallArgs { // size is 0x10-bytes<br />
SceSize bufSize;<br />
void *opt;<br />
void *lr;<br />
int padding_0x0C:<br />
} SceKernelCreateMsgPipeSyscallArgs;<br />
<br />
int _sceKernelCreateMsgPipeWithLR(const char *name, int type, int attr, SceKernelCreateMsgPipeSyscallArgs *args);<br />
</source><br />
<br />
=== _sceKernelUnlockLwMutex ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x2ABC41DF<br />
|}<br />
<br />
=== _sceKernelGetMsgPipeCreatorId ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x2B751F95<br />
|}<br />
<br />
=== sceKernelCancelCallback ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x30741EF2<br />
|}<br />
<br />
=== sceKernelSetEvent ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x324218CD<br />
|}<br />
<br />
=== _sceKernelGetTimerBaseWide ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x370E147B<br />
|}<br />
<br />
=== _sceKernelGetThreadContextForVM ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x377094D5<br />
|}<br />
<br />
=== _sceKernelCreateEventFlag ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x38AA5E8E<br />
|}<br />
<br />
<source lang="C"><br />
/**<br />
* @brief Event flag generation<br />
*<br />
* Generate an event flag and set the initial value of the event flag. Returns the identifier of the generated event flag as a return value.<br />
*<br />
* @param pName Specifies the name of the eventflag.<br />
* The name of the eventflag does not need to be unique because it is used only for the purpose of operator<br />
* identification when debugging without interprocess communication.<br />
* However, if the SCE_KERNEL_ATTR_OPENABLE attribute is specified for attr,<br />
* a unique name must be specified in the system.<br />
* The maximum name length is 31 bytes.<br />
* @param attr Specifies the event flag attribute.<br />
* Specify the queue order from one of the following.<br />
* - SCE_KERNEL_EVF_ATTR_TH_FIFO: Waiting thread queuing is FIFO<br />
* - SCE_KERNEL_EVF_ATTR_TH_PRIO: Waiting thread queuing is based on the priority of threads.<br />
* Specify whether to wait for multiple threads from either of the following.<br />
* - SCE_KERNEL_EVF_ATTR_SINGLE: Multiple threads cannot wait simultaneously<br />
* - SCE_KERNEL_EVF_ATTR_MULTI: To generate an event flag that can be referenced by<br />
* sceKernelOpenEventFlag() that allows multiple threads to wait simultaneously, specify the following:<br />
* - SCE_KERNEL_ATTR_OPENABLE<br />
* @param initPattern Specifies the initial value of the eventflag.<br />
* @param pOptParam Argument for future expansion. Please specify NULL.<br />
* @retval (>=0) Event flag identifier (UID)<br />
* @retval (<0) Error code<br />
*/<br />
SceUID _sceKernelCreateEventFlag(const char *pName, SceUInt32 attr, SceUInt32 initPattern, const SceKernelEventFlagOptParam *pOptParam);<br />
</source><br />
<br />
=== _sceKernelSetTimerTimeWide ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x39364623<br />
|}<br />
<br />
=== _sceKernelWaitThreadEndCB_0910 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x394BCCF2<br />
|}<br />
<br />
=== _sceKernelSignalCondTo ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x3C00071F<br />
|}<br />
<br />
=== _sceKernelReceiveMsgPipeVector ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x3DD9E4AB<br />
|}<br />
<br />
=== _sceKernelPulseEventWithNotifyCallback ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x3E49D3F1<br />
|}<br />
<br />
=== sceKernelUnlockReadRWLock ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x3EF91145<br />
|}<br />
<br />
=== sceKernelGetTimerTimeWide ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x3EFD3165<br />
|}<br />
<br />
<source lang="C">SceUInt64 sceKernelGetTimerTimeWide(SceUID timerId);</source><br />
<br />
=== _sceKernelCreateCallback ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x3F42E175<br />
|}<br />
<br />
=== _sceKernelWaitEventFlagCB ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x401E0C68<br />
|}<br />
<br />
=== _sceKernelSetEventFlag ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x438917E4<br />
|}<br />
<br />
=== _sceKernelWaitCondCB ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x452B0AB3<br />
|}<br />
<br />
=== _sceKernelWaitSema ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x45389B6B<br />
|}<br />
<br />
=== sceKernelGetSystemTimeLow ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x47F6DE49<br />
|}<br />
<br />
=== sceKernelStartTimer ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x48091E0C<br />
|}<br />
<br />
<source lang="C">int sceKernelStartTimer(SceUID timerId);</source><br />
<br />
=== sceKernelDelayThread ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x4B675D05<br />
|}<br />
<br />
=== _sceKernelClearEvent ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x4B7F47DC<br />
|}<br />
<br />
=== __sceKernelCreateLwMutex ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x4BB3154A<br />
|}<br />
<br />
<source lang="C"><br />
typedef struct sceKernelCreateLwMutex_opt //size is 0x10<br />
{<br />
int initCount;<br />
const SceKernelLwMutexOptParam* pOptParam;<br />
uint32_t unk_8;<br />
uint32_t unk_C;<br />
} sceKernelCreateLwMutex_opt;<br />
<br />
int __sceKernelCreateLwMutex(SceKernelLwMutexWork *pWork, const char *pName, unsigned int attr, sceKernelCreateLwMutex_opt* opt);<br />
</source><br />
<br />
=== sceKernelClearEventFlag ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x4CB87CA7<br />
|}<br />
<br />
=== _sceKernelReceiveMsgPipeVectorCB ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x4DBF648E<br />
|}<br />
<br />
=== _sceKernelNotifyCallback ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x4DF8B624<br />
|}<br />
<br />
=== _sceKernelWaitEvent ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x4E0EA70D<br />
|}<br />
<br />
=== sceKernelOpenSimpleEvent ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x4E1E4DF8<br />
|}<br />
<br />
=== sceKernelGetThreadStackFreeSize ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x4F8A3DA0<br />
|}<br />
<br />
=== _sceKernelWaitSignal ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x50407BF4<br />
|}<br />
<br />
=== _sceKernelTryLockWriteRWLock ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x52DD3322<br />
|}<br />
<br />
=== sceKernelOpenMutex ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x52E17182<br />
|}<br />
<br />
=== sceKernelDeleteEventFlag ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x5840162C<br />
|}<br />
<br />
=== _sceKernelUnregisterCallbackFromEventAll ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x5B5650C7<br />
|}<br />
<br />
=== _sceKernelUnlockWriteRWLock ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x5B746A69<br />
|}<br />
<br />
=== _sceKernelGetCallbackCount ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x5D06FF09<br />
|}<br />
<br />
=== _sceKernelLockReadRWLockCB ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x5D86D763<br />
|}<br />
<br />
=== sceKernelGetTimerBaseWide ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x5DBC1960<br />
|}<br />
<br />
<source lang="C">SceUInt64 sceKernelGetTimerBaseWide(SceUID timerId);</source><br />
<br />
=== _sceKernelSendMsgPipeVector ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x5E65E454<br />
|}<br />
<br />
=== _sceKernelWaitExceptionCB ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x5E7876F2<br />
|}<br />
<br />
=== sceKernelResumeThreadForVM ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-1.61 || not present<br />
|-<br />
| 1.660.011-2.120.011 || 0x5E93840E<br />
|-<br />
| 2.50-3.740.011 || not present<br />
|}<br />
<br />
=== _sceKernelCloseCond ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x650CE348<br />
|}<br />
<br />
=== _sceKernelPMonCpuGetCounter ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x667A4649<br />
|}<br />
<br />
=== _sceKernelGetActiveCpuMask ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x67FDA21B<br />
|}<br />
<br />
=== _sceKernelDeleteCallback ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x68D0FA79<br />
|}<br />
<br />
=== sceKernelGetMutexInfo_089 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x69B78A12<br />
|}<br />
<br />
<source lang="C">int sceKernelGetMutexInfo_089(SceUID mutexid, SceKernelMutexInfo *info);</source><br />
<br />
=== _sceKernelPMonThreadGetCounter ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x6B9711AC<br />
|}<br />
<br />
=== _sceKernelGetLwCondInfo ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x6C79F2F2<br />
|}<br />
<br />
=== sceKernelSignalCond ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x6ED2E2DC<br />
|}<br />
<br />
=== _sceKernelSignalLwCondTo ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x6F1A4A2E<br />
|}<br />
<br />
=== _sceKernelGetTimerTime ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x6F2C41BA<br />
|}<br />
<br />
=== _sceKernelWaitException ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x6F7C4DE6<br />
|}<br />
<br />
=== _sceKernelGetEventPattern ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x70358258<br />
|}<br />
<br />
=== sceKernelGetMsgPipeCreatorId ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x70E2A6D2<br />
|}<br />
<br />
=== _sceKernelSuspendThreadForVM ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.000.071-1.810.021 || 0x7192B01C<br />
|-<br />
| 2.000.081-3.740.011 || not present<br />
|}<br />
<br />
=== sceKernelCancelMutex_089 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x7204B846<br />
|}<br />
<br />
=== _sceKernelWaitLwCondCB ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x72DBB96B<br />
|}<br />
<br />
=== sceKernelTryLockMutex ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x72FC1F54<br />
|}<br />
<br />
=== sceKernelChangeCurrentThreadAttr ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x751C9B7A<br />
|}<br />
<br />
=== _sceKernelDeleteLwCond ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x75FCF058<br />
|}<br />
<br />
=== sceKernelOpenCond ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x76BDA02F<br />
|}<br />
<br />
=== sceKernelRegisterCallbackToEvent ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x76FB37E9<br />
|}<br />
<br />
=== _sceKernelSignalCond ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x79889DAC<br />
|}<br />
<br />
=== _sceKernelCreateTimer ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x79BA0A6D<br />
|}<br />
<br />
=== _sceKernelGetMsgPipeInfo ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x7AE31060<br />
|}<br />
<br />
=== sceKernelClearEvent ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x7B2A4B28<br />
|}<br />
<br />
<source lang="C">SceInt32 sceKernelClearEvent(SceUID eventId, SceUInt32 clearPattern);</source><br />
<br />
=== _sceKernelUnlockReadRWLock ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x7D16FB3B<br />
|}<br />
<br />
=== _sceKernelWaitEventCB ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x7D483C33<br />
|}<br />
<br />
=== _sceKernelLockReadRWLock ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x7EB9E8B5<br />
|}<br />
<br />
=== _sceKernelLockMutex ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x7FA945AD<br />
|}<br />
<br />
=== _sceKernelGetThreadExitStatus_0940 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x800BB137<br />
|}<br />
<br />
=== _sceKernelLockWriteRWLock ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x80191FAA<br />
|}<br />
<br />
=== _sceKernelGetSystemInfo ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x80544E0C<br />
|}<br />
<br />
=== _sceKernelDeleteSema ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x855F49D5<br />
|}<br />
<br />
=== _sceKernelOpenTimer ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x8564E008<br />
|}<br />
<br />
=== _sceKernelGetTimerBase ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x865DA482<br />
|}<br />
<br />
=== sceKernelPollSema ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x866EF048<br />
|}<br />
<br />
=== _sceKernelGetCallbackInfo ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x86761234<br />
|}<br />
<br />
=== sceKernelStopTimer ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x869E9F20<br />
|}<br />
<br />
<source lang="C">int sceKernelStopTimer(SceUID timerId);</source><br />
<br />
=== sceKernelDeleteCond ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x879E6EBD<br />
|}<br />
<br />
=== sceKernelUnregisterCallbackFromEventAll ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x888A7361<br />
|}<br />
<br />
=== _sceKernelGetRWLockInfo ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x8CE3AFC7<br />
|}<br />
<br />
=== sceKernelPulseEvent ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x8D27BAD6<br />
|}<br />
<br />
=== _sceKernelCancelEventWithSetPattern ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x8E68E870<br />
|}<br />
<br />
=== _sceKernelSignalSema ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x8E9A0400<br />
|}<br />
<br />
=== _sceKernelDeleteLwMutex ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x91262C5F<br />
|}<br />
<br />
=== _sceKernelDeleteTimer ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x921A043D<br />
|}<br />
<br />
=== _sceKernelCreateMutex ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x92667AE5<br />
|}<br />
<br />
<source lang="C"><br />
SceUID _sceKernelCreateMutex(const char *pName, SceUInt32 attr, SceInt32 initCount, const SceKernelMutexOptParam *pOptParam);<br />
</source><br />
<br />
=== _sceKernelCreateLwCond ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x940B9EBE<br />
|}<br />
<br />
=== sceKernelCloseEventFlag ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x9A68F547<br />
|}<br />
<br />
=== _sceKernelSetEvent ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x9A92C33F<br />
|}<br />
<br />
=== _sceKernelDeleteRWLock ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x9AA387DF<br />
|}<br />
<br />
=== _sceKernelGetTimerTimeWide ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x9AC39954<br />
|}<br />
<br />
=== _sceKernelRegisterCallbackToEvent ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x9B1922F2<br />
|}<br />
<br />
=== sceKernelDelayThreadCB ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x9C0180E1<br />
|}<br />
<br />
=== _sceKernelCreateSimpleEvent ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x9C187FAD<br />
|}<br />
<br />
=== _sceKernelLockLwMutex ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x9C572180<br />
|}<br />
<br />
=== _sceKernelChangeThreadCpuAffinityMask ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x9C921F8D<br />
|}<br />
<br />
Simply calls sceKernelChangeThreadCpuAffinityMask().<br />
<br />
<source lang="C"><br />
/**<br />
* @brief Thread CPU affinity mask setting<br />
*<br />
* Change the CPU affinity mask of the thread specified by threadId to cpuAffinityMask.<br />
* A thread can run only on the CPU specified by the CPU affinity mask.<br />
*<br />
* If the CPU affinity mask of a running thread is changed and cannot be executed on the current CPU, the thread is dispatched immediately.<br />
* As a result of scheduling, if a higher priority thread is running on the newly executable CPU, it is made to wait in the READY state.<br />
*<br />
* However, if the dispatch is disabled, the CPU affinity mask is changed immediately,<br />
* but the rescheduling process is delayed until dispatch is permitted.<br />
*<br />
* @param threadId Specify the identifier of the thread whose CPU affinity mask is to be changed.<br />
* You can specify your own thread with SCE_KERNEL_THREAD_ID_SELF.<br />
* @param cpuAffinityMask Specify the CPU affinity mask after the change.<br />
* The CPU affinity mask is expressed by the logical OR of the following macros.<br />
* - SCE_KERNEL_CPU_MASK_USER_0<br />
* - SCE_KERNEL_CPU_MASK_USER_1<br />
* - SCE_KERNEL_CPU_MASK_USER_2<br />
* The following macros are also available to specify all available CPUs.<br />
* - SCE_KERNEL_CPU_MASK_USER_ALL<br />
* @retval Positive value CPU affinity mask before change<br />
* @retval Negative value Error code<br />
*/<br />
SceInt32 _sceKernelChangeThreadCpuAffinityMask(<br />
SceUID threadId,<br />
SceInt32 cpuAffinityMask<br />
);<br />
</source><br />
<br />
=== _sceKernelOpenMutex ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0x9D291788<br />
|}<br />
<br />
=== sceKernelGetProcessId ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x9DCB4B7A<br />
|}<br />
<br />
=== sceKernelCloseSema ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xA2D81F9E<br />
|}<br />
<br />
=== sceKernelCloseMutex_089 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xA35427EE<br />
|}<br />
<br />
=== sceKernelNotifyCallback ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xA4683592<br />
|}<br />
<br />
=== _sceKernelCloseMsgPipe ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xAA888831<br />
|}<br />
<br />
=== sceKernelDeleteTimer ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xAB1E42C4<br />
|}<br />
<br />
<source lang="C">int sceKernelDeleteTimer(SceUID timerId);</source><br />
<br />
=== _sceKernelGetTimerInfo ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xAC7FE4F3<br />
|}<br />
<br />
=== sceKernelCloseTimer ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xACE60E4A<br />
|}<br />
<br />
<source lang="C">int sceKernelCloseTimer(SceUID timerId);</source><br />
<br />
=== _sceKernelCreateRWLock ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xB1877F5E<br />
|}<br />
<br />
=== sceKernelCreateCallback ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xB19CF7E9<br />
|}<br />
<br />
=== _sceKernelGetThreadInfo ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0xB373D8A1<br />
|}<br />
<br />
<source lang="c"><br />
typedef struct get_thread_info_opt<br />
{<br />
uint32_t size; // size of SceKernelThreadInfo<br />
uint32_t unk;<br />
}get_thread_info_opt;<br />
<br />
int _sceKernelGetThreadInfo(SceUID thid, SceKernelThreadInfo *info, get_thread_info_opt* opt)<br />
</source><br />
<br />
=== _sceKernelTrySendMsgPipeVector ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xB3D600AB<br />
|}<br />
<br />
=== sceKernelUnlockWriteRWLock ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xB4151397<br />
|}<br />
<br />
=== _sceKernelGetThreadStackFreeSize ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xB5EC061A<br />
|}<br />
<br />
=== _sceKernelDeleteMsgPipe ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xB6D50FCC<br />
|}<br />
<br />
=== sceKernelOpenTimer ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xB6E286E7<br />
|}<br />
<br />
<source lang="C">SceUID sceKernelOpenTimer(const char *name);</source><br />
<br />
=== _sceKernelGetSystemTime ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xB70EBAE9<br />
|}<br />
<br />
=== _sceKernelChangeThreadVfpException ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xB8F165B4<br />
|}<br />
<br />
=== _sceKernelOpenSema ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xB96FED7D<br />
|}<br />
<br />
=== _sceKernelGetThreadTLSAddr ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xBACA6891<br />
|}<br />
<br />
=== sceKernelOpenEventFlag ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xBC19F8A1<br />
|}<br />
<br />
=== _sceKernelTryLockMutex ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xBCFB867F<br />
|}<br />
<br />
=== sceKernelChangeThreadPriority ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xBD0139F2<br />
|}<br />
<br />
=== sceKernelCreateThreadForUser ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0xC0FAF6A3<br />
|}<br />
<br />
<source lang="C"><br />
/**<br />
* @brief Thread generation that operates in the address space of its own process<br />
*<br />
* A thread that operates in the address space of its own process is created.<br />
*<br />
* Allocate a thread management area for the thread to be created, perform initialization, and secure a stack area.<br />
* The thread information to be created is specified as an argument, and the thread identifier (UID) is returned as the return value.<br />
*<br />
* The generated thread is in the DORMANT state.<br />
*<br />
* @param pName Specifies the name of the thread.<br />
* The name of the thread does not have to be unique because it is<br />
* used by the operator to identify it when debugging. The maximum name length is 31 bytes.<br />
* @param entry Specify the entry address of the thread. The thread entry point function<br />
* can receive memory block data with two arguments.<br />
* The argument is given by sceKernelStartThread() described later.<br />
* The thread is terminated by returning from this function, and the return value of the function is the thread termination status.<br />
* @param initPriority Specifies the initial priority of the thread. The smaller the number, the higher the priority.<br />
* The range from SCE_KERNEL_HIGHEST_PRIORITY_USER (= 64) to SCE_KERNEL_LOWEST_PRIORITY_USER (= 191) can be used.<br />
* By specifying SCE_KERNEL_DEFAULT_PRIORITY_USER, you can specify the default priority of the process to which the thread belongs.<br />
* For the default priority, it is also possible to specify with SCE_KERNEL_DEFAULT_PRIORITY_USER ± offset.<br />
* @param stackSize Specify the required stack size of the thread in bytes. The argument block given by<br />
* sceKernelStartThread () is copied onto the stack, so specify the stack size with this margin in mind.<br />
* An error will occur if a stack size less than 4 KiB is specified.<br />
* @param attr You can specify multiple thread attributes by logical OR.<br />
* @param cpuAffinityMask Specifies the initial CPU affinity mask for the thread.<br />
* A thread can run only on the thread specified in the CPU affinity mask.<br />
* The CPU affinity mask can be specified by the logical sum of the following macros.<br />
* - SCE_KERNEL_CPU_MASK_USER_0<br />
* - SCE_KERNEL_CPU_MASK_USER_1<br />
* - SCE_KERNEL_CPU_MASK_USER_2<br />
* The following macros are also available to represent all available CPUs.<br />
* - SCE_KERNEL_CPU_MASK_USER_ALL<br />
* @param pOptParam Argument for future expansion. Please specify NULL. Max size is 0x14.<br />
* @retval Positive value Thread identifier (UID)<br />
* @retval Negative value Error code<br />
*/<br />
SceUID sceKernelCreateThreadForUser(<br />
const char *pName,<br />
SceKernelThreadEntry entry,<br />
SceInt32 initPriority,<br />
SceSize stackSize,<br />
SceUInt32 attr,<br />
SceInt32 cpuAffinityMask,<br />
const SceKernelThreadOptParam *pOptParam<br />
);<br />
</source><br />
<br />
=== _sceKernelSendSignal ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xC21FC992<br />
|}<br />
<br />
=== _sceKernelCloseRWLock ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xC239DBCC<br />
|}<br />
<br />
=== sceKernelSignalCondAll ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xC2E7AC22<br />
|}<br />
<br />
=== _sceKernelStartThread ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xC30B1745<br />
|}<br />
<br />
<source lang="C"><br />
/**<br />
* @brief Thread activation<br />
*<br />
* Starts the thread specified by threadId and puts it in READY state.<br />
*<br />
* The argument block specified by argSize and argBlock is copied onto the thread stack, argSize is<br />
* passed directly to the first argument of the thread entry function, and the second argument of<br />
* the entry function is the argument copied onto the stack. The block address is passed.<br />
*<br />
* This system call does not queue activation requests. In other words, if the target thread is not<br />
* in the DORMANT state, an SCE_KERNEL_ERROR_NOT_DORMANT error is returned to the calling thread.<br />
*<br />
* @param threadId Specify the identifier of the thread to be started.<br />
* @param argSize Specify the size (byte) of the argument to be passed to the thread.<br />
* @param pArgBlock Specify the address of the argument to be passed to the thread.<br />
* @retval SCE_OK Success<br />
* @retval Negative value Error code<br />
*/<br />
SceInt32 _sceKernelStartThread(<br />
SceUID threadId,<br />
SceSize argSize,<br />
const void *pArgBlock<br />
);<br />
</source><br />
<br />
=== _sceKernelSignalLwCond ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xC37F6983<br />
|}<br />
<br />
=== _sceKernelStartTimer ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xC3ED6E4A<br />
|}<br />
<br />
=== _sceKernelCloseSimpleEvent ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xC6FFE335<br />
|}<br />
<br />
=== _sceKernelGetThreadRunStatus ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xC7FB5497<br />
|}<br />
<br />
=== sceKernelGetThreadmgrUIDClass ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xC9678F7F<br />
|}<br />
<br />
=== _sceKernelStopTimer ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xC96F4269<br />
|}<br />
<br />
=== sceKernelDeleteMutex ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xCB78710D<br />
|}<br />
<br />
=== sceKernelOpenSema ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xCBE235C7<br />
|}<br />
<br />
=== _sceKernelCreateCond ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xCC14FA59<br />
|}<br />
<br />
=== sceKernelChangeThreadVfpException ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xCC18FBAE<br />
|}<br />
<br />
=== sceKernelOpenRWLock ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xCE510196<br />
|}<br />
<br />
=== _sceKernelCancelMsgPipe ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xCE769C83<br />
|}<br />
<br />
=== _sceKernelWaitSignalCB ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xCEA3FC52<br />
|}<br />
<br />
=== _sceKernelCancelRWLock ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xD004EA15<br />
|}<br />
<br />
=== sceKernelLockMutexCB_089 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0xD06F2886<br />
|}<br />
<br />
=== _sceKernelGetThreadExitStatus ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xD3210C08<br />
|}<br />
<br />
=== _sceKernelWaitThreadEnd_0910 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xD38231C9<br />
|}<br />
<br />
=== sceKernelDeleteCallback ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xD469676B<br />
|}<br />
<br />
=== _sceKernelSetThreadContextForVM ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xD4785C41<br />
|}<br />
<br />
=== sceKernelSendSignal ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xD4C367B2<br />
|}<br />
<br />
=== _sceKernelDeleteCond ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xD99F51D3<br />
|}<br />
<br />
=== sceKernelCheckWaitableStatus ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0xD9BD74EB<br />
|}<br />
<br />
=== _sceKernelGetLwCondInfoById ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xD9E78D30<br />
|}<br />
<br />
=== _sceKernelPollEventFlag ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xDAB1B1C8<br />
|}<br />
<br />
<source lang="C"><br />
/**<br />
* @brief Event flag polling<br />
*<br />
* Polls the event flag specified by evfId.<br />
*<br />
* sceKernelPollEventFlag() is a system call that removes the function to enter standby state from sceKernelWaitEventFlag().<br />
* Unlike sceKernelWaitEventFlag(), an error (SCE_KERNEL_ERROR_EVF_COND) is returned immediately if the wait release condition is not satisfied.<br />
* In this case, SCE_KERNEL_EVF_WAITMODE_CLEAR_ALL / SCE_KERNEL_EVF_WAITMODE_CLEAR_PAT specification is ignored.<br />
*<br />
* @param evfId Specify the event flag identifier to be polled.<br />
* @param bitPattern Specify the comparison value with the eventflag.<br />
* @param waitMode Specify the wait mode. Specify one of the following:<br />
* - SCE_KERNEL_EVF_WAITMODE_AND: Waiting for AND<br />
* - SCE_KERNEL_EVF_WAITMODE_OR : Wait for OR<br />
* In addition, you can optionally add one of the following specifications as a logical sum.<br />
* - SCE_KERNEL_EVF_WAITMODE_CLEAR_ALL: Clear all bits after waiting<br />
* - SCE_KERNEL_EVF_WAITMODE_CLEAR_PAT: After waiting, clear the bit specified in bitPattern<br />
* @param pResultPat Specify a pointer to the SceUInt32 type variable that receives the eventflag value when waiting is established.<br />
* @retval SCE_OK Success<br />
* @retval (<0) Error code<br />
*/<br />
SceInt32 _sceKernelPollEventFlag(SceUID evfId, SceUInt32 bitPattern, SceUInt32 waitMode, SceUInt32 *pResultPat);<br />
</source><br />
<br />
=== sceKernelDeleteSema ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xDB32948A<br />
|}<br />
<br />
=== _sceKernelLockMutexCB ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xDB9F5333<br />
|}<br />
<br />
=== _sceKernelLockWriteRWLockCB ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xDBD09B09<br />
|}<br />
<br />
=== _sceKernelOpenRWLock ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xDFCEE5AB<br />
|}<br />
<br />
=== _sceKernelDeleteMutex ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xE0A6D759<br />
|}<br />
<br />
=== _sceKernelSetTimerEvent ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xE2C0BFEF<br />
|}<br />
<br />
=== _sceKernelOpenSimpleEvent ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xE326EA7A<br />
|}<br />
<br />
=== sceKernelCheckCallback ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0xE53E41F6<br />
|}<br />
<br />
=== _sceKernelChangeThreadPriority ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xE61C2B06<br />
|}<br />
<br />
=== sceKernelSignalSema ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xE6B761D1<br />
|}<br />
<br />
=== sceKernelDeleteRWLock ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xE73649CA<br />
|}<br />
<br />
=== sceKernelDeleteMsgPipe ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xE78BCCF7<br />
|}<br />
<br />
=== _sceKernelCloseSema ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xE8C03447<br />
|}<br />
<br />
=== _sceKernelGetMutexInfo ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0xE8CC3DF0<br />
|}<br />
<br />
<source lang="C"><br />
int _sceKernelGetMutexInfo(SceUID mutexid, SceKernelMutexInfo *pInfo, SceKernelMutexOptParam* pOpt);<br />
</source><br />
<br />
=== _sceKernelWaitThreadEnd ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xEA5C52F5<br />
|}<br />
<br />
=== _sceKernelTryLockReadRWLock ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xEB9054B2<br />
|}<br />
<br />
=== sceKernelSetEventFlag ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xEC94DFF7<br />
|}<br />
<br />
=== sceKernelTryLockReadRWLock ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xEFDDA456<br />
|}<br />
<br />
=== _sceKernelClearEventFlag ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xF0526CE2<br />
|}<br />
<br />
=== sceKernelGetThreadCpuAffinityMask ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xF1AE5654<br />
|}<br />
<br />
=== sceKernelWaitThreadEnd_089 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0xF3489EF4<br />
|}<br />
<br />
=== sceKernelGetSystemTimeWide ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0xF4EE4FA9<br />
|}<br />
<br />
=== _sceKernelPulseEvent ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xF6A0FE84<br />
|}<br />
<br />
=== _sceKernelCloseEventFlag ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xF6CFB4F1<br />
|}<br />
<br />
=== _sceKernelSendMsgPipeVectorCB ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xF6D515DC<br />
|}<br />
<br />
=== _sceKernelDeleteSimpleEvent ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xF7413EC7<br />
|}<br />
<br />
=== _sceKernelCancelEventFlag ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xF76F3056<br />
|}<br />
<br />
=== _sceKernelWaitSemaCB ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xF8E06784<br />
|}<br />
<br />
=== _sceKernelWaitThreadEndCB ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xFA3D4491<br />
|}<br />
<br />
=== _sceKernelOpenEventFlag ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xFA64FB37<br />
|}<br />
<br />
=== _sceKernelUnregisterCallbackFromEvent ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xFB66565E<br />
|}<br />
<br />
=== _sceKernelWaitEventFlag ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xFCE2F728<br />
|}<br />
<br />
<source lang="C"><br />
/**<br />
* @brief Event flag wait<br />
*<br />
* This system call waits for the event flag specified by evfId to be set according to the wait release condition specified by waitMode.<br />
* If the event flag specified by evfId already satisfies the wait release condition specified by waitMode,<br />
* the issuing thread continues execution without transitioning to the waiting state (WAITING).<br />
*<br />
* When SCE_KERNEL_EVF_WAITMODE_AND is specified for waitMode, it waits until all the bits specified by bitPattern become 1.<br />
* If SCE_KERNEL_EVF_WAITMODE_OR is specified for waitMode, wait until one of the bits specified in bitPattern becomes 1.<br />
* If SCE_KERNEL_EVF_WAITMODE_CLEAR_ALL is additionally specified for waitMode, all the eventflag bits<br />
* are cleared to 0 when the wait release condition is satisfied and this thread is released.<br />
* If SCE_KERNEL_EVF_WAITMODE_CLEAR_PAT is additionally specified for waitMode, the bit specified<br />
* by bitPattern is cleared to 0 when the wait release condition is satisfied and this thread is released.<br />
*<br />
* The event flag value is returned to pResultPat in the following cases. NULL can be specified if no value is required.<br />
* - If the wait release condition is satisfied (SCE_OK is returned),<br />
* the event flag value before clearing by specifying SCE_KERNEL_EVF_WAITMODE_CLEAR_ALL,<br />
* SCE_KERNEL_EVF_WAITMODE_CLEAR_PAT is returned immediately after the condition is satisfied.<br />
* - After exiting the wait state, the event flag value just before exiting from the wait state is returned when<br />
* exiting except when the wait release condition is satisfied (when SCE_KERNEL_ERROR_WAIT_CANCEL,<br />
* SCE_KERNEL_ERROR_WAIT_DELETE, SCE_KERNEL_ERROR_WAIT_TIMEOUT errors are returned).<br />
* When canceling with sceKernelCancelEventFlag(), the eventflag value set at the time of cancellation is returned.<br />
*<br />
* When pTimeout is specified, the timeout operation specified in microseconds is set.<br />
* If pTimeout is NULL, timeout operation is not performed.<br />
* Note that if pTimeout is specified, the value pointed to by pTimeout is updated when the system call ends.<br />
* If the condition is met within the time, it is updated with the remaining time. If not established,<br />
* the value pointed to by pTimeout is updated with 0. In this case, error SCE_KERNEL_ERROR_WAIT_TIMEOUT is returned.<br />
*<br />
* Another thread cannot execute sceKernelWaitEventFlag() and sceKernelPollEventFlag() for an event flag with<br />
* the SCE_KERNEL_EVF_ATTR_SINGLE attribute that already has a waiting thread.<br />
* In this case, an error is returned immediately to the thread that executed sceKernelWaitEventFlag() or sceKernelPollEventFlag() later.<br />
*<br />
* If multiple threads are waiting for an event flag with the SCE_KERNEL_EVF_ATTR_MULTI attribute, a thread queue is created.<br />
* In this case, a single sceKernelSetEventFlag() may release the waiting status of multiple threads.<br />
*<br />
* In the case of the event flag of the SCE_KERNEL_EVF_ATTR_TH_FIFO attribute, the thread queue is<br />
* arranged in the order in which it waits first.<br />
* In the event flag of the SCE_KERNEL_EVF_ATTR_TH_PRIO attribute, the thread with the highest<br />
* priority among the waiting threads starts first and is arranged in the order of thread priority.<br />
*<br />
* If there is a thread with SCE_KERNEL_EVF_WAITMODE_CLEAR_ALL specified or SCE_KERNEL_EVF_WAITMODE_CLEAR_PAT specified in the<br />
* queue and the wait release condition for that thread is satisfied, the event flag is cleared at the same time as the wait release.<br />
* Threads that are lined up behind the thread that has specified SCE_KERNEL_EVF_WAITMODE_CLEAR_ALL or SCE_KERNEL_EVF_WAITMODE_CLEAR_PAT<br />
* will see the event flag after being cleared, so the wait may not be released.<br />
*<br />
* @param evfId Specifies the identifier of the event flag to wait for.<br />
* @param bitPattern Specify the comparison value with the eventflag.<br />
* @param waitMode Specifies the wait mode. Specify one of the following:<br />
* - SCE_KERNEL_EVF_WAITMODE_AND: Waiting for AND<br />
* - SCE_KERNEL_EVF_WAITMODE_OR : Wait for OR<br />
* In addition, you can optionally add either of the following specifications as a logical sum.<br />
* - SCE_KERNEL_EVF_WAITMODE_CLEAR_ALL: After waiting, clear all bits<br />
* - SCE_KERNEL_EVF_WAITMODE_CLEAR_PAT: After waiting, clear the bit specified in bitPattern<br />
* @param pResultPat Specifies a pointer to the SceUInt32 type variable that receives the eventflag value when waiting is established.<br />
* If NULL is specified, the event flag value is not received.<br />
* @param pTimeout Specify a pointer to the SceUInt32 type variable that stores the upper limit (microseconds) of the waiting time.<br />
* If NULL is specified, wait indefinitely. When the wait condition is satisfied, the remaining time is returned.<br />
* @retval SCE_OK Success<br />
* @retval (<0) Error code<br />
*/<br />
SceInt32 _sceKernelWaitEventFlag(SceUID evfId, SceUInt32 bitPattern, SceUInt32 waitMode, SceUInt32 *pResultPat, SceUInt32 *pTimeout);<br />
</source><br />
<br />
=== sceKernelCloseRWLock ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xFD5BD5C1<br />
|}<br />
<br />
=== _sceKernelGetLwMutexInfoById ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xFEC9E946<br />
|}<br />
<br />
=== sceKernelCloseSimpleEvent ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xFEF4CA53<br />
|}<br />
<br />
=== _sceKernelSetTimerTime ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69 || 0xFF738CD9<br />
|}<br />
<br />
=== _sceKernelRegisterThreadEventHandler ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || not present<br />
|-<br />
| 3.60 || 0xCE6B49D8<br />
|}<br />
<br />
<source lang="C"><br />
typedef struct sceKernelRegisterThreadEventHandlerOpt { // size is 0x10 on FW 3.60<br />
SceKernelThreadEventHandler *handler;<br />
void *common;<br />
int reserved0;<br />
int reserved1;<br />
} sceKernelRegisterThreadEventHandlerOpt;<br />
<br />
int _sceKernelRegisterThreadEventHandler(char *name, SceUID thread_id, SceUInt32 mask, sceKernelRegisterThreadEventHandlerOpt *pOpt);<br />
</source><br />
<br />
== SceThreadmgrCoredumpTime ==<br />
<br />
=== sceKernelExitThread ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x0C8A38E1<br />
|}<br />
<br />
<source lang="C"><br />
/**<br />
* @brief End of own thread<br />
*<br />
* Terminates the own thread normally and shifts to the DORMANT state.<br />
* sceKernelExitThread() is a system call that does not return to the context of the issuer.<br />
*<br />
* Resources (memory, semaphores, etc.) acquired by the terminating thread are not automatically released.<br />
* However, for mutexes only, mutexes that have been locked by the terminating thread are automatically unlocked.<br />
* The mutex is unlocked and not deleted.<br />
*<br />
* When the terminated thread is restarted with sceKernelStartThread(), the information included in the thread<br />
* management area, such as thread priority, is reset.<br />
* It will not inherit the one at the end.<br />
*<br />
* When a thread exits, exitStatus becomes the exit status of that thread.<br />
*<br />
* If the thread is terminated by a return from the entry function without using<br />
* sceKernelExitThread(), the return value of the entry function becomes the termination status.<br />
*<br />
* The end status of a thread can be obtained by sceKernelGetThreadExitStatus() and sceKernelGetThreadInfo(),<br />
* and when another thread waits for the end of the thread by sceKernelWaitThreadEnd(), it can be obtained by the return value.<br />
*<br />
* The thread exit status is saved while the thread exits and is in the DORMANT state,<br />
* but the value is lost if the thread is restarted or deleted with sceKernelStartThread().<br />
*<br />
* @param exitStatus Specify the value to be set for the termination status of the local thread.<br />
* @retval Negative value Error code<br />
*/<br />
SceInt32 sceKernelExitThread(<br />
SceInt32 exitStatus<br />
);<br />
</source><br />
<br />
[[Category:ARM]]<br />
[[Category:Kernel]]<br />
[[Category:Modules]]<br />
[[Category:Library]]</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=SceDeci4pSDfMgr&diff=21124
SceDeci4pSDfMgr
2024-02-18T17:51:23Z
<p>CreepNT: /* Types */ Correct structure field names and descriptions again</p>
<hr />
<div>== Module ==<br />
<br />
This module exists only in non-secure world. The SELF can be found in <code>os0:kd/deci4p_sdfmgr.skprx</code>.<br />
{| class="wikitable"<br />
|-<br />
! Version !! World !! Privilege<br />
|-<br />
| 0.990-3.65 || Non-secure || Kernel<br />
|}<br />
<br />
== Libraries ==<br />
<br />
=== Known NIDs ===<br />
<br />
{| class="wikitable"<br />
|-<br />
! Version !! Name !! World !! Visibility !! NID<br />
|-<br />
| 0.990-3.65 || [[SceDeci4pSDfMgr#SceDeci4pSDfMgrForKernel|SceDeci4pSDfMgrForKernel]] || Non-secure || Kernel || 0xA1386CB2<br />
|}<br />
<br />
== Types ==<br />
<br />
<source lang="C"><br />
//Error codes (guessed names)<br />
#define SCE_DECI_SYS_ERROR_INVALID_ARGUMENT (-2146893823) //<! 0x80090001<br />
#define SCE_DECI_SYS_ERROR_INVALID_SOCKET (-2146893822) //<! 0x80090002 - ExSend returns INVALID_ARGUMENT on a bad socket though :x<br />
#define SCE_DECI_SYS_ERROR_ALREADY_REGISTERED (-2146893821) //<! 0x80090003<br />
#define SCE_DECI_SYS_ERROR_NO_ENTRY (-2146893820) //<! 0x80090004 - no free entry to create socket remaining<br />
#define SCE_DECI_SYS_ERROR_ILLEGAL_ADDR (-2146893819) //<! 0x80090005 - unexpected NULL provided<br />
#define SCE_DECI_SYS_ERROR_INVALID_ARGUMENT_SIZE (-2146893818) //<! 0x80090006<br />
#define SCE_DECI_SYS_ERROR_BLOCKED (-2146893817) //<! 0x80090007<br />
#define SCE_DECI_SYS_ERROR_UNKNOWN_A (-2146893814) //<! 0x8009000A<br />
#define SCE_DECI_SYS_ERROR_NO_HOST_IF (-2146893811) //<! 0x8009000D - no Host Interface<br />
<br />
#define SCE_SDFMGR_EXCP_TYPE_PABT (0)<br />
#define SCE_SDFMGR_EXCP_TYPE_DABT (1)<br />
#define SCE_SDFMGR_EXCP_TYPE_UNDEF (2)<br />
#define SCE_SDFMGR_EXCP_TYPE_BUS (3)<br />
<br />
typedef int (* SceSDfMgrExceptionCallback)(SceExcpmgrExceptionContext *context, SceUInt32 pc, SceUInt32 cpsr);<br />
<br />
typedef SceInt32 SceSDfMgrSocketId;<br />
<br />
#define SCE_DFMGR_EVENT_READ (1) // Protocol data available to read<br />
#define SCE_DFMGR_EVENT_READDONE (2) // Protocol data read<br />
#define SCE_DFMGR_EVENT_WRITE (3) // Protocol data available to send<br />
#define SCE_DFMGR_EVENT_WRITEDONE (4) // Protocol data sent<br />
#define SCE_DFMGR_EVENT_CHSTATUS (5) // Protocol status change?<br />
#define SCE_DFMGR_EVENT_ERROR (6) // ?Protocol? error occured<br />
<br />
typedef void (* SceSDfMgrEventHandler)(SceUInt32 event, void* eventData, void* pCommon); //<! pCommon is the data passed to Open/ExOpen<br />
<br />
typedef struct _SceSDfMgrOpenParam {<br />
SceSize size; //<! Size of this structure (0x1C)<br />
SceUInt32 clientId; //<! SDfMgr client ID (used as protocol ID for this service)<br />
SceUInt32 uAliasId; //<! Protocol alias ID<br />
SceUInt32 uVersion; //<! Protocol version<br />
SceUInt32 uVersionLimit;<br />
SceUInt16 unk14;<br />
SceUInt16 flags;<br />
char* name; //<! Protocol name - example: DCMP<br />
} SceSDfMgrOpenParam;<br />
<br />
/* For flags */<br />
#define SCE_SDFMGR_OPENPARAM_FLAG_ALIAS_PROTOCOL (0x0002) /* If present, register 'uAliasId' as an alias ID for protocol 'clientId' */<br />
<br />
typedef void (* SceSDfMgrBreakHook)(void);<br />
</source><br />
<br />
== SceDeci4pSDfMgrForKernel ==<br />
<br />
=== sceSDfMgrOpenForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xA55F5F0D<br />
|}<br />
<br />
Acquires an interrupt-suspending lock and calls [[SceDeci4pSDfMgr#sceSDfMgrExOpenForKernel|sceSDfMgrExOpenForKernel]].<br />
<br />
<source lang="C">SceSDfMgrSocketId sceSDfMgrOpenForKernel(SceSDfMgrEventHandler eventHandler, const SceSDfMgrOpenParam* openParam, void* pCommon);</source><br />
<br />
=== sceSDfMgrExOpenForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xCF4A3E03<br />
|}<br />
<br />
Opens a SDfMgr socket. <code>openParam</code> is not retained and can be disposed of after this call.<br />
<br />
<source lang="C">SceSDfMgrSocketId sceSDfMgrExOpenForKernel(SceSDfMgrEventHandler eventHandler, const SceSDfMgrOpenParam* openParam, void* pCommon);</source><br />
<br />
=== sceSDfMgrExSendForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xDAFE03AD<br />
|}<br />
<br />
Sends up to <code>bufLen</code> bytes from <code>buffer</code>, and returns number of bytes sent on success.<br />
<br />
Note that <code>buffer</code> is not '''<code>const</code>''': this is not a typo. <code>buffer</code> may be written to under specific conditions.<br />
<br />
<source lang="C">SceSSize sceSDfMgrExSendForKernel(SceSDfMgrSocketId sock, void* buffer, SceSize bufLen);</source><br />
<br />
=== sceSDfMgrExReqSendForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xB44083E1<br />
|}<br />
<br />
=== sceSDfMgrExRecvForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xF43F5941<br />
|}<br />
<br />
Receives up to <code>bufLen</code> bytes in <code>buffer</code>, and returns number of bytes received on success.<br />
<br />
<source lang="C">SceSSize sceSDfMgrExRecvForKernel(SceSDfMgrSocketId sock, void* buffer, SceSize bufLen);</source><br />
<br />
=== sceSDfMgrCloseForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x86CFC8C6<br />
|}<br />
<br />
Acquires an interrupt-suspending lock and calls [[SceDeci4pSDfMgr#sceSDfMgrExCloseForKernel|sceSDfMgrExCloseForKernel]].<br />
<br />
<source lang="C">SceInt32 sceSDfMgrCloseForKernel(SceSDfMgrSocketId sock);</source><br />
<br />
=== sceSDfMgrExCloseForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x90E8D453<br />
|}<br />
<br />
Close a SDfMgr socket.<br />
<br />
<source lang="C">SceInt32 sceSDfMgrExCloseForKernel(SceSDfMgrSocketId sock);</source><br />
<br />
=== sceSDfMgrBreakSystemForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xEDFBA012<br />
|}<br />
<br />
Sets up some internal state and calls <code>[[SceKernelIntrMgr#sceKernelGenerateSoftIntrForDriver]](0, 1, 0)</code>.<br />
<br />
<source lang="C">SceInt32 sceSDfMgrBreakSystemForKernel(void);</source><br />
<br />
=== sceSDfMgrContinueSystemForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x9A653F19<br />
|}<br />
<br />
Sets up some internal state and calls <code>sceKernelGenerateSoftIntrForDriver(0, 1, 0)</code>.<br />
<br />
<source lang="C">SceInt32 sceSDfMgrContinueSystemForKernel(void);</source><br />
<br />
=== SceDeci4pSDfMgrForKernel_A963E333 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xA963E333<br />
|}<br />
<br />
Calls <code>[[SceDeci4pSDfMgr#sceSDfMgrExReqSend|sceSDfMgrExReqSend]](sock)</code>, then may call an Host Interface function and/or call <code>sceKernelGenerateSoftIntrForDriver(1, 0, targetLUT[sceKernelCpuId()])</code> where <code>targetLUT = {1, 2, 4, 8}</code>.<br />
<br />
<source lang="C">SceInt32 SceDeci4pSDfMgrForKernel_A963E333(SceSDfMgrSocketId sock);</source><br />
<br />
=== SceDeci4pSDfMgrForKernel_98AEC60E ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x98AEC60E<br />
|}<br />
<br />
=== SceDeci4pSDfMgrForKernel_FFC95B63 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xFFC95B63<br />
|}<br />
<br />
Equivalent to [[SceDeci4pDfMgr#SceDeci4pDfMgrForDebugger_6D26CC56|SceDeci4pDfMgrForDebugger_6D26CC56]].<br />
<br />
Writes <code>val</code> as a 3-byte unsigned integer to <code>ptr</code>.<br />
<br />
<source lang="C">void SceDeci4pSDfMgrForKernel_FFC95B63(void* ptr, SceUInt32 val);</source><br />
<br />
=== SceDeci4pSDfMgrForKernel_68903C1D ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x68903C1D<br />
|}<br />
<br />
Equivalent to [[SceDeci4pDfMgr#SceDeci4pDfMgrForDebugger_CACAB5F9|SceDeci4pDfMgrForDebugger_CACAB5F9]].<br />
<br />
Reads value at <code>ptr</code> as a 3-byte unsigned integer and returns it.<br />
<br />
<source lang="C">SceUInt32 SceDeci4pSDfMgrForKernel_68903C1D(void* ptr);</source><br />
<br />
=== SceDeci4pSDfMgrForKernel_81E7C5BD ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x81E7C5BD<br />
|}<br />
<br />
Special <code>memset</code> variant. <code>len</code> will be aligned '''down''' to meet 4-byte alignment requirement (i.e. bottom 2 bits of <code>len</code> are ignored).<br />
<br />
<source lang="C">void* SceDeci4pSDfMgrForKernel_81E7C5BD(void* dst, int ch, size_t len);</source><br />
<br />
=== SceDeci4pSDfMgrForKernel_5996E2DB ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x5996E2DB<br />
|}<br />
<br />
Equivalent to <code>memcpy</code>.<br />
<br />
<source lang="C">void* SceDeci4pSDfMgrForKernel_8A3B06F2(void* dst, void* src, size_t len);</source><br />
<br />
=== SceDeci4pSDfMgrForKernel_8A3B06F2 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x8A3B06F2<br />
|}<br />
<br />
Equivalent to <code>memset</code>.<br />
<br />
<source lang="C">void* SceDeci4pSDfMgrForKernel_8A3B06F2(void* dst, int ch, size_t len);</source><br />
<br />
=== SceDeci4pSDfMgrForKernel_CCD56670 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || 0xCCD56670<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
Equivalent to <code>memchr</code>.<br />
<br />
<source lang="C">void* SceDeci4pSDfMgrForKernel_CCD56670(void* s, int ch, size_t len);</source><br />
<br />
=== SceDeci4pSDfMgrForKernel_501CE61D ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x501CE61D<br />
|}<br />
<br />
This is a <code>printf</code>-like function.<br />
<br />
<source lang="C">size_t SceDeci4pSDfMgrForKernel_501CE61D(char* fmt, ...);</source><br />
<br />
=== SceDeci4pSDfMgrForKernel_0A6437B6 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x0A6437B6<br />
|}<br />
<br />
A potential name for is function is <code>sceSDfMgrIsSystemInBreakForKernel</code>.<br />
<br />
Returns respectively 1 or 0 depending on whether [[SceDeci4pSDfMgr#sceSDfMgrBreakSystem|sceSDfMgrBreakSystem]] or [[SceDeci4pSDfMgr#sceSDfMgrContinueSystem|sceSDfMgrContinueSystem]] was called last.<br />
<br />
<source lang="C">SceBool SceDeci4pSDfMgrForKernel_0A6437B6(void);</source><br />
<br />
=== sceSDfMgrUnregisterExcpHandlerForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xB050A0D5<br />
|}<br />
<br />
Temp name was <code>sceSDfMgrUnregisterCpuExcpCallbackForKernel</code>. This name is a deduction from [[SceDeci4pSDfMgr#sceSDfMgrRegisterExcpHandlerForKernel|sceSDfMgrRegisterExcpHandlerForKernel]].<br />
<br />
Unregisters an exception handler previously registered using [[SceDeci4pSDfMgr#sceSDfMgrRegisterExcpHandlerForKernel|sceSDfMgrRegisterExcpHandlerForKernel]]. Call it using the same arguments as provided to [[SceDeci4pSDfMgr#sceSDfMgrRegisterExcpHandlerForKernel|sceSDfMgrRegisterExcpHandlerForKernel]].<br />
<br />
<source lang="C">SceInt32 sceSDfMgrUnregisterExcpHandlerForKernel(SceSDfMgrExceptionCallback func, SceUInt32 type);</source><br />
<br />
=== sceSDfMgrRegisterExcpHandlerForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x6BF5553C<br />
|}<br />
<br />
Temp name was <code>sceSDfMgrRegisterCpuExcpCallbackForKernel</code>.<br />
<br />
Used by [[SceDeci4pSDbgp]].<br />
<br />
<source lang="C">SceInt32 sceSDfMgrRegisterExcpHandlerForKernel(SceSDfMgrExceptionCallback func, SceUInt32 type);</source><br />
<br />
=== sceSDfMgrRegisterBreakHookForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xB22B42FB<br />
|}<br />
<br />
Registers a function to be called when some exceptions or interrupts happen.<br />
<br />
<source lang="C">SceInt32 sceSDfMgrRegisterBreakHookForKernel(SceSDfMgrBreakHook hook);</source><br />
<br />
=== sceSDfMgrUnregisterBreakHookForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xE53400AE<br />
|}<br />
<br />
This is a guessed name. This name is a deduction from [[SceDeci4pSDfMgr#sceSDfMgrRegisterBreakHookForKernel|sceSDfMgrRegisterBreakHookForKernel]].<br />
<br />
Unregisters a break hook previously registered using [[SceDeci4pSDfMgr#sceSDfMgrRegisterBreakHookForKernel|sceSDfMgrRegisterBreakHookForKernel]]. Call it using the same argument as provided to [[SceDeci4pSDfMgr#sceSDfMgrRegisterBreakHookForKernel|sceSDfMgrRegisterBreakHookForKernel]].<br />
<br />
<source lang="C">SceInt32 sceSDfMgrUnregisterBreakHookForKernel(SceSDfMgrBreakHook hook);</source><br />
<br />
=== sceSDfMgrPollForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x152D98DF<br />
|}<br />
<br />
=== sceSDfMgrGetMemoryTypeForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x35238B8A<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
If DIP switch 210 is set, returns SCE_KERNEL_MEMBLOCK_TYPE_KERNEL_TOOL_RW, else returns SCE_KERNEL_MEMBLOCK_TYPE_KERNEL_ROOT_GAME_RW.<br />
<br />
<source lang="C">SceUInt32 sceSDfMgrGetMemoryTypeForKernel(void);</source><br />
<br />
SceDeci4pSDfMgrForKernel_11340BD4: 0x11340BD4<br />
SceDeci4pSDfMgrForKernel_3A25594F: 0x3A25594F<br />
SceDeci4pSDfMgrForKernel_4D974C08: 0x4D974C08<br />
SceDeci4pSDfMgrForKernel_4EA65698: 0x4EA65698<br />
SceDeci4pSDfMgrForKernel_58D7597A: 0x58D7597A<br />
SceDeci4pSDfMgrForKernel_59C077B3: 0x59C077B3<br />
SceDeci4pSDfMgrForKernel_682D0EFB: 0x682D0EFB<br />
SceDeci4pSDfMgrForKernel_BFB482D8: 0xBFB482D8<br />
SceDeci4pSDfMgrForKernel_C38EA67A: 0xC38EA67A<br />
SceDeci4pSDfMgrForKernel_FCF211FB: 0xFCF211FB<br />
<br />
[[Category:ARM]]<br />
[[Category:Kernel]]<br />
[[Category:Modules]]<br />
[[Category:Library]]</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=SceDeci4pSDfMgr&diff=21123
SceDeci4pSDfMgr
2024-02-18T17:24:58Z
<p>CreepNT: /* Types */ Fix structure field names</p>
<hr />
<div>== Module ==<br />
<br />
This module exists only in non-secure world. The SELF can be found in <code>os0:kd/deci4p_sdfmgr.skprx</code>.<br />
{| class="wikitable"<br />
|-<br />
! Version !! World !! Privilege<br />
|-<br />
| 0.990-3.65 || Non-secure || Kernel<br />
|}<br />
<br />
== Libraries ==<br />
<br />
=== Known NIDs ===<br />
<br />
{| class="wikitable"<br />
|-<br />
! Version !! Name !! World !! Visibility !! NID<br />
|-<br />
| 0.990-3.65 || [[SceDeci4pSDfMgr#SceDeci4pSDfMgrForKernel|SceDeci4pSDfMgrForKernel]] || Non-secure || Kernel || 0xA1386CB2<br />
|}<br />
<br />
== Types ==<br />
<br />
<source lang="C"><br />
//Error codes (guessed names)<br />
#define SCE_DECI_SYS_ERROR_INVALID_ARGUMENT (-2146893823) //<! 0x80090001<br />
#define SCE_DECI_SYS_ERROR_INVALID_SOCKET (-2146893822) //<! 0x80090002 - ExSend returns INVALID_ARGUMENT on a bad socket though :x<br />
#define SCE_DECI_SYS_ERROR_ALREADY_REGISTERED (-2146893821) //<! 0x80090003<br />
#define SCE_DECI_SYS_ERROR_NO_ENTRY (-2146893820) //<! 0x80090004 - no free entry to create socket remaining<br />
#define SCE_DECI_SYS_ERROR_ILLEGAL_ADDR (-2146893819) //<! 0x80090005 - unexpected NULL provided<br />
#define SCE_DECI_SYS_ERROR_INVALID_ARGUMENT_SIZE (-2146893818) //<! 0x80090006<br />
#define SCE_DECI_SYS_ERROR_BLOCKED (-2146893817) //<! 0x80090007<br />
#define SCE_DECI_SYS_ERROR_UNKNOWN_A (-2146893814) //<! 0x8009000A<br />
#define SCE_DECI_SYS_ERROR_NO_HOST_IF (-2146893811) //<! 0x8009000D - no Host Interface<br />
<br />
#define SCE_SDFMGR_EXCP_TYPE_PABT (0)<br />
#define SCE_SDFMGR_EXCP_TYPE_DABT (1)<br />
#define SCE_SDFMGR_EXCP_TYPE_UNDEF (2)<br />
#define SCE_SDFMGR_EXCP_TYPE_BUS (3)<br />
<br />
typedef int (* SceSDfMgrExceptionCallback)(SceExcpmgrExceptionContext *context, SceUInt32 pc, SceUInt32 cpsr);<br />
<br />
typedef SceInt32 SceSDfMgrSocketId;<br />
<br />
#define SCE_DFMGR_EVENT_READ (1) // Protocol data available to read<br />
#define SCE_DFMGR_EVENT_READDONE (2) // Protocol data read<br />
#define SCE_DFMGR_EVENT_WRITE (3) // Protocol data available to send<br />
#define SCE_DFMGR_EVENT_WRITEDONE (4) // Protocol data sent<br />
#define SCE_DFMGR_EVENT_CHSTATUS (5) // Protocol status change?<br />
#define SCE_DFMGR_EVENT_ERROR (6) // ?Protocol? error occured<br />
<br />
typedef void (* SceSDfMgrEventHandler)(SceUInt32 event, void* eventData, void* pCommon); //<! pCommon is the data passed to Open/ExOpen<br />
<br />
typedef struct _SceSDfMgrOpenParam {<br />
SceSize size; //<! Size of this structure (0x1C)<br />
SceUInt32 clientId; //<! Unique identifier, usually equal to uProtocol | 0x1000'0000<br />
SceUInt32 uProtocol; //<! Protocol ID<br />
SceUInt32 uVersion; //<! Protocol version<br />
SceUInt32 uVersionLimit;<br />
SceUInt16 unk14;<br />
SceUInt16 flags; //<! Bitflag: 0x1 makes the initial "status" 0x3 instead of 0x1, 0x2 makes a call to dcmpSendStatusProtocolAlias, ...<br />
char* name; //<! Protocol name - example: DCMP<br />
} SceSDfMgrOpenParam;<br />
<br />
typedef void (* SceSDfMgrBreakHook)(void);<br />
</source><br />
<br />
== SceDeci4pSDfMgrForKernel ==<br />
<br />
=== sceSDfMgrOpenForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xA55F5F0D<br />
|}<br />
<br />
Acquires an interrupt-suspending lock and calls [[SceDeci4pSDfMgr#sceSDfMgrExOpenForKernel|sceSDfMgrExOpenForKernel]].<br />
<br />
<source lang="C">SceSDfMgrSocketId sceSDfMgrOpenForKernel(SceSDfMgrEventHandler eventHandler, const SceSDfMgrOpenParam* openParam, void* pCommon);</source><br />
<br />
=== sceSDfMgrExOpenForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xCF4A3E03<br />
|}<br />
<br />
Opens a SDfMgr socket. <code>openParam</code> is not retained and can be disposed of after this call.<br />
<br />
<source lang="C">SceSDfMgrSocketId sceSDfMgrExOpenForKernel(SceSDfMgrEventHandler eventHandler, const SceSDfMgrOpenParam* openParam, void* pCommon);</source><br />
<br />
=== sceSDfMgrExSendForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xDAFE03AD<br />
|}<br />
<br />
Sends up to <code>bufLen</code> bytes from <code>buffer</code>, and returns number of bytes sent on success.<br />
<br />
Note that <code>buffer</code> is not '''<code>const</code>''': this is not a typo. <code>buffer</code> may be written to under specific conditions.<br />
<br />
<source lang="C">SceSSize sceSDfMgrExSendForKernel(SceSDfMgrSocketId sock, void* buffer, SceSize bufLen);</source><br />
<br />
=== sceSDfMgrExReqSendForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xB44083E1<br />
|}<br />
<br />
=== sceSDfMgrExRecvForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xF43F5941<br />
|}<br />
<br />
Receives up to <code>bufLen</code> bytes in <code>buffer</code>, and returns number of bytes received on success.<br />
<br />
<source lang="C">SceSSize sceSDfMgrExRecvForKernel(SceSDfMgrSocketId sock, void* buffer, SceSize bufLen);</source><br />
<br />
=== sceSDfMgrCloseForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x86CFC8C6<br />
|}<br />
<br />
Acquires an interrupt-suspending lock and calls [[SceDeci4pSDfMgr#sceSDfMgrExCloseForKernel|sceSDfMgrExCloseForKernel]].<br />
<br />
<source lang="C">SceInt32 sceSDfMgrCloseForKernel(SceSDfMgrSocketId sock);</source><br />
<br />
=== sceSDfMgrExCloseForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x90E8D453<br />
|}<br />
<br />
Close a SDfMgr socket.<br />
<br />
<source lang="C">SceInt32 sceSDfMgrExCloseForKernel(SceSDfMgrSocketId sock);</source><br />
<br />
=== sceSDfMgrBreakSystemForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xEDFBA012<br />
|}<br />
<br />
Sets up some internal state and calls <code>[[SceKernelIntrMgr#sceKernelGenerateSoftIntrForDriver]](0, 1, 0)</code>.<br />
<br />
<source lang="C">SceInt32 sceSDfMgrBreakSystemForKernel(void);</source><br />
<br />
=== sceSDfMgrContinueSystemForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x9A653F19<br />
|}<br />
<br />
Sets up some internal state and calls <code>sceKernelGenerateSoftIntrForDriver(0, 1, 0)</code>.<br />
<br />
<source lang="C">SceInt32 sceSDfMgrContinueSystemForKernel(void);</source><br />
<br />
=== SceDeci4pSDfMgrForKernel_A963E333 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xA963E333<br />
|}<br />
<br />
Calls <code>[[SceDeci4pSDfMgr#sceSDfMgrExReqSend|sceSDfMgrExReqSend]](sock)</code>, then may call an Host Interface function and/or call <code>sceKernelGenerateSoftIntrForDriver(1, 0, targetLUT[sceKernelCpuId()])</code> where <code>targetLUT = {1, 2, 4, 8}</code>.<br />
<br />
<source lang="C">SceInt32 SceDeci4pSDfMgrForKernel_A963E333(SceSDfMgrSocketId sock);</source><br />
<br />
=== SceDeci4pSDfMgrForKernel_98AEC60E ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x98AEC60E<br />
|}<br />
<br />
=== SceDeci4pSDfMgrForKernel_FFC95B63 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xFFC95B63<br />
|}<br />
<br />
Equivalent to [[SceDeci4pDfMgr#SceDeci4pDfMgrForDebugger_6D26CC56|SceDeci4pDfMgrForDebugger_6D26CC56]].<br />
<br />
Writes <code>val</code> as a 3-byte unsigned integer to <code>ptr</code>.<br />
<br />
<source lang="C">void SceDeci4pSDfMgrForKernel_FFC95B63(void* ptr, SceUInt32 val);</source><br />
<br />
=== SceDeci4pSDfMgrForKernel_68903C1D ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x68903C1D<br />
|}<br />
<br />
Equivalent to [[SceDeci4pDfMgr#SceDeci4pDfMgrForDebugger_CACAB5F9|SceDeci4pDfMgrForDebugger_CACAB5F9]].<br />
<br />
Reads value at <code>ptr</code> as a 3-byte unsigned integer and returns it.<br />
<br />
<source lang="C">SceUInt32 SceDeci4pSDfMgrForKernel_68903C1D(void* ptr);</source><br />
<br />
=== SceDeci4pSDfMgrForKernel_81E7C5BD ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x81E7C5BD<br />
|}<br />
<br />
Special <code>memset</code> variant. <code>len</code> will be aligned '''down''' to meet 4-byte alignment requirement (i.e. bottom 2 bits of <code>len</code> are ignored).<br />
<br />
<source lang="C">void* SceDeci4pSDfMgrForKernel_81E7C5BD(void* dst, int ch, size_t len);</source><br />
<br />
=== SceDeci4pSDfMgrForKernel_5996E2DB ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x5996E2DB<br />
|}<br />
<br />
Equivalent to <code>memcpy</code>.<br />
<br />
<source lang="C">void* SceDeci4pSDfMgrForKernel_8A3B06F2(void* dst, void* src, size_t len);</source><br />
<br />
=== SceDeci4pSDfMgrForKernel_8A3B06F2 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x8A3B06F2<br />
|}<br />
<br />
Equivalent to <code>memset</code>.<br />
<br />
<source lang="C">void* SceDeci4pSDfMgrForKernel_8A3B06F2(void* dst, int ch, size_t len);</source><br />
<br />
=== SceDeci4pSDfMgrForKernel_CCD56670 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || 0xCCD56670<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
Equivalent to <code>memchr</code>.<br />
<br />
<source lang="C">void* SceDeci4pSDfMgrForKernel_CCD56670(void* s, int ch, size_t len);</source><br />
<br />
=== SceDeci4pSDfMgrForKernel_501CE61D ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x501CE61D<br />
|}<br />
<br />
This is a <code>printf</code>-like function.<br />
<br />
<source lang="C">size_t SceDeci4pSDfMgrForKernel_501CE61D(char* fmt, ...);</source><br />
<br />
=== SceDeci4pSDfMgrForKernel_0A6437B6 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x0A6437B6<br />
|}<br />
<br />
A potential name for is function is <code>sceSDfMgrIsSystemInBreakForKernel</code>.<br />
<br />
Returns respectively 1 or 0 depending on whether [[SceDeci4pSDfMgr#sceSDfMgrBreakSystem|sceSDfMgrBreakSystem]] or [[SceDeci4pSDfMgr#sceSDfMgrContinueSystem|sceSDfMgrContinueSystem]] was called last.<br />
<br />
<source lang="C">SceBool SceDeci4pSDfMgrForKernel_0A6437B6(void);</source><br />
<br />
=== sceSDfMgrUnregisterExcpHandlerForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xB050A0D5<br />
|}<br />
<br />
Temp name was <code>sceSDfMgrUnregisterCpuExcpCallbackForKernel</code>. This name is a deduction from [[SceDeci4pSDfMgr#sceSDfMgrRegisterExcpHandlerForKernel|sceSDfMgrRegisterExcpHandlerForKernel]].<br />
<br />
Unregisters an exception handler previously registered using [[SceDeci4pSDfMgr#sceSDfMgrRegisterExcpHandlerForKernel|sceSDfMgrRegisterExcpHandlerForKernel]]. Call it using the same arguments as provided to [[SceDeci4pSDfMgr#sceSDfMgrRegisterExcpHandlerForKernel|sceSDfMgrRegisterExcpHandlerForKernel]].<br />
<br />
<source lang="C">SceInt32 sceSDfMgrUnregisterExcpHandlerForKernel(SceSDfMgrExceptionCallback func, SceUInt32 type);</source><br />
<br />
=== sceSDfMgrRegisterExcpHandlerForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x6BF5553C<br />
|}<br />
<br />
Temp name was <code>sceSDfMgrRegisterCpuExcpCallbackForKernel</code>.<br />
<br />
Used by [[SceDeci4pSDbgp]].<br />
<br />
<source lang="C">SceInt32 sceSDfMgrRegisterExcpHandlerForKernel(SceSDfMgrExceptionCallback func, SceUInt32 type);</source><br />
<br />
=== sceSDfMgrRegisterBreakHookForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xB22B42FB<br />
|}<br />
<br />
Registers a function to be called when some exceptions or interrupts happen.<br />
<br />
<source lang="C">SceInt32 sceSDfMgrRegisterBreakHookForKernel(SceSDfMgrBreakHook hook);</source><br />
<br />
=== sceSDfMgrUnregisterBreakHookForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xE53400AE<br />
|}<br />
<br />
This is a guessed name. This name is a deduction from [[SceDeci4pSDfMgr#sceSDfMgrRegisterBreakHookForKernel|sceSDfMgrRegisterBreakHookForKernel]].<br />
<br />
Unregisters a break hook previously registered using [[SceDeci4pSDfMgr#sceSDfMgrRegisterBreakHookForKernel|sceSDfMgrRegisterBreakHookForKernel]]. Call it using the same argument as provided to [[SceDeci4pSDfMgr#sceSDfMgrRegisterBreakHookForKernel|sceSDfMgrRegisterBreakHookForKernel]].<br />
<br />
<source lang="C">SceInt32 sceSDfMgrUnregisterBreakHookForKernel(SceSDfMgrBreakHook hook);</source><br />
<br />
=== sceSDfMgrPollForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x152D98DF<br />
|}<br />
<br />
=== sceSDfMgrGetMemoryTypeForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x35238B8A<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
If DIP switch 210 is set, returns SCE_KERNEL_MEMBLOCK_TYPE_KERNEL_TOOL_RW, else returns SCE_KERNEL_MEMBLOCK_TYPE_KERNEL_ROOT_GAME_RW.<br />
<br />
<source lang="C">SceUInt32 sceSDfMgrGetMemoryTypeForKernel(void);</source><br />
<br />
SceDeci4pSDfMgrForKernel_11340BD4: 0x11340BD4<br />
SceDeci4pSDfMgrForKernel_3A25594F: 0x3A25594F<br />
SceDeci4pSDfMgrForKernel_4D974C08: 0x4D974C08<br />
SceDeci4pSDfMgrForKernel_4EA65698: 0x4EA65698<br />
SceDeci4pSDfMgrForKernel_58D7597A: 0x58D7597A<br />
SceDeci4pSDfMgrForKernel_59C077B3: 0x59C077B3<br />
SceDeci4pSDfMgrForKernel_682D0EFB: 0x682D0EFB<br />
SceDeci4pSDfMgrForKernel_BFB482D8: 0xBFB482D8<br />
SceDeci4pSDfMgrForKernel_C38EA67A: 0xC38EA67A<br />
SceDeci4pSDfMgrForKernel_FCF211FB: 0xFCF211FB<br />
<br />
[[Category:ARM]]<br />
[[Category:Kernel]]<br />
[[Category:Modules]]<br />
[[Category:Library]]</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=SceDeci4pSDfMgr&diff=21122
SceDeci4pSDfMgr
2024-02-18T17:12:08Z
<p>CreepNT: /* Types */ Add name for event 5/6, change struct description to be more concise</p>
<hr />
<div>== Module ==<br />
<br />
This module exists only in non-secure world. The SELF can be found in <code>os0:kd/deci4p_sdfmgr.skprx</code>.<br />
{| class="wikitable"<br />
|-<br />
! Version !! World !! Privilege<br />
|-<br />
| 0.990-3.65 || Non-secure || Kernel<br />
|}<br />
<br />
== Libraries ==<br />
<br />
=== Known NIDs ===<br />
<br />
{| class="wikitable"<br />
|-<br />
! Version !! Name !! World !! Visibility !! NID<br />
|-<br />
| 0.990-3.65 || [[SceDeci4pSDfMgr#SceDeci4pSDfMgrForKernel|SceDeci4pSDfMgrForKernel]] || Non-secure || Kernel || 0xA1386CB2<br />
|}<br />
<br />
== Types ==<br />
<br />
<source lang="C"><br />
//Error codes (guessed names)<br />
#define SCE_DECI_SYS_ERROR_INVALID_ARGUMENT (-2146893823) //<! 0x80090001<br />
#define SCE_DECI_SYS_ERROR_INVALID_SOCKET (-2146893822) //<! 0x80090002 - ExSend returns INVALID_ARGUMENT on a bad socket though :x<br />
#define SCE_DECI_SYS_ERROR_ALREADY_REGISTERED (-2146893821) //<! 0x80090003<br />
#define SCE_DECI_SYS_ERROR_NO_ENTRY (-2146893820) //<! 0x80090004 - no free entry to create socket remaining<br />
#define SCE_DECI_SYS_ERROR_ILLEGAL_ADDR (-2146893819) //<! 0x80090005 - unexpected NULL provided<br />
#define SCE_DECI_SYS_ERROR_INVALID_ARGUMENT_SIZE (-2146893818) //<! 0x80090006<br />
#define SCE_DECI_SYS_ERROR_BLOCKED (-2146893817) //<! 0x80090007<br />
#define SCE_DECI_SYS_ERROR_UNKNOWN_A (-2146893814) //<! 0x8009000A<br />
#define SCE_DECI_SYS_ERROR_NO_HOST_IF (-2146893811) //<! 0x8009000D - no Host Interface<br />
<br />
#define SCE_SDFMGR_EXCP_TYPE_PABT (0)<br />
#define SCE_SDFMGR_EXCP_TYPE_DABT (1)<br />
#define SCE_SDFMGR_EXCP_TYPE_UNDEF (2)<br />
#define SCE_SDFMGR_EXCP_TYPE_BUS (3)<br />
<br />
typedef int (* SceSDfMgrExceptionCallback)(SceExcpmgrExceptionContext *context, SceUInt32 pc, SceUInt32 cpsr);<br />
<br />
typedef SceInt32 SceSDfMgrSocketId;<br />
<br />
#define SCE_DFMGR_EVENT_READ (1) // Protocol data available to read<br />
#define SCE_DFMGR_EVENT_READDONE (2) // Protocol data read<br />
#define SCE_DFMGR_EVENT_WRITE (3) // Protocol data available to send<br />
#define SCE_DFMGR_EVENT_WRITEDONE (4) // Protocol data sent<br />
#define SCE_DFMGR_EVENT_CHSTATUS (5) // Protocol status change?<br />
#define SCE_DFMGR_EVENT_ERROR (6) // ?Protocol? error occured<br />
<br />
typedef void (* SceSDfMgrEventHandler)(SceUInt32 event, void* eventData, void* pCommon); //<! pCommon is the data passed to Open/ExOpen<br />
<br />
typedef struct _SceSDfMgrOpenParam {<br />
SceSize size; //<! Size of this structure (0x1C)<br />
SceUInt32 uProtocol; //<! Also called "clientId". ID of the registered protocol.<br />
SceUInt32 unk8;<br />
SceUInt32 uVersion; //<! Protocol version<br />
SceUInt32 uVersionLimit;<br />
SceUInt16 unk14;<br />
SceUInt16 flags; //<! Bitflag: 0x1 makes the initial "status" 0x3 instead of 0x1, 0x2 makes a call to dcmpSendStatusProtocolAlias, ...<br />
char* name; //<! Protocol name - example: DCMP<br />
} SceSDfMgrOpenParam;<br />
<br />
typedef void (* SceSDfMgrBreakHook)(void);<br />
</source><br />
<br />
== SceDeci4pSDfMgrForKernel ==<br />
<br />
=== sceSDfMgrOpenForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xA55F5F0D<br />
|}<br />
<br />
Acquires an interrupt-suspending lock and calls [[SceDeci4pSDfMgr#sceSDfMgrExOpenForKernel|sceSDfMgrExOpenForKernel]].<br />
<br />
<source lang="C">SceSDfMgrSocketId sceSDfMgrOpenForKernel(SceSDfMgrEventHandler eventHandler, const SceSDfMgrOpenParam* openParam, void* pCommon);</source><br />
<br />
=== sceSDfMgrExOpenForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xCF4A3E03<br />
|}<br />
<br />
Opens a SDfMgr socket. <code>openParam</code> is not retained and can be disposed of after this call.<br />
<br />
<source lang="C">SceSDfMgrSocketId sceSDfMgrExOpenForKernel(SceSDfMgrEventHandler eventHandler, const SceSDfMgrOpenParam* openParam, void* pCommon);</source><br />
<br />
=== sceSDfMgrExSendForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xDAFE03AD<br />
|}<br />
<br />
Sends up to <code>bufLen</code> bytes from <code>buffer</code>, and returns number of bytes sent on success.<br />
<br />
Note that <code>buffer</code> is not '''<code>const</code>''': this is not a typo. <code>buffer</code> may be written to under specific conditions.<br />
<br />
<source lang="C">SceSSize sceSDfMgrExSendForKernel(SceSDfMgrSocketId sock, void* buffer, SceSize bufLen);</source><br />
<br />
=== sceSDfMgrExReqSendForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xB44083E1<br />
|}<br />
<br />
=== sceSDfMgrExRecvForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xF43F5941<br />
|}<br />
<br />
Receives up to <code>bufLen</code> bytes in <code>buffer</code>, and returns number of bytes received on success.<br />
<br />
<source lang="C">SceSSize sceSDfMgrExRecvForKernel(SceSDfMgrSocketId sock, void* buffer, SceSize bufLen);</source><br />
<br />
=== sceSDfMgrCloseForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x86CFC8C6<br />
|}<br />
<br />
Acquires an interrupt-suspending lock and calls [[SceDeci4pSDfMgr#sceSDfMgrExCloseForKernel|sceSDfMgrExCloseForKernel]].<br />
<br />
<source lang="C">SceInt32 sceSDfMgrCloseForKernel(SceSDfMgrSocketId sock);</source><br />
<br />
=== sceSDfMgrExCloseForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x90E8D453<br />
|}<br />
<br />
Close a SDfMgr socket.<br />
<br />
<source lang="C">SceInt32 sceSDfMgrExCloseForKernel(SceSDfMgrSocketId sock);</source><br />
<br />
=== sceSDfMgrBreakSystemForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xEDFBA012<br />
|}<br />
<br />
Sets up some internal state and calls <code>[[SceKernelIntrMgr#sceKernelGenerateSoftIntrForDriver]](0, 1, 0)</code>.<br />
<br />
<source lang="C">SceInt32 sceSDfMgrBreakSystemForKernel(void);</source><br />
<br />
=== sceSDfMgrContinueSystemForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x9A653F19<br />
|}<br />
<br />
Sets up some internal state and calls <code>sceKernelGenerateSoftIntrForDriver(0, 1, 0)</code>.<br />
<br />
<source lang="C">SceInt32 sceSDfMgrContinueSystemForKernel(void);</source><br />
<br />
=== SceDeci4pSDfMgrForKernel_A963E333 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xA963E333<br />
|}<br />
<br />
Calls <code>[[SceDeci4pSDfMgr#sceSDfMgrExReqSend|sceSDfMgrExReqSend]](sock)</code>, then may call an Host Interface function and/or call <code>sceKernelGenerateSoftIntrForDriver(1, 0, targetLUT[sceKernelCpuId()])</code> where <code>targetLUT = {1, 2, 4, 8}</code>.<br />
<br />
<source lang="C">SceInt32 SceDeci4pSDfMgrForKernel_A963E333(SceSDfMgrSocketId sock);</source><br />
<br />
=== SceDeci4pSDfMgrForKernel_98AEC60E ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x98AEC60E<br />
|}<br />
<br />
=== SceDeci4pSDfMgrForKernel_FFC95B63 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xFFC95B63<br />
|}<br />
<br />
Equivalent to [[SceDeci4pDfMgr#SceDeci4pDfMgrForDebugger_6D26CC56|SceDeci4pDfMgrForDebugger_6D26CC56]].<br />
<br />
Writes <code>val</code> as a 3-byte unsigned integer to <code>ptr</code>.<br />
<br />
<source lang="C">void SceDeci4pSDfMgrForKernel_FFC95B63(void* ptr, SceUInt32 val);</source><br />
<br />
=== SceDeci4pSDfMgrForKernel_68903C1D ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x68903C1D<br />
|}<br />
<br />
Equivalent to [[SceDeci4pDfMgr#SceDeci4pDfMgrForDebugger_CACAB5F9|SceDeci4pDfMgrForDebugger_CACAB5F9]].<br />
<br />
Reads value at <code>ptr</code> as a 3-byte unsigned integer and returns it.<br />
<br />
<source lang="C">SceUInt32 SceDeci4pSDfMgrForKernel_68903C1D(void* ptr);</source><br />
<br />
=== SceDeci4pSDfMgrForKernel_81E7C5BD ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x81E7C5BD<br />
|}<br />
<br />
Special <code>memset</code> variant. <code>len</code> will be aligned '''down''' to meet 4-byte alignment requirement (i.e. bottom 2 bits of <code>len</code> are ignored).<br />
<br />
<source lang="C">void* SceDeci4pSDfMgrForKernel_81E7C5BD(void* dst, int ch, size_t len);</source><br />
<br />
=== SceDeci4pSDfMgrForKernel_5996E2DB ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x5996E2DB<br />
|}<br />
<br />
Equivalent to <code>memcpy</code>.<br />
<br />
<source lang="C">void* SceDeci4pSDfMgrForKernel_8A3B06F2(void* dst, void* src, size_t len);</source><br />
<br />
=== SceDeci4pSDfMgrForKernel_8A3B06F2 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x8A3B06F2<br />
|}<br />
<br />
Equivalent to <code>memset</code>.<br />
<br />
<source lang="C">void* SceDeci4pSDfMgrForKernel_8A3B06F2(void* dst, int ch, size_t len);</source><br />
<br />
=== SceDeci4pSDfMgrForKernel_CCD56670 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || 0xCCD56670<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
Equivalent to <code>memchr</code>.<br />
<br />
<source lang="C">void* SceDeci4pSDfMgrForKernel_CCD56670(void* s, int ch, size_t len);</source><br />
<br />
=== SceDeci4pSDfMgrForKernel_501CE61D ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x501CE61D<br />
|}<br />
<br />
This is a <code>printf</code>-like function.<br />
<br />
<source lang="C">size_t SceDeci4pSDfMgrForKernel_501CE61D(char* fmt, ...);</source><br />
<br />
=== SceDeci4pSDfMgrForKernel_0A6437B6 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x0A6437B6<br />
|}<br />
<br />
A potential name for is function is <code>sceSDfMgrIsSystemInBreakForKernel</code>.<br />
<br />
Returns respectively 1 or 0 depending on whether [[SceDeci4pSDfMgr#sceSDfMgrBreakSystem|sceSDfMgrBreakSystem]] or [[SceDeci4pSDfMgr#sceSDfMgrContinueSystem|sceSDfMgrContinueSystem]] was called last.<br />
<br />
<source lang="C">SceBool SceDeci4pSDfMgrForKernel_0A6437B6(void);</source><br />
<br />
=== sceSDfMgrUnregisterExcpHandlerForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xB050A0D5<br />
|}<br />
<br />
Temp name was <code>sceSDfMgrUnregisterCpuExcpCallbackForKernel</code>. This name is a deduction from [[SceDeci4pSDfMgr#sceSDfMgrRegisterExcpHandlerForKernel|sceSDfMgrRegisterExcpHandlerForKernel]].<br />
<br />
Unregisters an exception handler previously registered using [[SceDeci4pSDfMgr#sceSDfMgrRegisterExcpHandlerForKernel|sceSDfMgrRegisterExcpHandlerForKernel]]. Call it using the same arguments as provided to [[SceDeci4pSDfMgr#sceSDfMgrRegisterExcpHandlerForKernel|sceSDfMgrRegisterExcpHandlerForKernel]].<br />
<br />
<source lang="C">SceInt32 sceSDfMgrUnregisterExcpHandlerForKernel(SceSDfMgrExceptionCallback func, SceUInt32 type);</source><br />
<br />
=== sceSDfMgrRegisterExcpHandlerForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x6BF5553C<br />
|}<br />
<br />
Temp name was <code>sceSDfMgrRegisterCpuExcpCallbackForKernel</code>.<br />
<br />
Used by [[SceDeci4pSDbgp]].<br />
<br />
<source lang="C">SceInt32 sceSDfMgrRegisterExcpHandlerForKernel(SceSDfMgrExceptionCallback func, SceUInt32 type);</source><br />
<br />
=== sceSDfMgrRegisterBreakHookForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xB22B42FB<br />
|}<br />
<br />
Registers a function to be called when some exceptions or interrupts happen.<br />
<br />
<source lang="C">SceInt32 sceSDfMgrRegisterBreakHookForKernel(SceSDfMgrBreakHook hook);</source><br />
<br />
=== sceSDfMgrUnregisterBreakHookForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xE53400AE<br />
|}<br />
<br />
This is a guessed name. This name is a deduction from [[SceDeci4pSDfMgr#sceSDfMgrRegisterBreakHookForKernel|sceSDfMgrRegisterBreakHookForKernel]].<br />
<br />
Unregisters a break hook previously registered using [[SceDeci4pSDfMgr#sceSDfMgrRegisterBreakHookForKernel|sceSDfMgrRegisterBreakHookForKernel]]. Call it using the same argument as provided to [[SceDeci4pSDfMgr#sceSDfMgrRegisterBreakHookForKernel|sceSDfMgrRegisterBreakHookForKernel]].<br />
<br />
<source lang="C">SceInt32 sceSDfMgrUnregisterBreakHookForKernel(SceSDfMgrBreakHook hook);</source><br />
<br />
=== sceSDfMgrPollForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x152D98DF<br />
|}<br />
<br />
=== sceSDfMgrGetMemoryTypeForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x35238B8A<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
If DIP switch 210 is set, returns SCE_KERNEL_MEMBLOCK_TYPE_KERNEL_TOOL_RW, else returns SCE_KERNEL_MEMBLOCK_TYPE_KERNEL_ROOT_GAME_RW.<br />
<br />
<source lang="C">SceUInt32 sceSDfMgrGetMemoryTypeForKernel(void);</source><br />
<br />
SceDeci4pSDfMgrForKernel_11340BD4: 0x11340BD4<br />
SceDeci4pSDfMgrForKernel_3A25594F: 0x3A25594F<br />
SceDeci4pSDfMgrForKernel_4D974C08: 0x4D974C08<br />
SceDeci4pSDfMgrForKernel_4EA65698: 0x4EA65698<br />
SceDeci4pSDfMgrForKernel_58D7597A: 0x58D7597A<br />
SceDeci4pSDfMgrForKernel_59C077B3: 0x59C077B3<br />
SceDeci4pSDfMgrForKernel_682D0EFB: 0x682D0EFB<br />
SceDeci4pSDfMgrForKernel_BFB482D8: 0xBFB482D8<br />
SceDeci4pSDfMgrForKernel_C38EA67A: 0xC38EA67A<br />
SceDeci4pSDfMgrForKernel_FCF211FB: 0xFCF211FB<br />
<br />
[[Category:ARM]]<br />
[[Category:Kernel]]<br />
[[Category:Modules]]<br />
[[Category:Library]]</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=SceLowio&diff=21105
SceLowio
2024-02-05T22:15:56Z
<p>CreepNT: /* SceCdramForDriver */ Add official names</p>
<hr />
<div>== Module ==<br />
<br />
{| class="wikitable"<br />
|-<br />
! Version !! World !! Privilege<br />
|-<br />
| 1.69-3.65 || Non-secure || Kernel<br />
|}<br />
<br />
== Libraries ==<br />
<br />
=== Known NIDs ===<br />
<br />
{| class="wikitable"<br />
|-<br />
! Version !! Name !! World !! Visibility !! NID<br />
|-<br />
| 1.69 || [[SceLowio#ScePervasiveForDriver|ScePervasiveForDriver]] || Non-secure || Kernel || 0xE692C727<br />
|-<br />
| 1.69 || [[SceLowio#SceGpioForDriver|SceGpioForDriver]] || Non-secure || Kernel || 0xF0EF5743<br />
|-<br />
| 1.69 || [[SceLowio#ScePwmForDriver|ScePwmForDriver]] || Non-secure || Kernel || 0xECEAE2D0<br />
|-<br />
| 1.69 || [[SceLowio#SceI2cForDriver|SceI2cForDriver]] || Non-secure || Kernel || 0xE14BEF6E<br />
|-<br />
| 1.69 || [[SceLowio#SceGrabForDriver|SceGrabForDriver]] || Non-secure || Kernel || 0x81C54BED<br />
|-<br />
| 1.69 || [[SceLowio#SceCdramForDriver|SceCdramForDriver]] || Non-secure || Kernel || 0xC8CD941E<br />
|-<br />
| 1.69 || [[SceLowio#SceDsiForDriver|SceDsiForDriver]] || Non-secure || Kernel || 0xEC897883<br />
|-<br />
| 1.69 || [[SceLowio#SceIftuForDriver|SceIftuForDriver]] || Non-secure || Kernel || 0xCAFCFE50<br />
|-<br />
| 1.69 || [[SceLowio#SceCsiForDriver|SceCsiForDriver]] || Non-secure || Kernel || 0xD85C8E44<br />
|}<br />
<br />
== ScePervasiveForDriver ==<br />
<br />
=== scePervasiveSrcClockSelectForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x2FB5F88F<br />
|}<br />
<br />
Probably sets audio SouRCe mixer clock.<br />
<br />
Used only by [[ScePower]].<br />
<br />
<source lang="C">int scePervasiveSrcClockSelectForDriver(SceUInt32 freq_level);</source><br />
<br />
=== scePervasiveArmClockSelectForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xE9D95643<br />
|}<br />
<br />
Temp name was scePervasiveArmSetClockForDriver.<br />
<br />
Used only by [[ScePower]].<br />
<br />
<source lang="C">int scePervasiveArmClockSelectForDriver(SceUInt32 freq_base, SceUInt32 freq_adjust);</source><br />
<br />
=== scePervasiveGpuClockSelectForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x6AF0196F<br />
|}<br />
<br />
Temp name was scePervasiveGpuSetClockForDriver.<br />
<br />
Maybe called on each suspend/resume.<br />
<br />
<source lang="C"><br />
// freq_level1: 3 (default value), 5 when DIP Switch 236 (GPU overclock) is set<br />
int scePervasiveGpuClockSelectForDriver(SceUInt32 freq_level1, SceUInt32 freq_level2);<br />
</source><br />
<br />
=== scePervasiveVeneziaClockSelectForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x725B4F59<br />
|}<br />
<br />
Temp name was scePervasiveVeneziaSetClockForDriver.<br />
<br />
<source lang="C">int scePervasiveVeneziaClockSelectForDriver(SceUInt32 freq_level);</source><br />
<br />
=== scePervasiveVipClockSelectForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x12D17D47<br />
|}<br />
<br />
Temp name was scePervasiveVipSetClockForDriver.<br />
<br />
<source lang="C">int scePervasiveVipClockSelectForDriver(SceUInt32 freq_level);</source><br />
<br />
=== scePervasiveDmac5ClockSelectForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xA6832B33<br />
|}<br />
<br />
Temp name was scePervasiveDmac5SetClockForDriver.<br />
<br />
<source lang="C">int scePervasiveDmac5ClockSelectForDriver(SceUInt32 freq_level);</source><br />
<br />
=== scePervasiveBusClockSelectForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xC0F7CC39<br />
|}<br />
<br />
Temp name was scePervasiveBusSetClockForDriver.<br />
<br />
Requests ARM [[TrustZone]] using [[SMC]] 0x114.<br />
<br />
<source lang="C">int scePervasiveBusClockSelectForDriver(SceUInt32 freq_level);</source><br />
<br />
=== scePervasiveSysClockSelectForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x98D8914A<br />
|}<br />
<br />
This is a guessed name. Temp name was scePervasiveSysSetClockForDriver.<br />
<br />
<source lang="C">int scePervasiveSysClockSelectForDriver(SceUInt32 freq_level);</source><br />
<br />
=== ScePervasiveForDriver_64ABE589 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x64ABE589<br />
|}<br />
<br />
A good name could be scePervasiveMsifClockSelectForDriver.<br />
<br />
<source lang="C">int ScePervasiveForDriver_64ABE589(SceUInt32 freq_level);</source><br />
<br />
=== ScePervasiveForDriver_91C80C41 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x91C80C41<br />
|}<br />
<br />
A good name might be scePervasiveIftuDsiClockSelectForDriver. Temp name was ScePervasiveForDriver_91C80C41_set_dsi_bus_pixelclock, scePervasiveDsiSetPixelClockForDriver.<br />
<br />
Sets DSI bus (?IFTU?) pixel clock.<br />
<br />
<source lang="C">int ScePervasiveForDriver_91C80C41(int bus, SceUInt32 freq_level);</source><br />
<br />
=== scePervasiveCameraBusClockSelectForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x589D0291<br />
|}<br />
<br />
<source lang="C"><br />
// freq_level can be either 2 (DOWN) or 5 (UP)<br />
int scePervasiveCameraBusClockSelectForDriver(SceUInt32 freq_level);<br />
</source><br />
<br />
=== scePervasiveGetSoCRevisionForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x714EEFB7<br />
|}<br />
<br />
Returns <= 0 if Kermit revision is below 2.0.<br />
<br />
Used in [[ScePower]], [[SceGpuEs4]], [[SceSdif]]. Maybe copied to [[SceSysmem]]'s sysroot structure.<br />
<br />
<source lang="C">SceUInt32 scePervasiveGetSoCRevisionForDriver(void);</source><br />
<br />
=== scePervasiveCecClockOutEnableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x26B51075<br />
|}<br />
<br />
=== scePervasiveCecClockOutDisableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xD185D235<br />
|}<br />
<br />
=== ScePervasiveForDriver_243D0E78 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x243D0E78<br />
|}<br />
<br />
Gets IFTU DSI clock information.<br />
<br />
<source lang="C">int ScePervasiveForDriver_243D0E78(int pixelclock, int info0[2], int info1[2]);</source><br />
<br />
=== scePervasiveGpuResetEnableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x3E79D3D3<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Puts the device (Gpu) at offset <code>0x10</code> in reset (|= mask) with mask = 1.<br />
<br />
<source lang="C">int scePervasiveGpuResetEnableForDriver(void);</source><br />
<br />
=== scePervasiveVipResetEnableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x28731EC5<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Puts the device (Vip) at offset <code>0x30</code> in reset (|= mask) with mask = 1.<br />
<br />
<source lang="C">int scePervasiveVipResetEnableForDriver(void);</source><br />
<br />
=== ScePervasiveForDriver_31C0A98B ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x31C0A98B<br />
|}<br />
<br />
Puts the device (unknown) at offset <code>0x34</code> in reset (|= mask) with mask = 1.<br />
<br />
<source lang="C">int ScePervasiveForDriver_31C0A98B(void);</source><br />
<br />
=== ScePervasiveForDriver_FF4B3CA6 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xFF4B3CA6<br />
|}<br />
<br />
Puts the device (unknown) at offset <code>0x50 + device * 4</code> in reset (|= mask) with mask = 1.<br />
<br />
<source lang="C">int ScePervasiveForDriver_FF4B3CA6(int device);</source><br />
<br />
=== scePervasiveCsiResetEnableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x66BF2885<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Puts the device (Csi) at offset <code>0x70 + head * 4</code> in reset (|= mask) with mask = 1.<br />
<br />
<source lang="C">int scePervasiveCsiResetEnableForDriver(SceDisplayHead head);</source><br />
<br />
=== scePervasiveIftuDsiResetEnableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xE3FC1C8D<br />
|}<br />
<br />
Temp name was ScePervasiveForDriver_E3FC1C8D_dsi_reset_enter, scePervasiveDsiResetEnableForDriver.<br />
<br />
Puts the device (IFTU DSI) at offset <code>0x80 + device * 4</code> in reset (|= mask).<br />
<br />
<source lang="C">int scePervasiveIftuDsiResetEnableForDriver(int device, int mask);</source><br />
<br />
=== ScePervasiveForDriver_B68254AD ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xB68254AD<br />
|}<br />
<br />
Puts the device (IFTU2) at offset <code>0x88</code> in reset (|= mask) with mask = 1.<br />
<br />
<source lang="C">int ScePervasiveForDriver_B68254AD(void);</source><br />
<br />
=== ScePervasiveForDriver_7AE2F8E8 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x7AE2F8E8<br />
|}<br />
<br />
Puts the device (unknown) at offset <code>0x8C</code> in reset (|= mask) with mask = 1.<br />
<br />
<source lang="C">int ScePervasiveForDriver_7AE2F8E8(void);</source><br />
<br />
=== scePervasiveUdcResetEnableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x4AF7A01E<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Puts the device (Udc) at offset <code>0x90 + device * 4</code> in reset (|= mask).<br />
<br />
<source lang="C">int scePervasiveUdcResetEnableForDriver(int device, int mask);</source><br />
<br />
=== scePervasiveSdifResetEnableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x3D8A8712<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Puts the device (Sdif) at offset <code>0xA0 + device * 4</code> in reset (|= mask) with mask = 1.<br />
<br />
<source lang="C">int scePervasiveSdifResetEnableForDriver(void);</source><br />
<br />
=== scePervasiveMsifResetEnableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xA3569FF1<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Puts the device (Msif) at offset <code>0xB0</code> in reset (|= mask) with mask = 1.<br />
<br />
<source lang="C">int scePervasiveMsifResetEnableForDriver(void);</source><br />
<br />
=== scePervasiveI2sResetEnableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x146108D4<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Puts the device (I2s) at offset <code>0xC0 + device * 4</code> in reset (|= mask) with mask = 1.<br />
<br />
<source lang="C">int scePervasiveI2sResetEnableForDriver(int device);</source><br />
<br />
=== scePervasiveSrcMixResetEnableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x821AE6C7<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Puts the device (SrcMix) at offset <code>0xE0 + device * 4</code> in reset (|= mask) with mask = 1.<br />
<br />
<source lang="C">int scePervasiveSrcMixResetEnableForDriver(int device);</source><br />
<br />
=== scePervasiveSpdifResetEnableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xB8AF1249<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Puts the device (Spdif) at offset <code>0xF0</code> in reset (|= mask) with mask = 1.<br />
<br />
<source lang="C">int scePervasiveSpdifResetEnableForDriver(void);</source><br />
<br />
=== scePervasiveGpioResetEnableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x731A097D<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Puts the device (GPIO) at offset <code>0x100</code> in reset (|= mask) with mask = 1.<br />
<br />
<source lang="C">int scePervasiveGpioResetEnableForDriver(void);</source><br />
<br />
=== scePervasiveSpiResetEnableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x7B16F900<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Puts the device (SPI) at offset <code>0x104 + device * 4</code> in reset (|= mask) with mask = 1.<br />
<br />
<source lang="C">int scePervasiveSpiResetEnableForDriver(int device);</source><br />
<br />
=== scePervasiveI2cResetEnableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x41F9E1C3<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Puts the device (I2c) at offset <code>0x110 + device * 4</code> in reset (|= mask) with mask = 1.<br />
<br />
<source lang="C">int scePervasiveI2cResetEnableForDriver(int device);</source><br />
<br />
=== scePervasiveUartResetEnableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x788B6C61<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Puts the device (UART) at offset <code>0x120 + uart_bus * 4</code> in reset (|= mask) with mask = 1.<br />
<br />
<source lang="C">int scePervasiveUartResetEnableForDriver(int uart_bus);</source><br />
<br />
=== scePervasiveGpuResetDisableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x8A85E36B<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Puts the device (Gpu) at offset <code>0x10</code> out of reset (&= ~mask) with mask = 1.<br />
<br />
<source lang="C">int scePervasiveGpuResetDisableForDriver(void);</source><br />
<br />
=== scePervasiveVipResetDisableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0xA7E64C6F<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Puts the device (Vip) at offset <code>0x30</code> out of reset (&= ~mask) with mask = 1.<br />
<br />
Used to reset [[Venezia]].<br />
<br />
<source lang="C">int scePervasiveVipResetDisableForDriver(void);</source><br />
<br />
=== ScePervasiveForDriver_E2D8F6C3 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xE2D8F6C3<br />
|}<br />
<br />
Puts the device (unknown) at offset <code>0x34</code> out of reset (&= ~mask) with mask = 1.<br />
<br />
<source lang="C">int ScePervasiveForDriver_E2D8F6C3(int device);</source><br />
<br />
=== ScePervasiveForDriver_AC475961 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xAC475961<br />
|}<br />
<br />
Puts the device (unknown) at offset <code>0x50 + device * 4</code> out of reset (&= ~mask) with mask = 1.<br />
<br />
<source lang="C">int ScePervasiveForDriver_AC475961(int device);</source><br />
<br />
=== scePervasiveCsiResetDisableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xD3B59C33<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Puts the device (Csi) at offset <code>0x70 + head * 4</code> out of reset (&= ~mask) with mask = 1.<br />
<br />
<source lang="C">int scePervasiveCsiResetDisableForDriver(SceDisplayHead head);</source><br />
<br />
=== scePervasiveIftuDsiResetDisableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0xFFB43AC2<br />
|}<br />
<br />
Temp name was scePervasiveDsiResetDisableForDriver.<br />
<br />
Puts the device (IFTU DSI) at offset <code>0x80 + device * 4</code> out of reset (&= ~mask).<br />
<br />
<source lang="C">int scePervasiveIftuDsiResetDisableForDriver(int device, int mask);</source><br />
<br />
=== ScePervasiveForDriver_E92E28FF ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xE92E28FF<br />
|}<br />
<br />
Puts the device (IFTU2) at offset <code>0x88</code> out of reset (&= ~mask) with mask = 1.<br />
<br />
<source lang="C">int ScePervasiveForDriver_E92E28FF(void);</source><br />
<br />
=== ScePervasiveForDriver_17109C28 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x17109C28<br />
|}<br />
<br />
Puts the device (unknown) at offset <code>0x8C</code> out of reset (&= ~mask) with mask = 1.<br />
<br />
<source lang="C">int ScePervasiveForDriver_17109C28(void);</source><br />
<br />
=== scePervasiveUdcResetDisableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x13CC07C9<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Puts the device (Udc) at offset <code>0x90 + device * 4</code> out of reset (&= ~mask).<br />
<br />
<source lang="C">int scePervasiveUdcResetDisableForDriver(int device, int mask);</source><br />
<br />
=== scePervasiveSdifResetDisableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xD326E15F<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Puts the device (Sdif) at offset <code>0xA0 + device * 4</code> out of reset (&= ~mask) with mask = 1.<br />
<br />
<source lang="C">int scePervasiveSdifResetDisableForDriver(int device);</source><br />
<br />
=== scePervasiveMsifResetDisableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xCB0F15CD<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Puts the device (Msif) at offset <code>0xB0</code> out of reset (&= ~mask) with mask = 1.<br />
<br />
<source lang="C">int scePervasiveMsifResetDisableForDriver(void);</source><br />
<br />
=== scePervasiveI2sResetDisableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xEEE340ED<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Puts the device (I2s) at offset <code>0xC0 + device * 4</code> out of reset (&= ~mask) with mask = 1.<br />
<br />
<source lang="C">int scePervasiveI2sResetDisableForDriver(int device);</source><br />
<br />
=== scePervasiveSrcMixResetDisableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x5BAFA0DC<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Puts the device (SrcMix) at offset <code>0xE0 + device * 4</code> out of reset (&= ~mask) with mask = 1.<br />
<br />
<source lang="C">int scePervasiveSrcMixResetDisableForDriver(int device);</source><br />
<br />
=== scePervasiveSpdifResetDisableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x6A2FB697<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Puts the device (Spdif) at offset <code>0xF0</code> out of reset (&= ~mask) with mask = 1.<br />
<br />
<source lang="C">int scePervasiveSpdifResetDisableForDriver(void);</source><br />
<br />
=== scePervasiveGpioResetDisableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x78C34032<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Puts the device (GPIO) at offset <code>0x100</code> out of reset (&= ~mask) with mask = 1.<br />
<br />
<source lang="C">int scePervasiveGpioResetDisableForDriver(void);</source><br />
<br />
=== scePervasiveSpiResetDisableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xE4B145AE<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Puts the device (SPI) at offset <code>0x104 + device * 4</code> out of reset (&= ~mask) with mask = 1.<br />
<br />
<source lang="C">int scePervasiveSpiResetDisableForDriver(int device);</source><br />
<br />
=== scePervasiveI2cResetDisableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x86BEA9A4<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Puts the device (I2c) at offset <code>0x110 + device * 4</code> out of reset (&= ~mask) with mask = 1.<br />
<br />
<source lang="C">int scePervasiveI2cResetDisableForDriver(int device);</source><br />
<br />
=== scePervasiveUartResetDisableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xA7CE7DCC<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Puts the device (UART) at offset <code>0x120 + uart_bus * 4</code> out of reset (&= ~mask) with mask = 1.<br />
<br />
<source lang="C">int scePervasiveUartResetDisableForDriver(int uart_bus);</source><br />
<br />
=== scePervasiveRemovableMemoryGetCardInsertStateForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x551EEE82<br />
|}<br />
<br />
<source lang="C">int scePervasiveRemovableMemoryGetCardInsertStateForDriver(void);</source><br />
<br />
=== ScePervasiveForDriver_81A155F1 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x81A155F1<br />
|}<br />
<br />
Returns SceLowio's mapped ScePervasiveMisc virtual address.<br />
<br />
<source lang="C">void *ScePervasiveForDriver_81A155F1(void);</source><br />
<br />
=== ScePervasiveForDriver_8BAB45F8 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x8BAB45F8<br />
|}<br />
<br />
Changes UART baudrate of one of the 7 UART bus. See [[UART_Registers#SceUartClkgenReg|SceUartClkgenReg]] for more information.<br />
<br />
<source lang="C">int ScePervasiveForDriver_8BAB45F8(int uart_bus, int baudrate);</source><br />
<br />
=== scePervasiveGpuClkGateEnableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x39E51AE2<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Turns on the clock gate (|= mask) of the device (Gpu) at offset <code>0x10</code>.<br />
<br />
<source lang="C">int scePervasiveGpuClkGateEnableForDriver(int mask);</source><br />
<br />
=== scePervasiveDmacClkGateEnableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xA10583FF<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Enables DMAC clock gate.<br />
<br />
<source lang="C">int scePervasiveDmacClkGateEnableForDriver(int device);</source><br />
<br />
=== scePervasiveDmacClkGateDisableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x15237AF8<br />
|}<br />
<br />
Disables DMAC clock gate.<br />
<br />
<source lang="C">int scePervasiveDmacClkGateDisableForDriver(int device);</source><br />
<br />
=== scePervasiveDbgSdioClkGateEnableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xD34E74C5<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Enables [[SceDbgSdio]] clock gate.<br />
<br />
<source lang="C">int scePervasiveDbgSdioClkGateEnableForDriver(int device);</source><br />
<br />
=== scePervasiveDbgSdioClkGateDisableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x701D5355<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Disables [[SceDbgSdio]] clock gate.<br />
<br />
<source lang="C">int scePervasiveDbgSdioClkGateDisableForDriver(int device);</source><br />
<br />
=== scePervasiveVipClkGateEnable1ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0xFB01A2DD<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Turns on the clock gate (|= mask) of the device (Vip) at offset <code>0x30</code> with mask = 1.<br />
<br />
Used to initialize [[Venezia]] registers or SPRAM.<br />
<br />
<source lang="C">int scePervasiveVipClkGateEnable1ForDriver(void);</source><br />
<br />
=== scePervasiveVipClkGateEnable2ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xB9904983<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Turns on the clock gate (|= mask) of the device (Vip) at offset <code>0x30</code> with mask = 2.<br />
<br />
<source lang="C">int scePervasiveVipClkGateEnable2ForDriver(void);</source><br />
<br />
=== ScePervasiveForDriver_B1CFA18F ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xB1CFA18F<br />
|}<br />
<br />
Turns on the clock gate (|= mask) of the device (unknown) at offset <code>0x34</code> with mask = 1.<br />
<br />
<source lang="C">int ScePervasiveForDriver_B1CFA18F(void);</source><br />
<br />
=== scePervasiveCsiClkGateEnableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x1068C067<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Turns on the clock gate (|= mask) of the device (Csi) at offset <code>0x70 + head * 4</code> with mask = 1.<br />
<br />
<source lang="C">int scePervasiveCsiClkGateEnableForDriver(SceDisplayHead head);</source><br />
<br />
=== scePervasiveIftuDsiClkGateEnableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xBC42C72F<br />
|}<br />
<br />
Temp name was scePervasiveDsiClockEnableForDriver.<br />
<br />
Turns on the clock gate (|= mask) of the device (IFTU DSI) at offset <code>0x80 + device * 4</code>.<br />
<br />
<source lang="C">int scePervasiveIftuDsiClkGateEnableForDriver(int device, int mask);</source><br />
<br />
=== ScePervasiveForDriver_07F2A738 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x07F2A738<br />
|}<br />
<br />
Turns on the clock gate (|= mask) of the device (IFTU2) at offset <code>0x88</code> with mask = 1.<br />
<br />
<source lang="C">int ScePervasiveForDriver_07F2A738(void);</source><br />
<br />
=== ScePervasiveForDriver_C0C842FE ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xC0C842FE<br />
|}<br />
<br />
Turns on the clock gate (|= mask) of the device (unknown) at offset <code>0x8C</code> with mask = 1.<br />
<br />
<source lang="C">int ScePervasiveForDriver_C0C842FE(void);</source><br />
<br />
=== scePervasiveUdcClkGateEnableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xA2EFD7AF<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Turns on the clock gate (|= mask) of the device (Udc) at offset <code>0x90 + device * 4</code>.<br />
<br />
<source lang="C">int scePervasiveUdcClkGateEnableForDriver(int device, int mask);</source><br />
<br />
=== scePervasiveSdifClkGateEnableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x3CF7A012<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Turns on the clock gate (|= mask) of the device (Sdif) at offset <code>0xA0 + device * 4</code> with mask = 1.<br />
<br />
<source lang="C">int scePervasiveSdifClkGateEnableForDriver(int device);</source><br />
<br />
=== scePervasiveMsifClkGateEnableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x7704C013<br />
|}<br />
<br />
This is a guessed name. Temp name was scePervasiveMsifClockEnableForDriver.<br />
<br />
Turns on the clock gate (|= mask) of the device (Msif) at offset <code>0xB0</code> with mask = 1.<br />
<br />
<source lang="C">int scePervasiveMsifClkGateEnableForDriver(void);</source><br />
<br />
=== scePervasiveI2sClkGateEnableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x4235EB7D<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Turns on the clock gate (|= mask) of the device (I2s) at offset <code>0xC0 + device * 4</code> with mask = 1.<br />
<br />
<source lang="C">int scePervasiveI2sClkGateEnableForDriver(int device);</source><br />
<br />
=== scePervasiveSrcMixClkGateEnableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x47F2C35C<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Turns on the clock gate (|= mask) of the device (SrcMix) at offset <code>0xE0 + device * 4</code> with mask = 1.<br />
<br />
<source lang="C">int scePervasiveSrcMixClkGateEnableForDriver(int device);</source><br />
<br />
=== scePervasiveSpdifClkGateEnableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x6B5DEDA2<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Turns on the clock gate (|= mask) of the device (Spdif) at offset <code>0xF0</code> with mask = 1.<br />
<br />
<source lang="C">int scePervasiveSpdifClkGateEnableForDriver(void);</source><br />
<br />
=== scePervasiveGpioClkGateEnableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x2F195C97<br />
|}<br />
<br />
This is a guessed name. Temp name was scePervasiveGpioClockEnableForDriver.<br />
<br />
Turns on the clock gate (|= mask) of the device (GPIO) at offset <code>0x100</code> with mask = 1.<br />
<br />
<source lang="C">int scePervasiveGpioClkGateEnableForDriver(void);</source><br />
<br />
=== scePervasiveSpiClkGateEnableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xDFD96BFC<br />
|}<br />
<br />
This is a guessed name. Temp name was scePervasiveSpiClockEnableForDriver.<br />
<br />
Turns on the clock gate (|= mask) of the device (SPI) at offset <code>0x104 + device * 4</code> with mask = 1.<br />
<br />
<source lang="C">int scePervasiveSpiClkGateEnableForDriver(int device);</source><br />
<br />
=== scePervasiveI2cClkGateEnableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xC37CFDFC<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Turns on the clock gate (|= mask) of the device (I2c) at offset <code>0x110 + device * 4</code> with mask = 1.<br />
<br />
<source lang="C">int scePervasiveI2cClkGateEnableForDriver(int device);</source><br />
<br />
=== scePervasiveUartClkGateEnableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xEFD084D8<br />
|}<br />
<br />
This is a guessed name. Temp name was scePervasiveUartClockEnableForDriver.<br />
<br />
Turns on the clock gate (|= mask) of the device (UART) at offset <code>0x120 + device * 4</code> with mask = 1.<br />
<br />
<source lang="C">int scePervasiveUartClkGateEnableForDriver(int device);</source><br />
<br />
=== scePervasiveGpuClkGateDisableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xCA0ACFC5<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Turns off the clock gate (&= ~mask) of the device (Gpu) at offset <code>0x10</code>.<br />
<br />
<source lang="C">int scePervasiveGpuClkGateDisableForDriver(int mask);</source><br />
<br />
=== scePervasiveVipClkGateDisable1ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x2EEBE9AE<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Turns off the clock gate (&= ~mask) of the device (Vip) at offset <code>0x30</code> with mask = 1.<br />
<br />
Used to initialize [[Venezia]] registers or SPRAM.<br />
<br />
<source lang="C">int scePervasiveVipClkGateDisable1ForDriver(void);</source><br />
<br />
=== scePervasiveVipClkGateDisable2ForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xFBE5AA2F<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Turns off the clock gate (&= ~mask) of the device (Vip) at offset <code>0x30</code> with mask = 2.<br />
<br />
<source lang="C">int scePervasiveVipClkGateDisable2ForDriver(void);</source><br />
<br />
=== ScePervasiveForDriver_03E1FAA6 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x03E1FAA6<br />
|}<br />
<br />
Turns off the clock gate (&= ~mask) of the device (unknown) at offset <code>0x34</code> with mask = 1.<br />
<br />
<source lang="C">int ScePervasiveForDriver_03E1FAA6(void);</source><br />
<br />
=== scePervasiveCsiClkGateDisableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x4B223AF5<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Turns off the clock gate (&= ~mask) of the device (Csi) at offset <code>0x70 + head * 4</code> with mask = 1.<br />
<br />
<source lang="C">int scePervasiveCsiClkGateDisableForDriver(SceDisplayHead head);</source><br />
<br />
=== scePervasiveIftuDsiClkGateDisableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x25AE181E<br />
|}<br />
<br />
Temp name was ScePervasiveForDriver_25AE181E_dsi_clock_disable, scePervasiveDsiClockDisableForDriver.<br />
<br />
Turns off the clock gate (&= ~mask) of the device (IFTU DSI) at offset <code>0x80 + device * 4</code>.<br />
<br />
<source lang="C">int scePervasiveIftuDsiClkGateDisableForDriver(int device, int mask);</source><br />
<br />
=== ScePervasiveForDriver_5AFE0AF0 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x5AFE0AF0<br />
|}<br />
<br />
Turns off the clock gate (&= ~mask) of the device (IFTU2) at offset <code>0x88</code> with mask = 1.<br />
<br />
<source lang="C">int ScePervasiveForDriver_5AFE0AF0(void);</source><br />
<br />
=== ScePervasiveForDriver_9BB7B932 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x9BB7B932<br />
|}<br />
<br />
Turns off the clock gate (&= ~mask) of the device (unknown) at offset <code>0x8C</code> with mask = 1.<br />
<br />
<source lang="C">int ScePervasiveForDriver_9BB7B932(void);</source><br />
<br />
=== scePervasiveUdcClkGateDisableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xAD1E81EB<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Turns off the clock gate (&= ~mask) of the device (Udc) at offset <code>0x90 + device * 4</code>.<br />
<br />
<source lang="C">int scePervasiveUdcClkGateDisableForDriver(int device, int mask);</source><br />
<br />
=== scePervasiveSdifClkGateDisableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x4E43299D<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Turns off the clock gate (&= ~mask) of the device (Sdif) at offset <code>0xA0 + device * 4</code> with mask = 1.<br />
<br />
<source lang="C">int scePervasiveSdifClkGateDisableForDriver(int device);</source><br />
<br />
=== scePervasiveMsifClkGateDisableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x2A9778CD<br />
|}<br />
<br />
This is a guessed name. Temp name was scePervasiveMsifClockDisableForDriver.<br />
<br />
Turns off the clock gate (&= ~mask) of the device (Msif) at offset <code>0xB0</code> with mask = 1.<br />
<br />
<source lang="C">int scePervasiveMsifClkGateDisableForDriver(void);</source><br />
<br />
=== scePervasiveI2sClkGateDisableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xA3CF9844<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Turns off the clock gate (&= ~mask) of the device (I2s) at offset <code>0xC0 + device * 4</code> with mask = 1.<br />
<br />
<source lang="C">int scePervasiveI2sClkGateDisableForDriver(int device);</source><br />
<br />
=== scePervasiveSrcMixClkGateDisableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xF861FEE4<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Turns off the clock gate (&= ~mask) of the device (SrcMix) at offset <code>0xE0 + device * 4</code> with mask = 1.<br />
<br />
<source lang="C">int scePervasiveSrcMixClkGateDisableForDriver(int device);</source><br />
<br />
=== scePervasiveSpdifClkGateDisableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x51981FEE<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Turns off the clock gate (&= ~mask) of the device (Spdif) at offset <code>0xF0</code> with mask = 1.<br />
<br />
<source lang="C">int scePervasiveSpdifClkGateDisableForDriver(void);</source><br />
<br />
=== scePervasiveGpioClkGateDisableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xEB176898<br />
|}<br />
<br />
This is a guessed name. Temp name was scePervasiveGpioClockDisableForDriver.<br />
<br />
Turns off the clock gate (&= ~mask) of the device (GPIO) at offset <code>0x100</code> with mask = 1.<br />
<br />
<source lang="C">int scePervasiveGpioClkGateDisableForDriver(void);</source><br />
<br />
=== scePervasiveSpiClkGateDisableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xA85BF98A<br />
|}<br />
<br />
This is a guessed name. Temp name was scePervasiveSpiClockDisableForDriver.<br />
<br />
Turns off the clock gate (&= ~mask) of the device (SPI) at offset <code>0x104 + device * 4</code> with mask = 1.<br />
<br />
<source lang="C">int scePervasiveSpiClkGateDisableForDriver(int device);</source><br />
<br />
=== scePervasiveI2cClkGateDisableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x3F3E1AEA<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Turns off the clock gate (&= ~mask) of the device (I2c) at offset <code>0x110 + device * 4</code> with mask = 1.<br />
<br />
<source lang="C">int scePervasiveI2cClkGateDisableForDriver(int device);</source><br />
<br />
=== scePervasiveUartClkGateDisableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x18DD8043<br />
|}<br />
<br />
This is a guessed name. Temp name was scePervasiveUartClockDisableForDriver.<br />
<br />
Turns off the clock gate (&= ~mask) of the device (UART) at offset <code>0x120 + device * 4</code> with mask = 1.<br />
<br />
<source lang="C">int scePervasiveUartClkGateDisableForDriver(int device);</source><br />
<br />
=== ScePervasiveForDriver_4F64DEF6 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x4F64DEF6<br />
|}<br />
<br />
Sets active bus for UDC (USB Device Controller).<br />
<br />
Step 1: Puts the device (Udc) at offset <code>0x90 + bus * 4</code> in reset then disables its clock gate.<br />
<br />
Step 2: Updates ScePervasiveMisc global with the selected bus.<br />
<br />
Step 3: Puts the device out of reset.<br />
<br />
<source lang="C">int ScePervasiveForDriver_4F64DEF6(int bus);</source><br />
<br />
=== ScePervasiveForDriver_47708C03 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x47708C03<br />
|}<br />
<br />
Returns address to the ScePervasiveVid global buffer. What does "Vid" stands for? Video? Vendor ID?<br />
<br />
It might be related to clock frequencies and [[Syscon]]. Maybe this value is the clock multiplier/divider. See [[Pervasive#ARM_Clocks]].<br />
<br />
Used by [[ScePower]].<br />
<br />
<source lang="C">void *ScePervasiveForDriver_47708C03(void);</source><br />
<br />
=== ScePervasiveForDriver_E0711D42 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xE0711D42<br />
|}<br />
<br />
Calls [[SMC]] 0x110: <code>smc_bus_set_state(1, 0);</code><br />
<br />
Used by [[SceEnumWakeUp]].<br />
<br />
<source lang="C">int ScePervasiveForDriver_E0711D42(void);</source><br />
<br />
=== scePervasiveCompatStopForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0x4712740D<br />
|}<br />
<br />
Calls [[SMC]] 0x110: <code>smc_bus_set_state(2, 0);</code><br />
<br />
Called in [[SceCompat#sceCompatSuspend]] and [[SceCompat#sceCompatStop]].<br />
<br />
<source lang="C">int scePervasiveCompatStopForDriver(void);</source><br />
<br />
=== scePervasiveCompatStartForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0xB2F232E5<br />
|}<br />
<br />
Calls [[SMC]] 0x110: <code>smc_bus_set_state(2, 1);</code><br />
<br />
Called in [[SceCompat#sceCompatResume]] and [[SceCompat#sceCompatInit]].<br />
<br />
<source lang="C">int scePervasiveCompatStartForDriver(void);</source><br />
<br />
=== scePervasiveCompatLcdDmacInitForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0xA7855D3A<br />
|}<br />
<br />
Calls [[SMC]] 0x110: <code>smc_bus_set_state(2, 2);</code><br />
<br />
Called during PSP Emulator ([[SceCompat]]) start and resume.<br />
<br />
<source lang="C">int scePervasiveCompatLcdDmacInitForDriver(void);</source><br />
<br />
=== ScePervasiveForDriver_043B33F5 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.692.000 || not present<br />
|-<br />
| 1.800.071-3.740.011 || 0x043B33F5<br />
|}<br />
<br />
SDIF related. [[Pervasive#ScePervasiveMisc_.280xE3100000.29|ScePervasiveMisc]] offset <code>0x310</code>.<br />
<br />
<source lang="C">int ScePervasiveForDriver_043B33F5(unsigned int device, unsigned int value);</source><br />
<br />
<source lang="C"><br />
if ((device < 4) && (value < 7)) {<br />
*(uint32_t *)(ScePervasiveMisc + 0x310) = (*(uint32_t *)(ScePervasiveMisc + 0x310) & ~(7 << ((device << 3) & 0xff))) | (value << ((device << 3) & 0xff));<br />
dmb();<br />
}<br />
</source><br />
<br />
=== ScePervasiveForDriver_29E65AE1 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0x29E65AE1<br />
|}<br />
<br />
=== ScePervasiveForDriver_453BD2EC ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.692.000 || ??<br />
|-<br />
| 1.800.071-3.740.011 || 0x453BD2EC<br />
|}<br />
<br />
SDIF related. [[Pervasive#ScePervasiveMisc_.280xE3100000.29|ScePervasiveMisc]] offset <code>0x124</code>.<br />
<br />
<source lang="C">int ScePervasiveForDriver_453BD2EC(unsigned int device, unsigned int value);</source><br />
<br />
<source lang="C"><br />
if ((device < 4) && (value < 2)) {<br />
*(uint32_t *)(ScePervasiveMisc + 0x124) = (*(uint32_t *)(ScePervasiveMisc + 0x124) & ~(1 << (device & 0xff))) | (value << (device & 0xff));<br />
dmb();<br />
}<br />
</source><br />
<br />
=== ScePervasiveForDriver_9F8E589C ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || ??<br />
|-<br />
| 2.100.081-3.740.011 || 0x9F8E589C<br />
|}<br />
<br />
SDIF related. [[Pervasive#ScePervasiveMisc_.280xE3100000.29|ScePervasiveMisc]] offsets <code>0x110</code>-<code>0x11C</code>.<br />
<br />
<source lang="C">int ScePervasiveForDriver_9F8E589C(unsigned int device, unsigned int value);</source><br />
<br />
<source lang="C"><br />
if ((device < 4) && ((param_2 & 0xfffff8ff) == 0)) {<br />
*(uint32_t *)(ScePervasiveMisc + 0x110 + device * 4) = value;<br />
dmb();<br />
}<br />
</source><br />
<br />
=== ScePervasiveForDriver_E3A735B9 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0xE3A735B9<br />
|}<br />
<br />
== SceGpioForDriver ==<br />
<br />
If <code>bus</code> is <code>0</code>, the <code>SceGpio0Reg</code> registers are used, and if <code>bus</code> is <code>1</code>, the <code>SceGpio1Reg</code> registers are used.<br />
<br />
=== Types ===<br />
<source lang="C"><br />
//For port mode<br />
#define SCE_GPIO_PORT_MODE_OUTPUT 0<br />
#define SCE_GPIO_PORT_MODE_INPUT 1<br />
<br />
//For interrupt mode<br />
#define SCE_GPIO_INTR_MODE_HIGH_SENSING 0 //High-level sensing<br />
#define SCE_GPIO_INTR_MODE_LOW_SENSING 1 //Low-level sensing<br />
#define SCE_GPIO_INTR_MODE_RISING_EDGE 2 //Rising-edge detection<br />
#define SCE_GPIO_INTR_MODE_FALLING_EDGE 3 //Falling-edge detection<br />
</source><br />
<br />
=== sceGpioSetPortModeForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.74 || 0x372022A4<br />
|}<br />
<br />
Set the port mode (input/output) of a port.<br />
<br />
<source lang="c"><br />
//mode: one of the port mode defines<br />
//Returns the old mode on success, <0 on error.<br />
int sceGpioSetPortModeForDriver(int bus, int port, int mode);<br />
</source><br />
<br />
=== sceGpioGetPortModeForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.74 || 0x372022A4<br />
|}<br />
<br />
Get the current port mode (input/output) of a port.<br />
<br />
<source lang="c"><br />
//Returns one of the port mode defines on success, <0 on error.<br />
int sceGpioGetPortModeForDriver(int bus, int port);<br />
</source><br />
<br />
=== sceGpioSetIntrModeForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.74 || 0xBBEA1DDC<br />
|}<br />
<br />
Set the interrupt mode of a port.<br />
<br />
<source lang="c"><br />
//mode: one of the interrupt mode defines<br />
int sceGpioSetIntrModeForDriver(int bus, int port, int mode);<br />
</source><br />
<br />
=== sceGpioGetIntrModeForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.74 || 0xE97A3B31<br />
|}<br />
<br />
Get the current interrupt mode of a port.<br />
<br />
<source lang="c"><br />
//Returns one of the interrupt modes on success, <0 on error.<br />
int sceGpioGetIntrModeForDriver(int bus, int port);<br />
</source><br />
<br />
=== sceGpioPortSetForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.74 || 0xD454A584<br />
|}<br />
<br />
Set a GPIO port.<br />
<br />
<source lang="c">int sceGpioPortSetForDriver(int bus, int port);</source><br />
<br />
=== sceGpioPortClearForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.74 || 0xF6310435<br />
|}<br />
<br />
Clear a GPIO port.<br />
<br />
<source lang="c">int sceGpioPortClearForDriver(int bus, int port);</source><br />
<br />
=== SceGpioForDriver_129DF5AC ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.74 || 0x129DF5AC<br />
|}<br />
<br />
Read the value of a port. Both input and output ports are accepted (in the latter case, latch value is returned).<br />
<br />
<source lang="c"><br />
//Returns SCE_TRUE if the port was set, SCE_FALSE if it was clear, <0 on error.<br />
int SceGpioForDriver_129DF5AC(int bus, int port);<br />
</source><br />
<br />
=== SceGpioForDriver_A1B5A462 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.74 || 0xA1B5A462<br />
|}<br />
<br />
Read an input port, and "write" the opposite of its state (Clear if read as 1, Set if read as 0).<br />
<br />
<source lang="c"><br />
//Returns SCE_TRUE if the port was set, SCE_FALSE if it was clear, <0 on error.<br />
int SceGpioForDriver_A1B5A462(int bus, int port);<br />
</source><br />
<br />
=== sceGpioQueryIntrForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.74 || 0x010DC295<br />
|}<br />
<br />
Check if interrupts are pending on a port.<br />
<br />
<source lang="c"><br />
//Returns SCE_FALSE if no interrupts are pending on port,<br />
//SCE_TRUE if interrupts are pending, <0 on error.<br />
int sceGpioQueryIntrForDriver(int bus, int port);<br />
</source><br />
<br />
=== sceGpioAcquireIntrForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60-3.74 || 0x35AAD77A<br />
|}<br />
<br />
Clear all pending interrupts on a port.<br />
<br />
<source lang="c"><br />
//Returns SCE_TRUE if an interrupt was pending,<br />
//SCE_FALSE if no interrupts were pending, <0 on error.<br />
int sceGpioAcquireIntrForDriver(int bus, int port);<br />
</source><br />
<br />
== ScePwmForDriver ==<br />
<br />
ScePwmForDriver_0374213C: 0x0374213C<br />
ScePwmForDriver_13161CCC: 0x13161CCC<br />
ScePwmForDriver_22C17D24: 0x22C17D24<br />
ScePwmForDriver_514773B1: 0x514773B1<br />
ScePwmForDriver_99911920: 0x99911920<br />
<br />
== SceI2cForDriver ==<br />
<br />
=== Types ===<br />
<source lang="c"><br />
typedef struct SceI2cDebugHandlers {<br />
unsigned int size;<br />
void (*write_start)(int bus, int device, unsigned char *buffer, int size);<br />
void (*write_error)(int bus, int error, int result);<br />
void (*read_start)(int bus, int device, unsigned char *buffer, int size);<br />
void (*read_error)(int bus, int error, int result);<br />
void (*write_read_start)(int bus, int write_device, unsigned char *write_buffer, int write_size);<br />
void (*write_read_error)(int bus, int error, int result);<br />
} SceI2cDebugHandlers;<br />
</source><br />
<br />
For the following functions:<br />
* <code>bus</code> indicate the target I²C bus<br />
* <code>dev_id</code> seems to indicate the address of the target device, shifted left by 1 (i.e. I²C address = <code>dev_id >> 1</code>).<br />
<br />
The ID <code>1</code> is handled in a specific way for bus 1 (see [[SceLowio#sceI2cReset|sceI2cReset]]).<br />
<br />
=== sceI2cInit ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x9CF8F3D6<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Reinitializes the I²C controller for selected bus?<br />
<br />
<source lang="c">int sceI2cInit(unsigned bus);</source><br />
<br />
=== sceI2cReset ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x76D277AB<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
This function seems to be used for synchronisation of I2c1 transfers.<br />
<br />
When calling any read/write function on I²C bus 1 with <code>dev_id == 1</code>, the function calls <code>sceKernelWaitEventFlag(/* I2c1 evf */, /* pattern = */ 0x80000000, /* ... */)</code> before performing the operation.<br />
<br />
<source lang="c"><br />
// a1 == 0 -> clear bits 0x7FFFFFFF of the synchronisation event flag pattern<br />
// a1 != 0 -> set bit 0x80000000 of the synchronisation event flag pattern<br />
int sceI2cReset(SceBool a1);<br />
</source><br />
<br />
=== sceI2cMasterTransmit ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xCA94A759<br />
|}<br />
<br />
This is an official name. Temp name was sceI2cTransferWrite.<br />
<br />
Writes data to I²C device on specified bus.<br />
<br />
<source lang="c">int sceI2cMasterTransmit(unsigned bus, unsigned dev_id, const void *buffer, unsigned size);</source><br />
<br />
=== sceI2cMasterReceive ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xD1D0A9A4<br />
|}<br />
<br />
This is an official name. Temp name was sceI2cTransferRead.<br />
<br />
Reads data from I²C device on specified bus.<br />
<br />
<source lang="c">int sceI2cMasterReceive(unsigned bus, unsigned dev_id, void *buffer, unsigned size);</source><br />
<br />
=== sceI2cMasterTransmitReceive ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x0A40B7BF<br />
|}<br />
<br />
This is an official name. Temp name was sceI2cTransferWriteRead.<br />
<br />
Performs a write to an I²C device followed by a read to a (potentially different) I2c device on the specified bus.<br />
<br />
<source lang="c">int sceI2cMasterTransmitReceive(unsigned bus, unsigned write_dev_id, const void *write_buffer, unsigned write_size, unsigned read_dev_id, void *read_buffer, unsigned read_size);</source><br />
<br />
=== sceI2cSetDebugHandlers ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xA2C7CE62<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Registers callbacks called during I²C operations.<br />
<br />
<source lang="c">int sceI2cSetDebugHandlers(unsigned bus, SceI2cDebugHandlers *debug_handlers)</source><br />
<br />
=== SceI2cForDriver_30CF9469 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x30CF9469<br />
|}<br />
<br />
Writes <code>a2</code> and <code>a3</code> to some per-bus global variables that are seemingly never read, then writes a value to I2cReg->unk18 depending on [[KBL Param#Hardware_Info|Hardware Info]] mask 0x00FF0000 (motherboard main version).<br />
<br />
<source lang="c">int SceI2cForDriver_30CF9469(unsigned bus, unsigned a2, unsigned a3);</source><br />
<br />
=== SceI2cForDriver_E449AC6E ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xE449AC6E<br />
|}<br />
<br />
Writes <code>a2</code> to some per-bus global variable that is seemingly never read.<br />
<br />
<source lang="c">int SceI2cForDriver_E449AC6E(unsigned bus, unsigned a2);</source><br />
<br />
== SceGrabForDriver ==<br />
<br />
=== sceGrabCompatStartExForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x072B8D93<br />
|}<br />
<br />
Calls [[SceExcpmgr#SMC|SMC]] 0x11e. <code>smc(0x11E, 1, param)</code><br />
<br />
Replacement for [[SceLowio#scePervasiveCompatStartForDriver]].<br />
<br />
<source lang="C"><br />
// command: 0, 1<br />
int sceGrabCompatStartExForDriver(int param);<br />
</source><br />
<br />
=== SceGrabForDriver_188BBCC8 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x188BBCC8<br />
|}<br />
<br />
Calls [[SceExcpmgr#SMC|SMC]] 0x11C.<br />
<br />
=== SceGrabForDriver_1F292554 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x1F292554<br />
|}<br />
<br />
Calls [[SceExcpmgr#SMC|SMC]] 0x121. <code>smc(0x121)</code><br />
<br />
=== sceGrabCompatLcdDmacInitForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x379130B2<br />
|}<br />
<br />
Calls [[SceExcpmgr#SMC|SMC]] 0x11e. <code>smc(0x11E, 2)</code><br />
<br />
Replacement for [[SceLowio#scePervasiveCompatLcdDmacInitForDriver]].<br />
<br />
=== SceGrabForDriver_5F36ABC4 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x5F36ABC4<br />
|}<br />
<br />
Calls [[SceExcpmgr#SMC|SMC]] 0x11f. <code>smc(0x11f)</code><br />
<br />
=== SceGrabForDriver_B22EE8BC ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xB22EE8BC<br />
|}<br />
<br />
Calls [[SceExcpmgr#SMC|SMC]] 0x11b. <code>smc(0x11b)</code><br />
<br />
=== SceGrabForDriver_E9C25A28 ===<br />
<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xE9C25A28<br />
|}<br />
<br />
Set PSP address.<br />
<br />
Calls [[SceExcpmgr#SMC|SMC]] 0x11d. <code>smc(0x11d)</code><br />
<br />
{| class="wikitable"<br />
|-<br />
! bank !! Address in PSP<br />
|-<br />
| 0 || ?<br />
|-<br />
| 1 || ?<br />
|-<br />
| 2 || ?<br />
|-<br />
| 3 || 0xA8000000<br />
|-<br />
| 4 || ?<br />
|-<br />
| 5 || ?<br />
|-<br />
| 6 || ?<br />
|-<br />
| 7 || ?<br />
|}<br />
<br />
<source lang="C"><br />
// bank can be from 0 to 7<br />
int SceGrabForDriver_E9C25A28(SceUInt32 bank, SceUIntPtr paddr);<br />
</source><br />
<br />
=== sceGrabCompatStopForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xF13C63DD<br />
|}<br />
<br />
Calls [[SceExcpmgr#SMC|SMC]] 0x11e. <code>smc(0x11E, 0)</code><br />
<br />
Replacement for [[SceLowio#scePervasiveCompatStopForDriver]].<br />
<br />
== SceCdramForDriver ==<br />
<br />
=== sceCdramExitSelfResreshForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940 || 0x41D821F3<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
Typo in name is from SCE.<br />
<br />
Calls [[SceExcpmgr#SMC|SMC]] 0x119.<br />
<br />
=== sceCdramEnterSelfResreshForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940 || 0xBA81E0E3<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
Typo in name is from SCE.<br />
<br />
Calls [[SceExcpmgr#SMC|SMC]] 0x118.<br />
<br />
=== SceCdramForDriver_0657FC1B ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940 || not present<br />
|-<br />
| 3.60 || 0x0657FC1B<br />
|}<br />
<br />
Probably <code>sceCdramExitSelfRefresh</code>.<br />
<br />
Calls [[SceExcpmgr#SMC|SMC]] 0x119.<br />
<br />
=== SceCdramForDriver_2D728EBF ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940 || not present<br />
|-<br />
| 3.60 || 0x2D728EBF<br />
|}<br />
<br />
Probably <code>sceCdramEnterSelfRefresh</code>.<br />
<br />
Calls [[SceExcpmgr#SMC|SMC]] 0x118.<br />
<br />
=== SceCdramForDriver_3EFA7540 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940 || not present<br />
|-<br />
| 3.60 || 0x3EFA7540<br />
|}<br />
<br />
== SceDsiForDriver ==<br />
<br />
=== sceDsiStopMasterForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940-3.60 || 0x114D1413<br />
|}<br />
<br />
Temp name was sceDsiDisableHeadForDriver.<br />
<br />
<source lang="c">int sceDsiStopMasterForDriver(SceDisplayHead head);</source><br />
<br />
=== sceDsiDcsReadForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x3FB0DF1F<br />
|}<br />
<br />
<source lang="c">int sceDsiDcsReadForDriver(SceDisplayHead head, unsigned short param, void *buf, SceSize size);</source><br />
<br />
MIPI DSI DCS Read (0x06)<br />
<br />
=== sceDsiGetPixelClockForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x4DF9E924<br />
|}<br />
<br />
<source lang="c">int sceDsiGetPixelClockForDriver(SceDisplayHead head);</source><br />
<br />
=== sceDsiStartMasterForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940-3.60 || 0x5BE5AA9B<br />
|}<br />
<br />
Temp name was sceDsiEnableHeadForDriver.<br />
<br />
<source lang="c">int sceDsiStartMasterForDriver(SceDisplayHead head);</source><br />
<br />
=== SceDsiForDriver_6F8029A1 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x6F8029A1<br />
|}<br />
<br />
<source lang="c">int SceDsiForDriver_6F8029A1(SceDisplayHead head);</source><br />
<br />
Returns the current Vcount, read from <code>((*(u32 *)([[DSI_Registers#Registers|SceDsiReg]] + 0x4C) >> 16) & 0x1FFF) - 1</code>.<br />
<br />
=== sceDsiStopDisplayForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940-3.60 || 0x7640F607<br />
|}<br />
<br />
<source lang="c">int sceDsiStopDisplayForDriver(SceDisplayHead head);</source><br />
<br />
=== sceDsiSetDisplayModeForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x78E6E3CF<br />
|}<br />
<br />
Temp name was sceDsiSetLanesAndPixelSizeForDriver.<br />
<br />
For <code>head</code> == SCE_DISPLAY_HEAD_MAIN_LCD_OLED, <code>lanes</code> must be 2 and <code>pixelsize</code> 24.<br />
<br />
For <code>head</code> == SCE_DISPLAY_HEAD_HDMI, <code>lanes</code> can be 2 or 3 and <code>pixelsize</code> can be 24 or 30.<br />
<br />
<source lang="c">int sceDsiSetDisplayModeForDriver(SceDisplayHead head, int lanes, int pixelsize);</source><br />
<br />
=== SceDsiForDriver_8610B795 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x8610B795<br />
|}<br />
<br />
Sets internal struct member <code>struct[head].unk1C = mul * struct[head].unk18 / div</code>.<br />
<br />
<source lang="c">int SceDsiForDriver_8610B795(SceDisplayHead head, int mul, int div);</source><br />
<br />
=== sceDsiGenericShortWriteForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x89C00D2F<br />
|}<br />
<br />
Performs a MIPI DSI Generic Short Write, no parameters (0x03), MIPI DSI Generic Short Write, 1 parameter (0x13) or MIPI DSI Generic Short Write, 2 parameters (0x23) depending on the whether <code>param<sub>i</sub></code> is negative or not (bit 31 set).<br />
<br />
<source lang="c">int int sceDsiGenericShortWriteForDriver(SceDisplayHead head, int param0, int param1, int param2);</source><br />
<br />
=== sceDsiSetScreenModeForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x97BFEA76<br />
|}<br />
<br />
Temp name was sceDsiSetVicForDriver.<br />
<br />
<source lang="c">int sceDsiSetScreenModeForDriver(SceDisplayHead head, SceDisplayScreenMode screenMode);</source><br />
<br />
=== sceDsiGenericReadRequestForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x98120684<br />
|}<br />
<br />
Performs a MIPI DSI Generic Read Request, no parameters (0x04), or MIPI DSI Generic Read Request, 1 parameter (0x14) depending on the whether <code>param</code> is negative or not (bit 31 set).<br />
<br />
<source lang="c">int sceDsiGenericReadRequestForDriver(SceDisplayHead head, int param, void *buff, SceSize size);</source><br />
<br />
=== sceDsiDcsShortWriteForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xBA6BC89F<br />
|}<br />
<br />
If <code>param1</code> is negative (bit 31 set), MIPI DSI DCS Short Write, no parameters (0x05) is performed. MIPI DSI DCS Short Write, 1 parameter (0x15) is performed otherwise.<br />
<br />
<source lang="c">int sceDsiDcsShortWriteForDriver(SceDisplayHead head, SceUInt16 param0, SceUInt32 param1);</source><br />
<br />
=== sceDsiStartDisplayForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940-3.60 || 0xC2E85919<br />
|}<br />
<br />
<source lang="c">int sceDsiStartDisplayForDriver(SceDisplayHead head, SceUInt32 control);</source><br />
<br />
=== SceDsiForDriver_F2921E29 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xF2921E29<br />
|}<br />
<br />
<source lang="c">int SceDsiForDriver_F2921E29(SceDisplayHead head, SceUInt32 unk);</source><br />
<br />
=== sceDsiQeuryResolutionSizeForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940 || 0xFA9E2DC5<br />
|-<br />
| 3.60 || sceDsiQueryResolutionSizeForDriver<br />
|}<br />
<br />
The typo in the function name was fixed since an unknown FW, and so the NID was updated. See also sceDsiQueryResolutionSizeForDriver.<br />
<br />
=== sceDsiQueryResolutionSizeForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940 || sceDsiQeuryResolutionSizeForDriver<br />
|-<br />
| 3.60 || 0xB3A70C05<br />
|}<br />
<br />
Temp name was sceDsiGetVicResolutionForDriver.<br />
<br />
For progressive modes, <code>V_total = V_active + VFP + VSW + VBP</code>. For interlaced modes, <code>V_total = V_active + 2 * (VFP + VSW + VBP) - 1</code>.<br />
<br />
<source lang="c">int sceDsiQueryResolutionSizeForDriver(SceDisplayScreenMode screenMode, int *width, int *height);</source><br />
<br />
== SceIftuForDriver ==<br />
<br />
<source lang="c"><br />
typedef struct SceIftuFrameBuf {<br />
unsigned int pixelformat;<br />
unsigned int width; /* Aligned to 16 */<br />
unsigned int height; /* Aligned to 8 */<br />
unsigned int leftover_stride; /* (pitch - aligned_w) * bpp */<br />
unsigned int leftover_align; /* if YCbCr: (width >> 1) & 0xF [chroma align?] */<br />
unsigned int paddr0;<br />
unsigned int paddr1;<br />
unsigned int paddr2;<br />
} SceIftuFrameBuf; /* size = 0x20 */<br />
<br />
typedef struct SceIftuPlaneState {<br />
SceIftuFrameBuf fb;<br />
unsigned int unk20; // not observed to be non-zero<br />
unsigned int unk24; // not observed to be non-zero<br />
unsigned int unk28; // not observed to be non-zero<br />
unsigned int src_w; // inverse scaling factor in 16.16 fixed point<br />
unsigned int src_h; // inverse scaling factor in 16.16 fixed point<br />
unsigned int dst_x; // offset into the destination buffer<br />
unsigned int dst_y; // offset into the destination buffer<br />
unsigned int src_x; // offset into the source buffer in 8.8 fixed point<br />
unsigned int src_y; // offset into the source buffer in 8.8 fixed point<br />
unsigned int crop_top;<br />
unsigned int crop_bot;<br />
unsigned int crop_left;<br />
unsigned int crop_right;<br />
} SceIftuPlaneState; /* size = 0x54 */<br />
<br />
typedef struct SceIftuCscParams {<br />
unsigned int post_add_0; /* 10-bit integer */<br />
unsigned int post_add_1_2; /* 10-bit integer */<br />
unsigned int post_clamp_max_0; /* 10-bit integer */<br />
unsigned int post_clamp_min_0; /* 10-bit integer */<br />
unsigned int post_clamp_max_1_2; /* 10-bit integer */<br />
unsigned int post_clamp_min_1_2; /* 10-bit integer */<br />
unsigned int ctm[3][3]; /* S3.9 fixed point format */<br />
} SceIftuCscParams; /* size = 0x3C */<br />
<br />
typedef struct SceIftuConvParams {<br />
unsigned int size;<br />
unsigned int unk04;<br />
SceIftuCscParams *csc_params1; // +0x08<br />
SceIftuCscParams *csc_params2; // +0x0C<br />
unsigned int csc_control; // +0x10<br />
unsigned int unk14;<br />
unsigned int unk18;<br />
unsigned int unk1C;<br />
unsigned int alpha;<br />
unsigned int unk24;<br />
} SceIftuConvParams; /* size = 0x28 */<br />
</source><br />
<br />
=== sceIftuEnableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940-3.60 || 0x0D7C02F7<br />
|}<br />
<br />
Temp name was SceIftuForDriver_0D7C02F7_plane_enable.<br />
<br />
<source lang="c"><br />
// plane must be between 0 and 3<br />
int sceIftuEnableForDriver(unsigned int plane);<br />
</source><br />
<br />
=== SceIftuForDriver_0FCBF457 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x0FCBF457<br />
|}<br />
<br />
Set plane CSC (Color Space Conversion) information.<br />
<br />
<source lang="c">int SceIftuForDriver_0FCBF457_set_plane_csc2(unsigned int plane, SceIftuCscParams *param);</source><br />
<br />
=== SceIftuForDriver_357EAE24 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x357EAE24<br />
|}<br />
<br />
Sets plane alpha value. Only planes 1 and 3 support alpha blending. Supported alpha values are 0-0x100 where 0x100 is no transparency (alpha blending disable).<br />
<br />
<source lang="c">int SceIftuForDriver_357EAE24_set_plane_alpha(unsigned int plane, int alpha);</source><br />
<br />
=== sceIftuSetInputFrameBufferForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940-3.60 || 0x7CE0C4DA<br />
|}<br />
<br />
Set bilinear to 0 for nearest neighbour, set to 1 for bilinear filtering, set to -1 when plane_state is a zero struct.<br />
<br />
<source lang="c">int sceIftuSetInputFrameBufferForDriver(unsigned int plane_index, SceIftuPlaneState *plane_state, int bilinear, int sync);</source><br />
<br />
=== sceIftuConvertForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940-3.60 || 0x67E37EFC<br />
|}<br />
<br />
Temp name was sceIftuCscForDriver.<br />
<br />
Performs Color Space Conversion (by using SceIftu2Reg).<br />
<br />
<source lang="c">int sceIftuConvertForDriver(SceIftuFrameBuf *dst_fb, SceIftuPlaneState *src_plane_state, SceIftuConvParams *conv_params);</source><br />
<br />
=== sceIftuSetMergeSettingForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940-3.60 || 0xAF19FD85<br />
|}<br />
<br />
Temp name was SceIftuForDriver_AF19FD85_set_global_blending_control.<br />
<br />
<source lang="c">int sceIftuSetMergeSettingForDriver(unsigned int plane, int control);</source><br />
<br />
=== sceIftuDisableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940-3.60 || 0xC11F30B3<br />
|}<br />
<br />
Temp name was SceIftuForDriver_C11F30B3_plane_disable.<br />
<br />
<source lang="c">int sceIftuDisableForDriver(unsigned int plane);</source><br />
<br />
=== SceIftuForDriver_D64F4C6B ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xD64F4C6B<br />
|}<br />
<br />
Set plane CSC (Color Space Conversion) information.<br />
<br />
<source lang="c">int SceIftuForDriver_D64F4C6B_set_plane_csc(unsigned int plane, SceIftuCscParams *param);</source><br />
<br />
=== sceIftuSetOutputFormatForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940-3.60 || 0xE6EE2C6B<br />
|}<br />
<br />
<source lang="c">int sceIftuSetOutputFormatForDriver(int plane, int width, int height, int pixel_format, int interlaced);</source><br />
<br />
== SceCsiForDriver ==<br />
<br />
=== SceCsiForDriver_10545393 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940-3.60 || 0x10545393<br />
|}<br />
<br />
Copies buf to memory.<br />
<br />
<source lang="C"><br />
// buf size is 0x2C<br />
int SceCsiForDriver_10545393(SceDisplayHead head, void *buf);<br />
</source><br />
<br />
=== SceCsiForDriver_2AFEA1B0 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940-3.60 || 0x2AFEA1B0<br />
|}<br />
<br />
<source lang="C">int SceCsiForDriver_2AFEA1B0(SceDisplayHead head, SceUInt a2);</source><br />
<br />
=== SceCsiForDriver_4AE39F26 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940-3.60 || 0x4AE39F26<br />
|}<br />
<br />
Maybe CSI stop.<br />
<br />
<source lang="C">int SceCsiForDriver_4AE39F26(SceDisplayHead head);</source><br />
<br />
=== SceCsiForDriver_A1D1805D ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940-3.60 || 0xA1D1805D<br />
|}<br />
<br />
Maybe CSI start.<br />
<br />
<source lang="C">int SceCsiForDriver_A1D1805D(SceDisplayHead head);</source><br />
<br />
=== SceCsiForDriver_B508822B ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940-3.60 || 0xB508822B<br />
|}<br />
<br />
Sets a2 and a3 in memory.<br />
<br />
<source lang="C">int SceCsiForDriver_B508822B(SceDisplayHead head, int a2, int a3);</source><br />
<br />
=== SceCsiForDriver_FC165297 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.940-3.60 || 0xFC165297<br />
|}<br />
<br />
Sets a2 in memory.<br />
<br />
<source lang="C">int SceCsiForDriver_FC165297(SceDisplayHead head, int a2);</source><br />
<br />
[[Category:ARM]]<br />
[[Category:Kernel]]<br />
[[Category:Modules]]<br />
[[Category:Library]]</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=Template:Devices&diff=21095
Template:Devices
2024-01-28T18:04:59Z
<p>CreepNT: Rework section and add/rename missing devices</p>
<hr />
<div>{{Navbox<br />
|name = Devices<br />
|title = Devices<br />
|image = <br />
<br />
|group1 = Models<br />
|list1 = [[PCH-1XXX]] {{·}} [[PCH-2XXX]] {{·}} [[VTE-1XXX]] {{·}} [[PTEL-XXXX]] {{·}} [[PDEL-100X]] {{·}} [[DEM-3000X]] {{·}} [[Platform type]]<br />
<br />
|group2 = [[Kermit]]<br />
|list2 = {{Navbox|child<br />
|group1 = Processors<br />
|list1 = [[Main Processor|ARM Core]] ([[Interrupts]]) {{·}} [[Cmep]] {{·}} [[Venezia]] {{·}} [[SGX543|GPU]] {{·}} [[PSP Emulator]]<br />
|group2 = Peripherals<br />
|list2 = [[DMAC]] {{·}} [[Pervasive]] {{·}} [[ARM Debugger Interface|CoreSight]] {{·}} [[UART Registers]] {{·}} [[GPIO Registers]] {{·}} [[SPI Registers]] {{·}} [[I2C Registers]] {{·}} [[MSIF Registers]] {{·}} [[SDIF Registers]] {{·}} [[IFTU Registers]] {{·}} [[DSI Registers|MIPI DSI Registers]]<br />
|group3 = Memory<br />
|list3 = [[Physical Memory]] {{·}} [[Caches]]<br />
}}<br />
<br />
|group3 = Peripherals<br />
|list3 = {{Navbox|child<br />
|list1 = [[Ernie]] {{·}} [[Barkley]] {{·}} [[SceTouch|Touch Screen Controller]] {{·}} [[SceClockgen|Clockgen]] {{·}} [[Communication Processor]]<br />
|group2 = Power Management<br />
|list2 = [[Abby]] {{·}} [[Cookie]] {{·}} [[Elmo]]<br />
|group3 = Communications<br />
|list3 = [[Marvell 88W878S-BKB2]] (WlanBt) {{·}} [[Zoe|3G Modem]] {{·}} Ethernet ([[SceUsbEtherRtl|Realtek]]/[[SceUsbEtherSmsc|SMSC]])<br />
|group4 = Storage<br />
|list4 = [[eMMC]] {{·}} [[Game Card]] {{·}} [[Memory Card]]<br />
|group5 = Ports<br />
|list5 = [[USB]] {{·}} [[UDC|MultiCn]] {{·}} [[Accessory Port]]<br />
|group6 = Audio/Video<br />
|list6 = [[Screen]] {{·}} [[HDMI]] {{·}} [[SceCodec|Audio Codec]]<br />
}}<br />
}}</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=Abby&diff=21094
Abby
2024-01-28T11:11:32Z
<p>CreepNT: Add to Devices category</p>
<hr />
<div>Abby is the codename of the Fuel Gauge (battery management) IC of the PS Vita. This IC works in conjunction with [[Cookie]] to charge the battery of the unit, and also monitors the battery's charge level, health, etc.<br />
<br />
= Hardware =<br />
<br />
== SN27520 ==<br />
<br />
Customized(?) version of the Texas Instruments bq27520.<br />
<br />
Used in Fat units.<br />
<br />
[[Category:Devices]]</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=Elmo&diff=21093
Elmo
2024-01-28T11:11:03Z
<p>CreepNT: Fix formatting and add to Devices category</p>
<hr />
<div><br />
Elmo is the codename of the Power Management IC (PMIC) of the PS Vita. The PMIC is responsible for generating the various voltages required by [[Kermit]] and probably other devices on the board.<br />
<br />
= Hardware =<br />
<br />
The Elmo PMIC is manufactured by Fujitsu. All models are part of the custom "MB44" series but the exact model used depends on the unit.<br />
<br />
[[Ernie]] can communicate with Elmo via I²C.<br />
<br />
[[File:FCC PCH-1001 PMIC.png|thumb|<code>MB44C026A</code> on the PCH-1001 FCC application unit]]<br />
[[File:FCC PCH-2001 board.png|thumb|<code>MB44C032</code> on the PCH-2001 FCC application unit]]<br />
<br />
== <code>MB44C026</code> ==<br />
<br />
Seen in: DEM-3000G, PDEL-1000 (IRT-002)<br />
<br />
Date codes: 1021, 1139<br />
<br />
== <code>MB44026A</code> ==<br />
<br />
Seen in: PCH-1001 FCC application unit, PCH-1xxx (IRS-002), VTE-1xxx (DOL-1001)<br />
<br />
Date codes: 1125, 1149, 1221<br />
<br />
== <code>MB44C029</code> ==<br />
<br />
Seen in: PCH-1000 (IRS-1001)<br />
<br />
Date codes: 1240<br />
<br />
== <code>MB44C032</code> ==<br />
<br />
Uses a black package instead of white/metallic.<br />
<br />
Seen in: PCH-2001 FCC application unit, PCH-2000 (USS-1001)<br />
<br />
Date codes: 1448, 1330<br />
<br />
[[Category:Devices]]</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=Abby&diff=20935
Abby
2024-01-06T19:36:36Z
<p>CreepNT: refactor to look similar to other pages, add hw model number</p>
<hr />
<div>Abby is the codename of the Fuel Gauge (battery management) IC of the PS Vita. This IC works in conjunction with [[Cookie]] to charge the battery of the unit, and also monitors the battery's charge level, health, etc.<br />
<br />
= Hardware =<br />
<br />
== SN27520 ==<br />
<br />
Customized(?) version of the Texas Instruments bq27520.<br />
<br />
Used in Fat units.</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=Codenames&diff=20932
Codenames
2024-01-06T16:41:22Z
<p>CreepNT: /* Sesame Street */ Add links, remove bad part numbers</p>
<hr />
<div>The PS Vita software and hardware is often given by SCE codenames. This page lists them grouped by theme.<br />
<br />
= Models =<br />
<br />
* Iris: PS Vita 1000 series<br />
* Ushiwaka: PS Vita 2000 series<br />
* Dolce: PS TV<br />
<br />
= Sesame Street =<br />
<br />
Whilst PSP codenames were inspired by the Star Trek universe, most PS Vita codenames make reference to Sesame Street characters. Kermit the Frog, arguably Jim Henson's most famous Muppet creation, was the star and host of The Muppet Show, and played a significant role on Sesame Street.<br />
<br />
* [[Kermit|Kermit]]: SoC. SCE's temporary codename for Kermit was SoC. Toshiba chip.<br />
* [[Ernie|Ernie]]: Syscon. SCE's temporary codename for Ernie was Syscon. On PSP it was codenamed Baryon as a reference to Star Trek. Renesas chip.<br />
* Grover: [[Communication_Processor|Communication Processor]]<br />
* [[Elmo]]: Power Management IC<br />
* [[Abby]]/?Bert?: Battery Fuel Gauge (System-Side Impedance Track™ Fuel Gauge With Integrated LDO). SCE's temporary codename for Abby was Battery.<br />
* [[Cookie]]: USB Charge Management IC<br />
* Barkley: Motion sensor (maybe only gyroscope part)<br />
<br />
= Toshiba =<br />
<br />
* [[Venezia|Venezia]]: Toshiba's codename for car camera's smart recognition chip. SCE's temporary codename for Venezia was CodecEngine.<br />
* VIP: Toshiba Venezia Image Processing<br />
* [[Cmep|Cry/Cmep]]: Toshiba MeP crypto processor</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=Cookie&diff=20931
Cookie
2024-01-06T16:40:09Z
<p>CreepNT: </p>
<hr />
<div>Cookie is the codename of the USB Charge Management IC of the PS Vita. This IC works in conjunction with [[Abby]] to charge the battery of the unit. ??When the PS Vita is powered off and connected to a PC, this chip is likely what the USB sees??<br />
<br />
Cookie is absent from units without a battery (DEM/PDEL). [[Ernie]] is connected to Cookie via I²C.<br />
<br />
= Hardware =<br />
<br />
== SN99057RSBR ==<br />
The Texas Instruments SN99057RSBR is used in Fat models. A [http://www.ti.com/product/TS3USB31 TS3USB31RSER] USB switch is connected to Cookie and Kermit's USB interfaces.<br />
<br />
Texas Instruments has stated that “the SN99057RSBR part was a custom device manufactured for a specific company.”<br />
<br />
The device is now obsolete nor do we have access to the datasheet.<br />
<br />
{| class="wikitable mw-collapsible mw-collapsed"<br />
|+ Device pinout<br />
! Pin<br />
! Type<br />
! Description<br />
|-<br />
| 1<br />
| ?<br />
| N/C<br />
|-<br />
| 2<br />
| I/O<br />
| To bq27520-G1 A2 - SOC_INT, indicates battery charged > threshold<br />
|-<br />
| 3<br />
| PWR<br />
| <br />
|-<br />
| 4<br />
| PWR<br />
| <br />
|-<br />
| 5<br />
| PWR<br />
| <br />
|-<br />
| 6<br />
| I/O<br />
| To TS3USB31 USB D+<br />
|-<br />
| 7<br />
| I/O<br />
| To TS3USB31 USB D-<br />
|-<br />
| 8<br />
| I/O<br />
| To Kermit GPIO B20<br />
|-<br />
| 9<br />
| I/O<br />
| To Kermit GPIO A23<br />
|-<br />
| 10<br />
| I/O<br />
| To Kermit GPIO A25<br />
|-<br />
| 11<br />
| ?<br />
| To passives<br />
|-<br />
| 12<br />
| ?<br />
| To capacitor<br />
|-<br />
| 13<br />
| PWR<br />
| <br />
|-<br />
| 14<br />
| PWR<br />
| <br />
|-<br />
| 15<br />
| PWR<br />
| Net 1 (Battery)<br />
|-<br />
| 16<br />
| PWR<br />
| Net 1 (Battery)<br />
|-<br />
| 17<br />
| PWR<br />
| Net 1 (Battery)<br />
|-<br />
| 18<br />
| PWR<br />
| Net 2<br />
|-<br />
| 19<br />
| PWR<br />
| Net 2<br />
|-<br />
| 20<br />
| PWR<br />
| Net 2<br />
|-<br />
| 21<br />
| PWR<br />
| <br />
|-<br />
| 22<br />
| ?<br />
| N/C<br />
|-<br />
| 23<br />
| GND<br />
| <br />
|-<br />
| 24<br />
| GND<br />
| <br />
|-<br />
| 25<br />
| PWR<br />
| Net 3<br />
|-<br />
| 26<br />
| PWR<br />
| Net 3<br />
|-<br />
| 27<br />
| PWR<br />
| Net 4<br />
|-<br />
| 28<br />
| PWR<br />
| Net 4<br />
|-<br />
| 29<br />
| PWR<br />
| Net 4<br />
|-<br />
| 30<br />
| PWR<br />
| Net 4<br />
|-<br />
| 31<br />
| PWR<br />
| Net 5<br />
|-<br />
| 32<br />
| PWR<br />
| Net 5<br />
|-<br />
| 33<br />
| ?<br />
| To capacitor<br />
|-<br />
| 34<br />
| PWR<br />
| Net 6 (USB VBUS)<br />
|-<br />
| 35<br />
| PWR<br />
| Net 6 (USB VBUS)<br />
|-<br />
| 36<br />
| GND<br />
| <br />
|-<br />
| 37<br />
| I/O<br />
| To right daughterboard<br />
|-<br />
| 38<br />
| I/O<br />
| To Syscon (G8)<br />
|-<br />
| 39<br />
| I2C<br />
| SDA<br />
|-<br />
| 40<br />
| I2C<br />
| SCL<br />
|}<br />
<br />
== C3008A2 ==<br />
<br />
A different Texas Instruments IC used on Slim units. USB data lines enter this chip and two other lines go from it to Kermit USB (presumably).<br />
<br />
The following marking is present on the chip (where <code>xxxx</code> varies between devices):<br />
<source><br />
C3008<br />
A2<br />
TI 37K<br />
xxxx G4<br />
</source><br />
<br />
[[Category:Devices]]</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=SN99057&diff=20930
SN99057
2024-01-06T16:07:09Z
<p>CreepNT: CreepNT moved page SN99057 to Cookie: Use codename as chip M/N is different on new units.</p>
<hr />
<div>#REDIRECT [[Cookie]]</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=Cookie&diff=20929
Cookie
2024-01-06T16:07:09Z
<p>CreepNT: CreepNT moved page SN99057 to Cookie: Use codename as chip M/N is different on new units.</p>
<hr />
<div>The Texas Instruments SN99057RSBR is a power management IC used by the PS Vita in conjunction with the [http://www.ti.com/product/bq27520-g1 bq27520-G1] battery fuel gauge to manage the battery. There is a USB interface that is connected to a switch [http://www.ti.com/product/TS3USB31 TS3USB31RSER] with the main [[Kermit]] USB. When the PS Vita is powered off and connected to a PC, this chip is likely what the USB sees. Texas Instruments has stated that “the SN99057RSBR part was a custom device manufactured for a specific company.”<br />
<br />
The device is now obsolete nor do we have access to the datasheet.<br />
<br />
The current hypothesis is that this IC is responsible of managing battery charging.<br />
<br />
== Pinout ==<br />
<br />
{| class="wikitable"<br />
! Pin<br />
! Type<br />
! Description<br />
|-<br />
| 1<br />
| ?<br />
| N/C<br />
|-<br />
| 2<br />
| I/O<br />
| To bq27520-G1 A2 - SOC_INT, indicates battery charged > threshold<br />
|-<br />
| 3<br />
| PWR<br />
| <br />
|-<br />
| 4<br />
| PWR<br />
| <br />
|-<br />
| 5<br />
| PWR<br />
| <br />
|-<br />
| 6<br />
| I/O<br />
| To TS3USB31 USB D+<br />
|-<br />
| 7<br />
| I/O<br />
| To TS3USB31 USB D-<br />
|-<br />
| 8<br />
| I/O<br />
| To Kermit GPIO B20<br />
|-<br />
| 9<br />
| I/O<br />
| To Kermit GPIO A23<br />
|-<br />
| 10<br />
| I/O<br />
| To Kermit GPIO A25<br />
|-<br />
| 11<br />
| ?<br />
| To passives<br />
|-<br />
| 12<br />
| ?<br />
| To capacitor<br />
|-<br />
| 13<br />
| PWR<br />
| <br />
|-<br />
| 14<br />
| PWR<br />
| <br />
|-<br />
| 15<br />
| PWR<br />
| Net 1 (Battery)<br />
|-<br />
| 16<br />
| PWR<br />
| Net 1 (Battery)<br />
|-<br />
| 17<br />
| PWR<br />
| Net 1 (Battery)<br />
|-<br />
| 18<br />
| PWR<br />
| Net 2<br />
|-<br />
| 19<br />
| PWR<br />
| Net 2<br />
|-<br />
| 20<br />
| PWR<br />
| Net 2<br />
|-<br />
| 21<br />
| PWR<br />
| <br />
|-<br />
| 22<br />
| ?<br />
| N/C<br />
|-<br />
| 23<br />
| GND<br />
| <br />
|-<br />
| 24<br />
| GND<br />
| <br />
|-<br />
| 25<br />
| PWR<br />
| Net 3<br />
|-<br />
| 26<br />
| PWR<br />
| Net 3<br />
|-<br />
| 27<br />
| PWR<br />
| Net 4<br />
|-<br />
| 28<br />
| PWR<br />
| Net 4<br />
|-<br />
| 29<br />
| PWR<br />
| Net 4<br />
|-<br />
| 30<br />
| PWR<br />
| Net 4<br />
|-<br />
| 31<br />
| PWR<br />
| Net 5<br />
|-<br />
| 32<br />
| PWR<br />
| Net 5<br />
|-<br />
| 33<br />
| ?<br />
| To capacitor<br />
|-<br />
| 34<br />
| PWR<br />
| Net 6 (USB VBUS)<br />
|-<br />
| 35<br />
| PWR<br />
| Net 6 (USB VBUS)<br />
|-<br />
| 36<br />
| GND<br />
| <br />
|-<br />
| 37<br />
| I/O<br />
| To right daughterboard<br />
|-<br />
| 38<br />
| I/O<br />
| To Syscon (G8)<br />
|-<br />
| 39<br />
| I2C<br />
| SDA<br />
|-<br />
| 40<br />
| I2C<br />
| SCL<br />
|}<br />
<br />
<br />
[[Category:Devices]]</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=Elmo&diff=20928
Elmo
2024-01-06T16:05:50Z
<p>CreepNT: Created page with " Elmo is the codename of the Power Management IC (PMIC) of the PS Vita. The PMIC is responsible for generating the various voltages required by Kermit and probably other d..."</p>
<hr />
<div><br />
Elmo is the codename of the Power Management IC (PMIC) of the PS Vita. The PMIC is responsible for generating the various voltages required by [[Kermit]] and probably other devices on the board.<br />
<br />
= Hardware =<br />
<br />
The Elmo PMIC is manufactured by Fujitsu. All models are part of the custom "MB44" series but the exact model used depends on the unit.<br />
<br />
[[Ernie]] can communicate with Elmo via I²C.<br />
<br />
[[File:FCC PCH-1001 PMIC.png|thumb|<code>MB44C026A</code> on the PCH-1001 FCC application unit]]<br />
[[File:FCC PCH-2001 board.png|thumb|<code>MB44C032</code> on the PCH-2001 FCC application unit]]<br />
<br />
== <code>MB44C026</code> ==<br />
<br />
Seen in: DEM-3000G, PDEL-1000 (IRT-002)<br />
<br />
Date codes: 1021, 1139<br />
<br />
== MB44026A ==<br />
<br />
Seen in: PCH-1001 FCC application unit, PCH-1xxx (IRS-002), VTE-1xxx (DOL-1001)<br />
<br />
Date codes: 1125, 1149, 1221<br />
<br />
== MB44C029 ==<br />
<br />
Seen in: PCH-1000 (IRS-1001)<br />
<br />
Date codes: 1240<br />
<br />
== MB44C032 ==<br />
<br />
Uses a black package instead of white/metallic.<br />
<br />
Seen in: PCH-2001 FCC application unit, PCH-2000 (USS-1001)<br />
<br />
Date codes: 1448, 1330</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=File:FCC_PCH-2001_board.png&diff=20927
File:FCC PCH-2001 board.png
2024-01-06T15:52:24Z
<p>CreepNT: </p>
<hr />
<div>The board of the unit used for the PCH-2001 FCC application.</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=File:FCC_PCH-1001_PMIC.png&diff=20926
File:FCC PCH-1001 PMIC.png
2024-01-06T15:28:56Z
<p>CreepNT: </p>
<hr />
<div>The Power Management IC (PMIC / Elmo) found on the IRS-102 motherboard of the unit tested for FCC application of the PCH-1001.</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=Kermit&diff=20889
Kermit
2024-01-03T19:17:25Z
<p>CreepNT: /* Variants */ Add Kermit 1.5 on late Fat</p>
<hr />
<div>The PS Vita main SoC, nicknamed Kermit, is manufactured by Toshiba. The design is a stacked SoC with the SDRAM found in the same chip as the processor cores. Toshiba details their "[http://www.toshiba-components.com/ASIC/SiP.html Stacked Chip SOC]" on their site.<br />
<br />
More information can be found at [https://web.archive.org/web/20150425204407/http://www.chipworks.com/en/technical-competitive-analysis/resources/blog/sonys-ps-vita-uses-chip-on-chip-sip-3d-but-not-3d/ Chipworks].<br />
<br />
[[File:T9ML7MBG-S.png|thumb|From FCC application 712137]]<br />
According to the internal photos found in the [https://apps.fcc.gov/oetcf/eas/reports/ViewExhibitReport.cfm?mode=Exhibits&RequestTimeout=500&calledFromFrame=N&application_id=712137&fcc_id=AK8PCH1101A FCC filings], it appears that an earlier version of the chip is labeled <code>T9ML7MBG-S</code>. This does not appear to be a standard model and is likely custom designed in partnership with Sony Computer Entertainment Japan. It is possible that Sony used [http://www.toshiba-components.com/ASIC/index.html this service] from Toshiba in their design process which is why the prototype demonstrated in the FCC filing shows a Toshiba chip..<br />
<br />
== Variants ==<br />
<br />
There are multiple known variants of Kermit. SoC revision is readable from [[Pervasive#revision0|a ScePervasiveMisc register]].<br />
<br />
The following table is split in two depending on the Kermit version (1.0 or 1.5). <code>X</code> and <code>Y</code> from the <code>ESX.Y</code> column corresponds to the values in the </code>revision0</code> register (<code>0x000000XY</code>).<br />
<br />
{| class="wikitable"<br />
|+ Known Kermit revisions<br />
|-<br />
! Kermit revision !! SoC model number !! Unit model number !! Notes<br />
|-<br />
! colspan="4" | Kermit 1.0<br />
|-<br />
| ES1 || ??? || DEM revision before DEM-3000G || CPU is Cortex-A8, GPU is SGX541MP, ?no CDRAM?. Has two minor revisions: ES1.0 and ES1.1.<br />
|-<br />
| ES2 || ??? || DEM-3000G? to DEM-3000H? || CPU is Cortex-A9, GPU is SGX543MP4+. Has only one minor revision: ES2.0.<br />
|-<br />
| ES3 || ??? || ?DEM-3000JEC, some DEM-3000K/J? || Has three minor revisions: ES3.0, ES3.1 and ES3.2.<br />
|-<br />
| ? || T9ML7MBG-S || CEM-3000VD1 || [https://fccid.io/AK8PCH1001A PCH-1001 FCC certification] and [https://fccid.io/AK8PCH1101A PCH-1101 FCC certification] units use this chip. Most likely ES4, probably ES4.2.<br />
|-<br />
| ES4.0 || ??? || ? || Known to exist from strings in a debugging <code>second_loader.bin</code> dated 2011/05/24, which implies that ES4.1 didn't exist at that point in time.<br />
|-<br />
| ES4.2 || CXD5315GG || PCH-1xxx, ?PTEL-10xx?, VTE-10xx || '''© 2011''' marking - ?512MiB LPDDR2? - No Debug Bus hardware.<br />
|-<br />
| ES4.2 || CXD5315GG-1 || PDEL-10xx || '''© 2011''' marking - ?1.5GiB LPDDR2? - Has additional hardware on Debug Bus.<br />
|-<br />
! colspan="4" | Kermit 1.5<br />
|-<br />
| ES1.5 || CXD5316GG || PCH-10xx with IRS-1001 motherboard, PCH-20xx, ?PTEL-200x? || '''© 2012''' marking - Unit used for [https://fccid.io/AK8PCH2001 PCH-2001 FCC certification] has this chip.<br />
|-<br />
| ES1.5? || CXD5316BGG || PCH-20xx, ?PTEL-200x? || '''© 2014''' marking - Present on late PCH-20xx units.<br />
|}<br />
<br />
=== Errata ===<br />
<br />
{| class="wikitable"<br />
|-<br />
! Erratum code !! Present on !! Fixed on !! Description<br />
|-<br />
| 93 || Kermit ES1 || Kermit ES2 || The SDIO bus must not be set to High Speed due to a silicon bug.<br />
|}<br />
<br />
== Schema ==<br />
<br />
This is for DevKit. Retail and TestKit are different:<br />
* The DevKit carries 1 GiB of LPDDR2 DRAM (usually referred to as the "main memory"). The retail unit and TestKit carry 512 MiB of LPDDR2 DRAM.<br />
<br />
[[File:PSVita custom SoC schema.png]]<br />
<br />
Thanks to information in a debug version of [[SceKernelBusError]], the following bus diagram has been reconstructed:<br />
<br />
[[File:PS Vita Kermit Bus Diagram.png|1000px]]<br />
<br />
== CPU ==<br />
<br />
See [[Main_Processor]].<br />
<br />
== GPU ==<br />
<br />
See [[SGX543]].<br />
<br />
== LPDDR2 DRAM (main memory) ==<br />
<br />
* The retail unit and TestKit carry 512 MiB of LPDDR2 DRAM.<br />
<br />
* The DevKit carries 1 GiB of LPDDR2 DRAM (usually referred to as the "main memory").<br />
<br />
=== Trace Memory ===<br />
<br />
The DevKit mounts 512 MiB of LPDDR2 DRAM for performance analysis.<br />
<br />
This memory is for storing performance measurement data referred by a performance analyzer (Razor for PlayStation®Vita) or runtime libraries.<br />
<br />
== Custom DRAM ==<br />
<br />
The DevKit carries 128 MiB of custom DRAM (usually referred to as the "video memory"). ?Retail/TesKit too?<br />
<br />
== Codec Engine ==<br />
<br />
Codec Engine is a media processor configured with multiple cores. Only the specific processing of the specific libraries is processed through Codec Engine instead of CPU.<br />
<br />
== Other Key Units and Bus Configuration ==<br />
<br />
As other key units, the custom SoC includes the features below:<br />
<br />
* Direct Memory Access Controllers (DMAC)<br />
* AVC Decoder<br />
* A video out interface<br />
* Misc input/outputs interface etc.<br />
<br />
== Pinout ==<br />
<br />
[[File:kermit-bga.png|600px|Source is a [[Media:Kermit_bga.numbers.zip|iWork Numbers file]].]]<br />
<br />
The pinout is mostly reversed from the [http://wololo.net/talk/viewtopic.php?p=402775 PCB delayer] and is based off of PCH-1XXX on the IRS-002 board. It may not include some pins only used in other PS Vita models.<br />
<br />
=== UART ===<br />
<br />
See [[UART Console]] for pinout and [[UART Registers]] for programming.<br />
<br />
{| class='wikitable'<br />
! Name || Pin || Description<br />
|-<br />
| CTS0 || D12 || UART0 clear to send<br />
|-<br />
| RTS0 || B12 || UART0 request to send<br />
|-<br />
| TX0 || B10 || UART0 transmit<br />
|-<br />
| RX0 || B11 || UART0 receive<br />
|-<br />
| CTS5 || E17 || UART5 clear to send<br />
|-<br />
| RTS5 || B17 || UART5 request to send<br />
|-<br />
| TX5 || D17 || UART5 transmit<br />
|-<br />
| RX5 || A17 || UART5 receive<br />
|}<br />
<br />
=== USB ===<br />
<br />
See [[EHCI]].<br />
<br />
{| class='wikitable'<br />
! Name || Pin || Description<br />
|-<br />
| D+ 3G || AD24 || 3G modem USB D+ (host EHCI)<br />
|-<br />
| D- 3G || AD25 || 3G modem USB D (host EHCI)<br />
|-<br />
| D+ Acc || AD27 || Accessory port USB D+ (host EHCI)<br />
|-<br />
| D- Acc || AD28 || Accessory port USB D (host EHCI)<br />
|-<br />
| D+ UDC || AA30 || Multiconnector USB D+ (client, OTG maybe supported)<br />
|-<br />
| D- UDC || AB30 || Multiconnector USB D (client, OTG maybe supported)<br />
|-<br />
| USB VBUS || AA29 || Also goes to SN99057<br />
|}<br />
<br />
=== SDIO ===<br />
<br />
See [[SceSdif]].<br />
<br />
{| class='wikitable'<br />
! Name || Pin || Description<br />
|-<br />
| CLK 0 || AC7 || eMMC clock<br />
|-<br />
| CMD 0 || AB2 || eMMC CMD<br />
|-<br />
| DAT0 0 || AC6 || eMMC DAT0<br />
|-<br />
| DAT1 0 || AD6 || eMMC DAT1<br />
|-<br />
| DAT2 0 || AC5 || eMMC DAT2<br />
|-<br />
| DAT3 0 || AD5 || eMMC DAT3<br />
|-<br />
| DAT4 0 || AC4 || eMMC DAT4<br />
|-<br />
| DAT5 0 || AD4 || eMMC DAT5<br />
|-<br />
| DAT6 0 || AC3 || eMMC DAT6<br />
|-<br />
| DAT7 0 || AD3 || eMMC DAT7<br />
|-<br />
| CLK 1 || AA1 || Gamecard clock<br />
|-<br />
| CMD 1 || V1 || Gamecard CMD<br />
|-<br />
| DAT0 1 || Z1 || Gamecard DAT0<br />
|-<br />
| DAT1 1 || Z2 || Gamecard DAT1<br />
|-<br />
| DAT2 1 || Y1 || Gamecard DAT2<br />
|-<br />
| DAT3 1 || Y2 || Gamecard DAT3<br />
|-<br />
| DAT4 1 || X1 || Gamecard DAT4 (unused)<br />
|-<br />
| DAT5 1 || X2 || Gamecard DAT5 (unused)<br />
|-<br />
| DAT6 1 || W1 || Gamecard DAT6 (unused)<br />
|-<br />
| DAT7 1 || W2 || Gamecard DAT7 (unused)<br />
|-<br />
| CLK 2 || T1 || Wlan/Bt clock<br />
|-<br />
| CMD 2 || Q1 || Wlan/Bt CMD<br />
|-<br />
| DAT0 2 || S1 || Wlan/Bt DAT0<br />
|-<br />
| DAT1 2 || S2 || Wlan/Bt DAT1<br />
|-<br />
| DAT2 2 || R1 || Wlan/Bt DAT2<br />
|-<br />
| DAT3 2 || R2 || Wlan/Bt DAT3<br />
|-<br />
| Vddq || U1 || SDIO voltage regulation<br />
|-<br />
| Vddq || U2 || SDIO voltage regulation<br />
|}<br />
<br />
=== MS ===<br />
<br />
See [[MSIF Registers]].<br />
<br />
{| class='wikitable'<br />
! Name || Pin || Description<br />
|-<br />
| CLK || AD14 || Memorycard CLK<br />
|-<br />
| INS || AD13 || Memorycard insert detect<br />
|-<br />
| BS || AD8 || Memorycard bus state (select bit)<br />
|-<br />
| DAT0 || AC11 || Memorycard DAT0<br />
|-<br />
| DAT1 || AD12 || Memorycard DAT1<br />
|-<br />
| DAT2 || AD11 || Memorycard DAT2<br />
|-<br />
| DAT3 || AC10 || Memorycard DAT3<br />
|}<br />
<br />
=== MIPI DSI ===<br />
<br />
See [[DSI Registers]].<br />
<br />
{| class='wikitable'<br />
! Name || Pin || Description<br />
|-<br />
| DC+ 0 || F1 || Internal display clock lane<br />
|-<br />
| DC- 0 || E1 || Internal display clock lane<br />
|-<br />
| D0+ 0 || D1 || Internal display data 0 lane<br />
|-<br />
| D0- 0 || C1 || Internal display data 0 lane<br />
|-<br />
| D1+ 0 || H1 || Internal display data 1 lane<br />
|-<br />
| D1- 0 || G1 || Internal display data 1 lane<br />
|}<br />
<br />
=== MIPI CSI ===<br />
<br />
{| class='wikitable'<br />
! Name || Pin || Description<br />
|-<br />
| || AD15 || Front/back camera<br />
|-<br />
| || AD16 || Front/back camera<br />
|-<br />
| || AD17 || Front/back camera<br />
|-<br />
| || AD18 || Front/back camera<br />
|-<br />
| || AD19 || Front/back camera<br />
|-<br />
| || AD20 || Front/back camera<br />
|-<br />
| || AD21 || Front/back camera<br />
|-<br />
| || AD22 || Front/back camera<br />
|}<br />
<br />
=== SPI ===<br />
<br />
[[File:vita-syscon-spi.png|thumb|400px|SPI0 (Syscon) trace. Termination resistor under the shield.]]<br />
<br />
See [[SPI Registers]].<br />
<br />
{| class='wikitable'<br />
! Name || Pin || Description<br />
|-<br />
| CS 0 || AA14 || Syscon SPI chip select<br />
|-<br />
| SCK 0 || Z15 || Syscon SPI clock<br />
|-<br />
| MISO 0 || AA15 || Syscon SPI output<br />
|-<br />
| MOSI 0 || Z14 || Syscon SPI input<br />
|-<br />
| CS 1 || AA12 || Motion (accelerometer IC) SPI chip select<br />
|-<br />
| SCK 1 || Z13 || Motion (accelerometer IC) SPI clock<br />
|-<br />
| MISO 1 || AA13 || Motion (accelerometer IC) SPI output<br />
|-<br />
| MOSI 1 || Z12 || Motion (accelerometer IC) SPI input<br />
|-<br />
| CS 2 || AA10 || P1P40167 clock synthesizer SPI chip select<br />
|-<br />
| SCK 2 || Z11 || P1P40167 clock synthesizer SPI clock<br />
|-<br />
| MISO 2 || AA11 || P1P40167 clock synthesizer SPI output<br />
|-<br />
| MOSI 2 || Z10 || P1P40167 clock synthesizer SPI input<br />
|}<br />
<br />
=== GPIO ===<br />
<br />
See [[GPIO Registers]].<br />
<br />
{| class='wikitable'<br />
! Name || Pin || Description<br />
|-<br />
| Syscon || D18 || To syscon<br />
|-<br />
| Syscon || E18 || To syscon<br />
|-<br />
| Syscon || E19 || To syscon<br />
|-<br />
| Syscon || A20 || To syscon<br />
|-<br />
| Motion || E25 || To Motion (accelerometer IC)<br />
|-<br />
| Motion || A26 || To Motion (accelerometer IC)<br />
|-<br />
| Camera || E21 || To camera<br />
|-<br />
| Camera || D21 || To camera<br />
|-<br />
| Camera || B21 || To camera<br />
|-<br />
| PS LED || E20 || To transistor gate powering PS button LED<br />
|-<br />
| GC LED || D20 || To LED next to gamecard port<br />
|-<br />
| PMIC || A22 || To PMIC<br />
|-<br />
| PMIC || A25 || To PMIC<br />
|-<br />
| PMIC || B20 || To PMIC<br />
|-<br />
| OLED || A19 || To OLED connector port<br />
|-<br />
| GPIO_80 || A21 || 3G modem pin 23<br />
|-<br />
| GPIO_H2 || B27 || 3G modem pin 11<br />
|-<br />
| VBUS_CTRL || A27 || 3G modem pin 17<br />
|-<br />
| eMMC RST_N || B26 || RST_N of eMMC<br />
|}<br />
<br />
=== I2C ===<br />
<br />
See [[I2C Registers]].<br />
<br />
{| class='wikitable'<br />
! Name || Pin || Description<br />
|-<br />
| SCL 0 || T4 || I2C0 clock<br />
|-<br />
| SDA 0 || T5 || I2C0 data<br />
|-<br />
| SCL 1 || S4 || I2C1 clock<br />
|-<br />
| SDA 1 || S5 || I2C1 data<br />
|}<br />
<br />
<br />
=== Misc ===<br />
<br />
{| class='wikitable'<br />
! Name || Pin || Description<br />
|-<br />
| pad AC28 || AC26 || Goes to pad with passive, grouped with AC28?<br />
|-<br />
| pad AC26 || AC28 || Goes to pad with passive, grouped with AC26?<br />
|-<br />
| pullup? || AB29 || Goes to a pullup resistor?<br />
|-<br />
| Wlan/Bt || AA9 || Goes to Wlan/Bt SoC<br />
|-<br />
| pad W4 || X4 || Goes to pad, connects with W4<br />
|-<br />
| pad X4 || W4 || Goes to pad, connects with X4<br />
|-<br />
| pullup X27 || W27 || Pullup resistor to X27<br />
|-<br />
| || X29 || Goes near PMIC<br />
|-<br />
| || X30 || Goes near PMIC<br />
|-<br />
| pad M7 || U29 || Connects to M7 with a passive<br />
|-<br />
| rst? || U30 || Goes near PMIC, might be reset<br />
|-<br />
| pad U29 || M7 || Connects to U29 with a passive<br />
|-<br />
| Capacitor || L5 || Goes to a capacitor, voltage regulation?<br />
|-<br />
| Camera || K4 || Goes to camera, camera audio input?<br />
|-<br />
| Audio || K5 || Maybe I2S<br />
|-<br />
| Audio || K7 || Maybe I2S<br />
|-<br />
| Audio || G5 || Maybe I2S<br />
|-<br />
| Audio || B4 || Maybe I2S<br />
|-<br />
| Syscon || B9 || Goes to syscon<br />
|-<br />
| pad D11 || D10 || Connects to D10 through passive<br />
|-<br />
| pad D10 || D11 || Connects to D11 through passive<br />
|-<br />
| pad G30 || G29 || Connects to G30 through passive<br />
|-<br />
| pad G29 || G30 || Connects to G29 through passive<br />
|}<br />
<br />
=== Clocks/Reset ===<br />
<br />
See [[Pervasive]].<br />
<br />
{| class='wikitable'<br />
! Name || Pin || Description<br />
|-<br />
| 24M || B5 || 24.576MHz, suspected audio related<br />
|-<br />
| 24M || B6 || 24.576MHz, suspected audio related<br />
|-<br />
| 27M || A11 || 27MHz, suspected input to main PLL<br />
|-<br />
| 48M || AC27 || 48MHz, SD controller<br />
|-<br />
| 37M || C30 || 37MHz, suspected main clock<br />
|-<br />
| RST_N || B9 || Held for 20ms on startup by Syscon, 100K pulldown<br />
|}<br />
<br />
=== Power ===<br />
<br />
Different power domains are numbered. Some voltages are unknown.<br />
[[File:vita-caps.png|thumb|400px|Decoupling capacitors for some major power domains are shown.]]<br />
<br />
{| class='wikitable'<br />
! Name || Pin || Description<br />
|-<br />
| VDD09 1 || W9 || 0.9V power domain 1<br />
|-<br />
| VDD09 1 || W10 || 0.9V power domain 1<br />
|-<br />
| VDD09 1 || W11 || 0.9V power domain 1<br />
|-<br />
| VDD09 1 || W12 || 0.9V power domain 1<br />
|-<br />
| VDD09 1 || W13 || 0.9V power domain 1<br />
|-<br />
| VDD09 1 || W14 || 0.9V power domain 1<br />
|-<br />
| VDD09 1 || W15 || 0.9V power domain 1<br />
|-<br />
| VDD09 1 || V10 || 0.9V power domain 1<br />
|-<br />
| VDD09 1 || V11 || 0.9V power domain 1<br />
|-<br />
| VDD09 1 || V12 || 0.9V power domain 1<br />
|-<br />
| VDD09 1 || V13 || 0.9V power domain 1<br />
|-<br />
| VDD09 1 || V14 || 0.9V power domain 1<br />
|-<br />
| VDD09 1 || V15 || 0.9V power domain 1<br />
|-<br />
| VDD09 1 || V16 || 0.9V power domain 1<br />
|-<br />
| VDD09 1 || V17 || 0.9V power domain 1<br />
|-<br />
| VDD09 1 || V18 || 0.9V power domain 1<br />
|-<br />
| VDD09 1 || V19 || 0.9V power domain 1<br />
|-<br />
| VDD09 1 || V20 || 0.9V power domain 1<br />
|-<br />
| VDD09 1 || V21 || 0.9V power domain 1<br />
|-<br />
| VDD09 1 || U10 || 0.9V power domain 1<br />
|-<br />
| VDD09 1 || T10 || 0.9V power domain 1<br />
|-<br />
| VDD09 1 || S10 || 0.9V power domain 1<br />
|-<br />
| VDD09 1 || R10 || 0.9V power domain 1<br />
|-<br />
| VDD09 1 || H16 || 0.9V power domain 1<br />
|-<br />
| VDD09 1 || H17 || 0.9V power domain 1<br />
|-<br />
| VDD09 1 || H18 || 0.9V power domain 1<br />
|-<br />
| VDD09 1 || H19 || 0.9V power domain 1<br />
|-<br />
| VDD09 1 || H20 || 0.9V power domain 1<br />
|-<br />
| VDD09 1 || H21 || 0.9V power domain 1<br />
|-<br />
| VDD09 1 || H22 || 0.9V power domain 1<br />
|-<br />
| VDD09 1 || B18 || 0.9V power domain 1<br />
|-<br />
| VDD10 1 || K9 || 1.0V power domain 1<br />
|-<br />
| VDD10 1 || J9 || 1.0V power domain 1<br />
|-<br />
| VDD10 1 || I9 || 1.0V power domain 1<br />
|-<br />
| VDD10 1 || I10 || 1.0V power domain 1<br />
|-<br />
| VDD10 1 || I11 || 1.0V power domain 1<br />
|-<br />
| VDD10 1 || I12 || 1.0V power domain 1<br />
|-<br />
| VDD10 1 || I13 || 1.0V power domain 1<br />
|-<br />
| VDD10 2 || I14 || 1.0V power domain 2<br />
|-<br />
| VDD10 2 || I15 || 1.0V power domain 2<br />
|-<br />
| VDD10 2 || I16 || 1.0V power domain 2<br />
|-<br />
| VDD10 2 || I17 || 1.0V power domain 2<br />
|-<br />
| VDD10 2 || I18 || 1.0V power domain 2<br />
|-<br />
| VDD10 2 || I19 || 1.0V power domain 2<br />
|-<br />
| VDD10 2 || I20 || 1.0V power domain 2<br />
|-<br />
| VDD10 2 || I21 || 1.0V power domain 2<br />
|-<br />
| VDD10 2 || I22 || 1.0V power domain 2<br />
|-<br />
| VDD10 2 || J22 || 1.0V power domain 2<br />
|-<br />
| VDD10 2 || K22 || 1.0V power domain 2<br />
|-<br />
| VDD10 2 || L22 || 1.0V power domain 2<br />
|-<br />
| VDD12 1 || U11 || 1.2V power domain 1 (main core power)<br />
|-<br />
| VDD12 1 || U12 || 1.2V power domain 1 (main core power)<br />
|-<br />
| VDD12 1 || U13 || 1.2V power domain 1 (main core power)<br />
|-<br />
| VDD12 1 || U14 || 1.2V power domain 1 (main core power)<br />
|-<br />
| VDD12 1 || U15 || 1.2V power domain 1 (main core power)<br />
|-<br />
| VDD12 1 || U16 || 1.2V power domain 1 (main core power)<br />
|-<br />
| VDD12 1 || U17 || 1.2V power domain 1 (main core power)<br />
|-<br />
| VDD12 1 || U18 || 1.2V power domain 1 (main core power)<br />
|-<br />
| VDD12 1 || U19 || 1.2V power domain 1 (main core power)<br />
|-<br />
| VDD12 1 || U20 || 1.2V power domain 1 (main core power)<br />
|-<br />
| VDD12 1 || U21 || 1.2V power domain 1 (main core power)<br />
|-<br />
| VDD12 1 || U22 || 1.2V power domain 1 (main core power)<br />
|-<br />
| VDD12 1 || T22 || 1.2V power domain 1 (main core power)<br />
|-<br />
| VDD12 1 || S22 || 1.2V power domain 1 (main core power)<br />
|-<br />
| VDD12 1 || R22 || 1.2V power domain 1 (main core power)<br />
|-<br />
| VDD12 1 || M22 || 1.2V power domain 1 (main core power)<br />
|-<br />
| VDD12 1 || L22 || 1.2V power domain 1 (main core power)<br />
|-<br />
| VDD12 1 || K22 || 1.2V power domain 1 (main core power)<br />
|-<br />
| VDD12 1 || J22 || 1.2V power domain 1 (main core power)<br />
|-<br />
| VDD12 1 || J21 || 1.2V power domain 1 (main core power)<br />
|-<br />
| VDD12 1 || J20 || 1.2V power domain 1 (main core power)<br />
|-<br />
| VDD12 1 || J19 || 1.2V power domain 1 (main core power)<br />
|-<br />
| VDD12 1 || J18 || 1.2V power domain 1 (main core power)<br />
|-<br />
| VDD12 1 || J17 || 1.2V power domain 1 (main core power)<br />
|-<br />
| VDD12 1 || J16 || 1.2V power domain 1 (main core power)<br />
|-<br />
| VDD12 1 || J15 || 1.2V power domain 1 (main core power)<br />
|-<br />
| VDD12 1 || J14 || 1.2V power domain 1 (main core power)<br />
|-<br />
| VDD12 1 || J13 || 1.2V power domain 1 (main core power)<br />
|-<br />
| VDD12 1 || J12 || 1.2V power domain 1 (main core power)<br />
|-<br />
| VDD12 1 || J11 || 1.2V power domain 1 (main core power)<br />
|-<br />
| VDD12 1 || J10 || 1.2V power domain 1 (main core power)<br />
|-<br />
| VDD12 1 || K10 || 1.2V power domain 1 (main core power)<br />
|-<br />
| VDD12 1 || L10 || 1.2V power domain 1 (main core power)<br />
|-<br />
| VDD12 1 || M10 || 1.2V power domain 1 (main core power)<br />
|-<br />
| VDD12 1 || N10 || 1.2V power domain 1 (main core power)<br />
|-<br />
| VDD12 1 || O10 || 1.2V power domain 1 (main core power)<br />
|-<br />
| VDD12 1 || P10 || 1.2V power domain 1 (main core power)<br />
|-<br />
| VDD12 1 || Q10 || 1.2V power domain 1 (main core power)<br />
|-<br />
| VDD12 2 || M9 || 1.2V power domain 2<br />
|-<br />
| VDD12 2 || L9 || 1.2V power domain 2<br />
|-<br />
| VDD12 2 || Q21 || 1.2V power domain 2<br />
|-<br />
| VDD12 2 || P21 || 1.2V power domain 2<br />
|-<br />
| VDD12 2 || O21 || 1.2V power domain 2<br />
|-<br />
| VDD12 2 || N21 || 1.2V power domain 2<br />
|-<br />
| VDD12 3 || W18 || 1.2V power domain 3<br />
|-<br />
| VDD12 3 || W19 || 1.2V power domain 3<br />
|-<br />
| VDD12 3 || W20 || 1.2V power domain 3<br />
|-<br />
| VDD12 3 || W21 || 1.2V power domain 3<br />
|-<br />
| VDD12 3 || W22 || 1.2V power domain 3<br />
|-<br />
| VDD12 3 || Q22 || 1.2V power domain 3<br />
|-<br />
| VDD12 3 || P22 || 1.2V power domain 3<br />
|-<br />
| VDD12 3 || O9 || 1.2V power domain 3<br />
|-<br />
| VDD12 3 || N9 || 1.2V power domain 3<br />
|-<br />
| VDD12 3 || H11 || 1.2V power domain 3<br />
|-<br />
| VDD12 3 || H12 || 1.2V power domain 3<br />
|-<br />
| VDD12 3 || H13 || 1.2V power domain 3<br />
|-<br />
| VDD12 3 || H14 || 1.2V power domain 3<br />
|-<br />
| VDD12 3 || H15 || 1.2V power domain 3<br />
|-<br />
| VDD12 4 || T22 || 1.2V power domain 4<br />
|-<br />
| VDD12 4 || S22 || 1.2V power domain 4<br />
|-<br />
| VDD12 4 || R22 || 1.2V power domain 4<br />
|-<br />
| VDD12 4 || O22 || 1.2V power domain 4<br />
|-<br />
| VDD12 4 || N22 || 1.2V power domain 4<br />
|-<br />
| VDD12 4 || M22 || 1.2V power domain 4<br />
|-<br />
| VDD18 1 || Y26 || 1.8V power domain 1<br />
|-<br />
| VDD18 1 || Y27 || 1.8V power domain 1<br />
|-<br />
| VDD18 1 || N8 || 1.8V power domain 1<br />
|-<br />
| VDD18 1 || M8 || 1.8V power domain 1<br />
|-<br />
| VDD18 1 || L8 || 1.8V power domain 1<br />
|-<br />
| VDD18 1 || K8 || 1.8V power domain 1<br />
|-<br />
| VDD18 1 || O23 || 1.8V power domain 1<br />
|-<br />
| VDD18 1 || N23 || 1.8V power domain 1<br />
|-<br />
| VDD18 1 || H9 || 1.8V power domain 1<br />
|-<br />
| VDD18 1 || H10 || 1.8V power domain 1<br />
|-<br />
| VDD18 1 || G15 || 1.8V power domain 1<br />
|-<br />
| VDD18 1 || G16 || 1.8V power domain 1<br />
|-<br />
| VDD18 1 || G19 || 1.8V power domain 1<br />
|-<br />
| VDD18 1 || G20 || 1.8V power domain 1<br />
|-<br />
| VDD18 1 || G21 || 1.8V power domain 1<br />
|-<br />
| VDD18 1 || G22 || 1.8V power domain 1<br />
|-<br />
| VDD18 1 || W16 || 1.8V power domain 1<br />
|-<br />
| VDD18 1 || W17 || 1.8V power domain 1<br />
|-<br />
| VDD18 1 || V22 || 1.8V power domain 1<br />
|-<br />
| VDD18 1 || U22 || 1.8V power domain 1<br />
|-<br />
| VDD18 2 || AA6 || 1.8V power domain 2<br />
|-<br />
| VDD18 2 || Z6 || 1.8V power domain 2<br />
|-<br />
| VDD18 2 || AA17 || 1.8V power domain 2<br />
|-<br />
| VDD18 2 || Z17 || 1.8V power domain 2<br />
|-<br />
| VDD18 2 || AA18 || 1.8V power domain 2<br />
|-<br />
| VDD18 2 || Z18 || 1.8V power domain 2<br />
|-<br />
| VDD18 2 || V4 || 1.8V power domain 2<br />
|-<br />
| VDD18 2 || V5 || 1.8V power domain 2<br />
|-<br />
| VDD18 2 || P7 || 1.8V power domain 2<br />
|-<br />
| VDD18 2 || O7 || 1.8V power domain 2<br />
|-<br />
| VDD18 2 || J23 || 1.8V power domain 2<br />
|-<br />
| VDD18 2 || I23 || 1.8V power domain 2<br />
|-<br />
| VDD18 2 || H8 || 1.8V power domain 2<br />
|-<br />
| VDD18 2 || G8 || 1.8V power domain 2<br />
|-<br />
| VDD18 2 || E8 || 1.8V power domain 2<br />
|-<br />
| VDD18 2 || D8 || 1.8V power domain 2<br />
|-<br />
| VDD? 1 || AA26 || Unknown power<br />
|-<br />
| VDD? 1 || Z26 || Unknown power<br />
|-<br />
| VDD? 2 || AA25 || Unknown power<br />
|-<br />
| VDD? 2 || Z25 || Unknown power<br />
|-<br />
| VDD? 3 || AA20 || Unknown power<br />
|-<br />
| VDD? 3 || Z20 || Unknown power<br />
|-<br />
| VDD? 4 || AA8 || Unknown power<br />
|-<br />
| VDD? 4 || Z8 || Unknown power<br />
|-<br />
| VDD? 4 || Y4 || Unknown power<br />
|-<br />
| VDD? 4 || Y5 || Unknown power<br />
|-<br />
| VDD? 4 || X27 || Unknown power<br />
|-<br />
| VDD? 5 || E6 || Unknown power<br />
|-<br />
| VDD? 5 || D6 || Unknown power<br />
|-<br />
| VDD? 6 || H7 || Unknown power<br />
|-<br />
| VDD? 6 || G7 || Unknown power<br />
|-<br />
| VDD? 7 || P24 || Unknown power<br />
|-<br />
| VDD? 7 || O24 || Unknown power<br />
|-<br />
| VDD? 8 || T24 || Unknown power<br />
|-<br />
| VDD? 8 || S24 || Unknown power<br />
|-<br />
| VDD? 9 || E26 || Unknown power<br />
|-<br />
| VDD? 9 || E27 || Unknown power<br />
|-<br />
| VDD? 9 || D29 || Unknown power<br />
|-<br />
| VDD? 9 || D30 || Unknown power<br />
|-<br />
| VDD? 9 || C29 || Unknown power<br />
|-<br />
| VDD? 9 || B30 || Unknown power<br />
|-<br />
| VDD? 10 || F26 || Unknown power<br />
|-<br />
| VDD? 10 || F27 || Unknown power<br />
|}<br />
<br />
<br />
[[Category:Devices]]</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=Pervasive&diff=20888
Pervasive
2024-01-03T19:13:47Z
<p>CreepNT: Edit section to reflect new discoveries</p>
<hr />
<div>Pervasive is a device that controls the clocks of most of the devices of the system.<br />
<br />
== ScePervasiveMisc (0xE3100000) ==<br />
<br />
Devices can be fully disabled? by writing a 1 to the corresponding bit of the ScePervasiveMisc (PA <code>0xE3100000</code>) register. To disable the device <code>dev_off</code>, do <code>*REG32(0xE3100000 + (dev_off / 32) * 4) = 1 << (31 - (dev_off % 32))</code>.<br />
<br />
{| class="wikitable"<br />
|-<br />
! Offset<br />
! Description<br />
|-<br />
| 0x0000<br />
| [[Pervasive#revision0|revision0]]. ex:0x80000115<br />
|-<br />
| 0x0004<br />
| Unknown - SKBL prints <code>L2 Cache is defective</code> if bit 0x2 is set<br />
|-<br />
| 0x0124<br />
| SDIF voltage control? - 3.3V by default; <code>1 << sdif_idx</code> to set the SDIF to 1.8V<br />
|-<br />
| 0x0130<br />
| <code>PERVASIVE_SYS_SBEATB</code> - Pervasive Secure Bus Error Attribute<br />
|-<br />
| 0x0134<br />
| <code>PERVASIVE_SYS_SBEADR</code> - Pervasive Secure Bus Error Address<br />
|-<br />
| 0x0138<br />
| <code>PERVASIVE_SYS_BEATB</code> - Pervasive Bus Error Attribute<br />
|-<br />
| 0x013C<br />
| <code>PERVASIVE_SYS_BEADR</code> - Pervasive Bus Error Address<br />
|-<br />
| 0x0194<br />
| gc<br />
|-<br />
| 0x0300<br />
| Unknown<br />
|-<br />
| 0x0304<br />
| Unknown<br />
|-<br />
| 0x0308<br />
| Unknown<br />
|}<br />
<br />
=== revision0 ===<br />
Returned by [[SceLowio#scePervasiveGetSoCRevisionForDriver]], read by [[SKBL]]/[[NSKBL]]/...<br />
<br />
Contains the [[Kermit]] revision (see [[SceSysmem#sceKernelSysrootGetKermitRevisionForKernel|sceKernelSysrootGetKermitRevisionForKernel]]) and other information.<br />
<br />
{| class="wikitable"<br />
|-<br />
! Bit mask !! Information<br />
|-<br />
| <code>0x80000000</code> || Disable LPDDR2SUB<br />
|-<br />
| <code>0x30000000</code> || Unknown (used by [[SceCrashDump]])<br />
|-<br />
| <code>0x4FFE0000</code> || Unknown<br />
|-<br />
| <code>0x0001FFFF</code> || Kermit revision<br />
|-<br />
| <code>0x000000FF</code> || Kermit revision (old firmwares)<br />
|}<br />
{| class="wikitable"<br />
|+ Known values<br />
|-<br />
! Hardware !! Value<br />
|-<br />
| CXD5315GG (PCH-1000, VTE-1016) || <code>0x80000042</code><br />
|-<br />
| CXD5316GG (late PCH-1000, early PCH-2000) || <code>0x80000115</code><br />
|-<br />
| CXD5316BGG (late PCH-2000) || <code>0x94000115</code><br />
|-<br />
| CXD5315GG-1 (PDEL-1000) || <code>0x00000042</code><br />
|}<br />
<br />
== ScePervasiveReset (0xE3101000) ==<br />
<br />
Devices must be put out of reset (device reset disabled) before they are first used.<br />
<br />
To enable reset of a device (put a device in reset), do <code>*REG32(0xE3101000 + dev_off) |= mask</code>.<br />
<br />
To disable reset of a device (put a device out of reset), do <code>*REG32(0xE3101000 + dev_off) &= ~mask</code>.<br />
<br />
{| class="wikitable"<br />
|-<br />
! dev_off<br />
! Access<br />
! Device<br />
! Reset Mask<br />
! Comment<br />
|-<br />
| 0x4<br />
| Secure?<br />
| ARM Debugger?<br />
| 1<br />
| Of ARM coprocessor 14?<br />
|-<br />
| 0x10<br />
| Non-secure<br />
| GPU<br />
| 1<br />
| enable: ScePervasiveForDriver_3E79D3D3/disable: ScePervasiveForDriver_8A85E36B<br />
|-<br />
| 0x20<br />
| Secure<br />
| ?<br />
| 1<br />
| enable: ScePervasiveForDriver_377126CD/disable: ScePervasiveForDriver_6E11EB97<br />
|-<br />
| 0x24<br />
| Secure<br />
| ?<br />
| 1<br />
| enable: ScePervasiveForDriver_7B0F388B/disable: ScePervasiveForDriver_4CCD40E6<br />
|-<br />
| 0x28<br />
| Secure<br />
| CompatRAM<br />
| 1<br />
| enable: ScePervasiveForDriver_7C285361/disable: ScePervasiveForDriver_E40BED0F<br />
|-<br />
| 0x30<br />
| Non-secure<br />
| Venezia<br />
| 1<br />
| enable: ScePervasiveForDriver_28731EC5/disable: ScePervasiveForDriver_A7E64C6F<br />
|-<br />
| 0x34<br />
| Non-secure<br />
| Vip<br />
| 1<br />
| enable: ScePervasiveForDriver_31C0A98B/disable: ScePervasiveForDriver_E2D8F6C3<br />
|-<br />
| 0x40<br />
| Secure<br />
| [[SceDbgSdio|SDIO0]]<br />
| 1<br />
|<br />
|-<br />
| 0x44<br />
| Secure<br />
| [[SceDbgSdio|SDIO1]]<br />
| 1<br />
|<br />
|-<br />
| 0x48<br />
| Secure<br />
| DebugPA<br />
| 1<br />
|<br />
|-<br />
| 0x4C<br />
| Secure<br />
| [[SceDbgSdio]]<br />
| 1<br />
|<br />
|-<br />
| 0x50<br />
| Secure<br />
| DMAC0<br />
| 1<br />
|<br />
|-<br />
| 0x54<br />
| Secure<br />
| DMAC1<br />
| 1<br />
|<br />
|-<br />
| 0x58<br />
| Secure<br />
| DMAC2<br />
| 1<br />
|<br />
|-<br />
| 0x5C<br />
| Secure<br />
| DMAC3<br />
| 1<br />
|<br />
|-<br />
| 0x60<br />
| Secure<br />
| DMAC4<br />
| 1<br />
|<br />
|-<br />
| 0x64<br />
| Secure<br />
| DMAC5<br />
| 1<br />
|<br />
|-<br />
| 0x68<br />
| Secure<br />
| DMAC6<br />
| 1<br />
| need devmode or dipsw 0xC0 or 0xC1 or 0xC2.<br />
|-<br />
| 0x70<br />
| rowspan="2" | Non-secure<br />
| rowspan="2" | Csi<br />
| rowspan="2" | 1<br />
| rowspan="2" | Camera Serial Interface<br />
|-<br />
| 0x74<br />
|-<br />
| 0x80<br />
| rowspan="2" | Non-secure<br />
| rowspan="2" | Dsi<br />
| rowspan="2" | 1<br />
|<br />
|-<br />
| 0x84<br />
|<br />
|-<br />
| 0x88<br />
| Non-secure<br />
| Iftu<br />
| 1<br />
| Integrated Facility Terminating Unit. See [[IFTU Registers]]. enable: ScePervasiveForDriver_B68254AD/disable: ScePervasiveForDriver_E92E28FF<br />
|-<br />
| 0x8C<br />
| Non-secure<br />
| ?<br />
| 1<br />
| enable: ScePervasiveForDriver_7AE2F8E8/disable: ScePervasiveForDriver_17109C28<br />
|-<br />
| 0x90<br />
| rowspan="3" | Non-secure<br />
| USB0/UDC0<br />
| rowspan="3" | 0xB<br />
| rowspan="3" | See [[UDC]]. enable: ScePervasiveForDriver_4AF7A01E/disable: ScePervasiveForDriver_13CC07C9 <br> <br> 0x1 - USB Host Controller <br> 0x2 - USB Device Controller <br> 0x8 - ????<br />
|-<br />
| 0x94<br />
| USB1/UDC1<br />
|-<br />
| 0x98<br />
| USB2/UDC2<br />
|-<br />
| 0xA0<br />
| rowspan="4" | Non-secure<br />
| Sdif0 (emmc)<br />
| rowspan="4" | 1<br />
| rowspan="4" | Storage Device InterFace<br />
|-<br />
| 0xA4<br />
| Sdif1 (gcsd)<br />
|-<br />
| 0xA8<br />
| Sdif2<br />
|-<br />
| 0xAC<br />
| Sdif3<br />
|-<br />
| 0xB0<br />
| Non-secure<br />
| Msif<br />
| 1<br />
| Memory Stick InterFace. See [[MSIF Registers]].<br />
|-<br />
| 0xC0<br />
| rowspan="8" | Non-secure<br />
| rowspan="8" | I2S (Audio)<br />
| rowspan="8" | 1<br />
| rowspan="8" | Inter-IC Sound<br />
|-<br />
| 0xC4<br />
|-<br />
| 0xC8<br />
|-<br />
| 0xCC<br />
|-<br />
| 0xD0<br />
|-<br />
| 0xD4<br />
|-<br />
| 0xD8<br />
|-<br />
| 0xDC<br />
|-<br />
| 0xE0<br />
| rowspan="3" | Non-secure<br />
| rowspan="3" | SrcMix<br />
| rowspan="3" | 1<br />
| rowspan="3" | Source Mixer<br />
|-<br />
| 0xE4<br />
|-<br />
| 0xE8<br />
|-<br />
| 0xF0<br />
| Non-secure<br />
| SPDIF (Audio)<br />
| 1<br />
| Sony/Philips Digital InterFace<br />
|-<br />
| 0x100<br />
| Non-secure<br />
| Gpio<br />
| 1<br />
| General Purpose Input/Output. See [[GPIO Registers]].<br />
|-<br />
| 0x104<br />
| rowspan="3" | Non-secure<br />
| Spi (Syscon)<br />
| rowspan="3" | 1<br />
| rowspan="3" | Serial Peripheral Interface. See [[SPI Registers]].<br />
|-<br />
| 0x108<br />
| Spi (Motion)<br />
|-<br />
| 0x10C<br />
| Spi (OLED)<br />
|-<br />
| 0x110<br />
| rowspan="2" | Non-secure<br />
| rowspan="2" | I2C<br />
| rowspan="2" | 1<br />
| rowspan="2" | Inter-Integrated Circuit. See [[I2C Registers]].<br />
|-<br />
| 0x114<br />
|-<br />
| 0x120<br />
| rowspan="7" | Non-secure<br />
| Uart0 (Console)<br />
| rowspan="7" | 1<br />
| rowspan="7" | Universal Asynchronous Receiver Transmitter. See [[UART Registers]].<br />
|-<br />
| 0x124<br />
| Uart1<br />
|-<br />
| 0x128<br />
| Uart2<br />
|-<br />
| 0x12C<br />
| Uart3<br />
|-<br />
| 0x130<br />
| Uart4<br />
|-<br />
| 0x134<br />
| Uart5 (3G Modem)<br />
|-<br />
| 0x138<br />
| Uart6<br />
|-<br />
| 0x154<br />
| Secure?<br />
| Debug Bus<br />
| 1<br />
| Taken out of reset by SKBL if Development mode or DIPsw 0xC0/0xC1/0xC2 is set<br />
|-<br />
| 0x158<br />
| Secure?<br />
| ?<br />
| 1<br />
|<br />
|-<br />
| 0x160<br />
| Secure?<br />
| LPDDR2MAIN (DDRIF0)<br />
| 1<br />
|<br />
|-<br />
| 0x164<br />
| Secure?<br />
| LPDDR2SUB (DDRIF1)<br />
| 1<br />
|<br />
|-<br />
| 0x170<br />
| ?<br />
| Timer<br />
| 1?<br />
|<br />
|-<br />
| rowspan="2" | 0x178<br />
| rowspan="2" | Secure?<br />
| SPM32<br />
| 4<br />
| Scratch Pad Memory 32KiB<br />
|-<br />
| SPM128<br />
| 8<br />
| Scratch Pad Memory 128KiB<br />
|<br />
|-<br />
| 0x17C<br />
| Secure?<br />
| Venezia?<br />
| 1?<br />
| Must be != 0 for [[SceKernelBusError]] to dump Venezia registers.<br />
|-<br />
| 0x180<br />
| Secure<br />
| VIP?<br />
| 1<br />
| Must be != 0 for [[SceKernelBusError]] to dump VIP registers. enable: ScePervasiveForDriver_EBE9C84E/disable: ScePervasiveForDriver_8CF567AD<br />
|-<br />
| 0x190<br />
| Secure<br />
| bigmac or emmc cryptor<br />
| ?<br />
| x<br />
|}<br />
<br />
== ScePervasiveGate (0xE3102000) ==<br />
<br />
Devices can be clock gated to preserve battery.<br />
<br />
To enable clock gate (request the clock of a device to be enabled), do <code>*REG32(0xE3102000 + dev_off) |= mask</code>.<br />
<br />
To disable clock gate (request the clock of a device to be disabled), do <code>*REG32(0xE3102000 + dev_off) &= ~mask</code>.<br />
<br />
{| class="wikitable"<br />
|-<br />
! dev_off<br />
! Access<br />
! Device<br />
! Gate Mask<br />
! Comment<br />
|-<br />
| 0x0<br />
| Secure?<br />
| ?<br />
| ?<br />
|<br />
|-<br />
| 0x4<br />
| Secure?<br />
| ARM Debugger?<br />
| 1<br />
| Of ARM coprocessor 14?<br />
|-<br />
| 0x10<br />
| Non-secure<br />
| GPU<br />
| v & 0xF000F<br />
| enable: ScePervasiveForDriver_39E51AE2/disable: ScePervasiveForDriver_CA0ACFC5<br />
|-<br />
| 0x20<br />
| Secure<br />
| ?<br />
| 1<br />
| enable: ScePervasiveForDriver_8EE3AEDF/disable: ScePervasiveForDriver_3BF2A9B5<br />
|-<br />
| 0x24<br />
| Secure<br />
| ?<br />
| 1<br />
| enable: ScePervasiveForDriver_7F4AB4AA/disable: ScePervasiveForDriver_0EBBE8DE<br />
|-<br />
| 0x28<br />
| Secure<br />
| CompatRAM (2MiB)<br />
| 1<br />
| enable: ScePervasiveForDriver_B2EE45C9/disable: ScePervasiveForDriver_39979C55<br />
|-<br />
| 0x30<br />
| Non-secure<br />
| Venezia<br />
| 1 (2 for secure)<br />
| enable: ScePervasiveForDriver_FB01A2DD/disable: ScePervasiveForDriver_2EEBE9AE<br />
|-<br />
| 0x34<br />
| Non-secure<br />
| Vip<br />
| 1<br />
| enable: ScePervasiveForDriver_B1CFA18F/disable: ScePervasiveForDriver_03E1FAA6<br />
|-<br />
| 0x40<br />
| Secure<br />
| [[SceDbgSdio]]<br />
| 1<br />
|<br />
|-<br />
| 0x44<br />
| Secure<br />
| [[SceDbgSdio]]<br />
| 1<br />
|<br />
|-<br />
| 0x48<br />
| Secure<br />
| DebugPA<br />
| 1 (also has 2?)<br />
|<br />
|-<br />
| 0x4C<br />
| Secure<br />
| [[SceDbgSdio]]<br />
| 1<br />
|<br />
|-<br />
| 0x50<br />
| Secure<br />
| DMAC0<br />
| 1<br />
|<br />
|-<br />
| 0x54<br />
| Secure<br />
| DMAC1<br />
| 1<br />
|<br />
|-<br />
| 0x58<br />
| Secure<br />
| DMAC2<br />
| 1<br />
|<br />
|-<br />
| 0x5C<br />
| Secure<br />
| DMAC3<br />
| 1<br />
|<br />
|-<br />
| 0x60<br />
| Secure<br />
| DMAC4<br />
| 1<br />
|<br />
|-<br />
| 0x64<br />
| Secure<br />
| DMAC5<br />
| 1<br />
|<br />
|-<br />
| 0x68<br />
| Secure<br />
| DMAC6<br />
| 1<br />
| need devmode or dipsw 0xC0 or 0xC1 or 0xC2.<br />
|-<br />
| 0x70<br />
| rowspan="2" | Non-secure<br />
| rowspan="2" | Csi<br />
| rowspan="2" | 1<br />
| rowspan="2" | Camera Serial Interface<br />
|-<br />
| 0x74<br />
|-<br />
| 0x80<br />
| rowspan="2" | Non-secure<br />
| rowspan="2" | Dsi<br />
| rowspan="2" | 1<br />
|<br />
|-<br />
| 0x84<br />
|<br />
|-<br />
| 0x88<br />
| Non-secure<br />
| Iftu<br />
| 1<br />
| Integrated Facility Terminating Unit. See [[IFTU Registers]]. enable: ScePervasiveForDriver_07F2A738/disable: ScePervasiveForDriver_5AFE0AF0<br />
|-<br />
| 0x8C<br />
| Non-secure<br />
| ?<br />
| 1<br />
| enable: ScePervasiveForDriver_C0C842FE/disable: ScePervasiveForDriver_9BB7B932<br />
|-<br />
| 0x90<br />
| rowspan="3" | Non-secure<br />
| USB0/UDC0<br />
| rowspan="3" | 0xB<br />
| rowspan="3" | See [[UDC]]. enable: ScePervasiveForDriver_A2EFD7AF/disable: ScePervasiveForDriver_AD1E81EB <br> <br> 0x1 - USB Host Controller <br> 0x2 - USB Device Controller <br> 0x8 - ????<br />
|-<br />
| 0x94<br />
| USB1/UDC1<br />
|-<br />
| 0x98<br />
| USB2/UDC2<br />
|-<br />
| 0xA0<br />
| rowspan="4" | Non-secure<br />
| Sdif0 (emmc)<br />
| rowspan="4" | 1<br />
| rowspan="4" | Storage Device InterFace<br />
|-<br />
| 0xA4<br />
| Sdif1 (gcsd)<br />
|-<br />
| 0xA8<br />
| Sdif2<br />
|-<br />
| 0xAC<br />
| Sdif3<br />
|-<br />
| 0xB0<br />
| Non-secure<br />
| Msif<br />
| 1<br />
| Memory Stick InterFace. See [[MSIF Registers]].<br />
|-<br />
| 0xC0<br />
| rowspan="8" | Non-secure<br />
| rowspan="8" | I2S (Audio)<br />
| rowspan="8" | 1<br />
| rowspan="8" | Inter-IC Sound<br />
|-<br />
| 0xC4<br />
|-<br />
| 0xC8<br />
|-<br />
| 0xCC<br />
|-<br />
| 0xD0<br />
|-<br />
| 0xD4<br />
|-<br />
| 0xD8<br />
|-<br />
| 0xDC<br />
|-<br />
| 0xE0<br />
| rowspan="3" | Non-secure<br />
| rowspan="3" | SrcMix<br />
| rowspan="3" | 1<br />
| rowspan="3" | Source Mixer<br />
|-<br />
| 0xE4<br />
|-<br />
| 0xE8<br />
|-<br />
| 0xF0<br />
| Non-secure<br />
| SPDIF (Audio)<br />
| 1<br />
| Sony/Philips Digital InterFace<br />
|-<br />
| 0x100<br />
| Non-secure<br />
| Gpio<br />
| 1<br />
| General Purpose Input/Output. See [[GPIO Registers]].<br />
|-<br />
| 0x104<br />
| rowspan="3" | Non-secure<br />
| Spi (Syscon)<br />
| rowspan="3" | 1<br />
| rowspan="3" | Serial Peripheral Interface. See [[SPI Registers]].<br />
|-<br />
| 0x108<br />
| Spi (Motion)<br />
|-<br />
| 0x10C<br />
| Spi (OLED)<br />
|-<br />
| 0x110<br />
| rowspan="2" | Non-secure<br />
| rowspan="2" | I2C<br />
| rowspan="2" | 1<br />
| rowspan="2" | Inter-Integrated Circuit. See [[I2C Registers]].<br />
|-<br />
| 0x114<br />
|-<br />
| 0x120<br />
| rowspan="7" | Non-secure<br />
| Uart0 (Console)<br />
| rowspan="7" | 1<br />
| rowspan="7" | Universal Asynchronous Receiver Transmitter. See [[UART Registers]].<br />
|-<br />
| 0x124<br />
| Uart1<br />
|-<br />
| 0x128<br />
| Uart2<br />
|-<br />
| 0x12C<br />
| Uart3<br />
|-<br />
| 0x130<br />
| Uart4<br />
|-<br />
| 0x134<br />
| Uart5 (3G Modem)<br />
|-<br />
| 0x138<br />
| Uart6<br />
|-<br />
| 0x154<br />
| Secure?<br />
| Debug Bus<br />
| 1<br />
| See [[#ScePervasiveReset_.280xE3101000.29|ScePervasiveReset]] for details.<br />
|-<br />
| 0x158<br />
| Secure?<br />
| ?<br />
| 1<br />
|<br />
|-<br />
| 0x160<br />
| Secure?<br />
| LPDDR2MAIN (DDRIF0)<br />
| 1<br />
|<br />
|-<br />
| 0x164<br />
| Secure?<br />
| LPDDR2SUB (DDRIF1)<br />
| 1<br />
|<br />
|-<br />
| 0x170<br />
| ?<br />
| Timer<br />
| 1?<br />
|<br />
|-<br />
| rowspan="2" | 0x178<br />
| rowspan="2" | Secure?<br />
| SPM32<br />
| 4<br />
| Scratch Pad Memory 32KiB<br />
|-<br />
| SPM128<br />
| 8<br />
| Scratch Pad Memory 128KiB<br />
|}<br />
<br />
== ScePervasiveVid (0xE3104000) ==<br />
<br />
Voltage integer data<br />
<br />
{| class="wikitable"<br />
|-<br />
! Offset<br />
! Group<br />
! Value<br />
|-<br />
| 0x0<br />
| ARM<br />
| 0<br />
|-<br />
| 0x4<br />
| ARM<br />
| 0x1F<br />
|-<br />
| 0x8<br />
| ARM<br />
| 0x27<br />
|-<br />
| 0xC<br />
| ARM<br />
| 0x2F<br />
|-<br />
| 0x10<br />
| ARM<br />
| 0x31<br />
|-<br />
| 0x14<br />
| ARM<br />
| 0x31<br />
|-<br />
| 0x40<br />
| ?<br />
| 0x1D<br />
|-<br />
| 0x44<br />
| ?<br />
| 0x22<br />
|-<br />
| 0x48<br />
| ?<br />
| 0x2E<br />
|-<br />
| 0x4C<br />
| ?<br />
| 0x25<br />
|-<br />
| 0x60<br />
| ?<br />
| 0x1D<br />
|-<br />
| 0x64<br />
| ?<br />
| 0x27<br />
|-<br />
| 0x68<br />
| ?<br />
| 0x2E<br />
|-<br />
| 0x6C<br />
| ?<br />
| 0x30<br />
|-<br />
| 0xA0<br />
| Bus<br />
| 0<br />
|-<br />
| 0xA4<br />
| Bus<br />
| 0x1E<br />
|-<br />
| 0xA8<br />
| Bus<br />
| 0x27<br />
|-<br />
| 0xAC<br />
| Bus<br />
| 0x2E<br />
|}<br />
<br />
== Base Clock ==<br />
<br />
Registers at physical address <code>0xE2103000</code> (ScePervasiveBaseClk).<br />
<br />
{| class="wikitable"<br />
|-<br />
! Offset !! Accessibly !! Description<br />
|-<br />
| 0x0/0x4 || Non-Secure/Secure || [[Pervasive#ARM Clocks|ARM Clocks]]<br />
|-<br />
| 0x10 || Non-Secure/Secure || GPU Clock<br />
|-<br />
| 0x20 || Non-Secure/Secure (?) || [[Pervasive#VENEZIA Clock|VENEZIA Clock]]<br />
|-<br />
| 0x30 || Non-Secure || [[Pervasive#Vip Clock|Vip Clock]]<br />
|-<br />
| 0x40 || Secure || [[Pervasive#CMeP Clock|CMeP Clock]]<br />
|-<br />
| 0x44 || Non-Secure || [[Pervasive#CameraBus Clock|CameraBus Clock]]<br />
|-<br />
| 0x50 || Secure || Could be Center Xbar/Bus clock<br />
|-<br />
| 0x60 || Non-Secure || Related to offset 0x60/0x64/0xA4.<br />
|-<br />
| 0x64 || Non-Secure || Related to offset 0x60/0x64/0xA4.<br />
|-<br />
| 0x68 || Non-Secure || Unknown. freq setting by ScePervasiveForDriver_A96642E3<br />
|-<br />
| 0x70 || Non-Secure || Related to Audio. freq setting by ScePervasiveForDriver_925D9D24<br />
|-<br />
| 0x90 || Secure || [[Pervasive#DRAM Main Clock|DRAM Main Clock]]<br />
|-<br />
| 0x94 || Secure || [[Pervasive#DRAM Sub Clock|DRAM Sub Clock]]<br />
|-<br />
| 0xA4 || Non-Secure || Related to offset 0x60/0x64/0xA4.<br />
|-<br />
| 0xB0 || Non-Secure || [[Pervasive#Msif Clock|Msif Clock]]<br />
|-<br />
| 0xC4 || Secure || [[Pervasive#Compat/GpuXbar Clock|Compat/GpuXbar Clock (PSP stuff)]]<br />
|-<br />
| 0x1D0 || Non-Secure || HDMI Clock<br />
|-<br />
| 0x1F0 || Non-Secure || [[Pervasive#Dmac5 Clock|Dmac5 Clock]]<br />
|-<br />
| 0x210 || Non-Secure || Related to Audio. freq setting by ScePervasiveForDriver_2FB5F88F<br />
|-<br />
| 0x214 || Non-Secure || [[Pervasive#Sys Clock|Sys Clock]]<br />
|}<br />
<br />
=== ARM Clocks ===<br />
<br />
The ARM core clock and L2 cache clock consist of two registers 0xE2103000 and 0xE2103004.<br />
<br />
Register 0xE2103000 selects the base clock frequency.<br />
<br />
It seems that 42-freq is selected internally when Undefined index is selected<br />
<br />
{| class="wikitable sortable mw-collapsible"<br />
|+ 0xE2103000 ARM clock list<br />
|-<br />
! Index !! ARM core freq !! L2 cache freq<br />
|-<br />
| 0 || Undefined || Undefined<br />
|-<br />
| 1 || 42 || 42<br />
|-<br />
| 2 || Undefined || Undefined<br />
|-<br />
| 3 || 83 || 83<br />
|-<br />
| 4 || 111 || 111<br />
|-<br />
| 5 || 166 || 166<br />
|-<br />
| 6 || 222 || 222<br />
|-<br />
| 7 || 333 || 333<br />
|-<br />
| 8 || 444 || 222<br />
|-<br />
| 9 || 500 || 250<br />
|-<br />
| 10 || 333 || 166<br />
|-<br />
| 11 || Undefined || Undefined<br />
|-<br />
| 12 || 125 || 125<br />
|-<br />
| 13 || 250 || 250<br />
|-<br />
| 14 || 444 || 444<br />
|-<br />
| 15 || 500 || 500<br />
|}<br />
<br />
Register 0xE2103004 adjusts the selected base clock frequency.<br />
<br />
0xE2103004 sets the index that adjusts the base clock frequency.<br />
<br />
It seems that the adjustment can be expressed by the following formula.<br />
<br />
<code>f(n) = n(1 - adjust_index / 16)</code><br />
<br />
adjust_index ranges from 0 to 8. Selecting 9 or higher selects 0 internally.<br />
<br />
Also a joke-like approximation : <code>f(n) = n(1 - aπ^-(1 + √2))</code>.<br />
<br />
However, not sure if this formula is completely correct, but It can see that it is very close to the value of yifan's clock analyzer.<br />
<br />
{| class="wikitable sortable mw-collapsible mw-collapsed"<br />
|+ ARM core measured adjust freq<br />
|-<br />
! base !! 0 !! 1 !! 2 !! 3 !! 4 !! 5 !! 6 !! 7 !! 8<br />
|-<br />
| 1 || 41.666 MHz || 39.62 MHz || 36.458 MHz || 33.854 MHz || 31.249 MHz || 28.645 MHz || 26.41 MHz || 23.437 MHz || 20.833 MHz<br />
|-<br />
| 3 || 83.333 MHz || 78.124 MHz || 72.916 MHz || 67.708 MHz || 62.499 MHz || 57.291 MHz || 52.83 MHz || 46.874 MHz || 41.666 MHz<br />
|-<br />
| 4 || 111.111 MHz || 104.166 MHz || 97.222 MHz || 90.277 MHz || 83.333 MHz || 76.388 MHz || 69.444 MHz || 62.499 MHz || 55.555 MHz<br />
|-<br />
| 5 || 166.666 MHz || 156.249 MHz || 145.833 MHz || 135.416 MHz || 124.999 MHz || 114.583 MHz || 104.166 MHz || 93.749 MHz || 83.333 MHz<br />
|-<br />
| 6 || 222.222 MHz || 208.333 MHz || 194.444 MHz || 180.555 MHz || 166.666 MHz || 152.777 MHz || 138.888 MHz || 124.999 MHz || 111.111 MHz<br />
|-<br />
| 7 || 333.333 MHz || 312.499 MHz || 291.666 MHz || 270.833 MHz || 249.999 MHz || 229.166 MHz || 208.333 MHz || 187.499 MHz || 166.666 MHz<br />
|-<br />
| 8 || 444.444 MHz || 416.666 MHz || 388.888 MHz || 361.111 MHz || 333.333 MHz || 305.555 MHz || 277.777 MHz || 249.999 MHz || 222.222 MHz<br />
|-<br />
| 9 || 500.0 MHz || 468.749 MHz || 437.499 MHz || 406.249 MHz || 374.999 MHz || 343.749 MHz || 312.499 MHz || 281.249 MHz || 249.999 MHz<br />
|-<br />
| 10 || 333.333 MHz || 312.499 MHz || 291.666 MHz || 270.833 MHz || 249.999 MHz || 229.166 MHz || 208.333 MHz || 187.499 MHz || 166.666 MHz<br />
|-<br />
| 12 || 124.999 MHz || 117.187 MHz || 109.374 MHz || 101.562 MHz || 93.749 MHz || 85.937 MHz || 78.124 MHz || 70.312 MHz || 62.499 MHz<br />
|-<br />
| 13 || 249.999 MHz || 234.374 MHz || 218.749 MHz || 203.124 MHz || 187.499 MHz || 171.874 MHz || 156.249 MHz || 140.624 MHz || 124.999 MHz<br />
|-<br />
| 14 || 444.444 MHz || 416.666 MHz || 388.888 MHz || 361.111 MHz || 333.333 MHz || 305.555 MHz || 277.777 MHz || 249.999 MHz || 222.222 MHz<br />
|-<br />
| 15 || 500.0 MHz || 468.749 MHz || 437.499 MHz || 406.249 MHz || 374.999 MHz || 343.749 MHz || 312.499 MHz || 281.249 MHz || 249.999 MHz<br />
|}<br />
<br />
=== ARM Clocks (by yifan's clock analyzer) ===<br />
<br />
<!--<br />
TODO : Remove this? or update to better document?<br />
--><br />
<br />
The ARM CPU clocks are controlled by two registers at physical address <code>0xE3103000</code> (ScePervasiveBaseClk). Currently, it is unknown how the values are interpreted. However, <code>0xE3103000</code> (one word) takes values 0 to 16, and increases clock speed while <code>0xE3103004</code> (single byte) takes values 0 to 8 and decreases clock speed. It is likely related to a PLL multiply and divide function. The input clock signal comes from a [http://www.onsemi.com/PowerSolutions/product.do?id=P1P40167 P1P40167] clock synthesizer (found on the bottom of the board under the main SoC). It takes a 27MHz crystal and generates a 37MHz clock which feeds directly into the SoC's internal PLL.<br />
<br />
The following are tests run to determine what the values of each register corresponds to. It appears that the maximum clock speed is 499MHz and the minimum clock speed is 16MHz.<br />
<br />
<b>These clocks may be wrong. "Kernel Clock Speed" is "Clock Speed + 5". However, there is an error of ± 5 to 6 in "Clock Speed".</b><br />
<br />
{| class="wikitable mw-collapsible mw-collapsed"<br />
|-<br />
! <code>0xE3103000</code> !! <code>0xE3103004</code> !! Clock Speed (MHz) !! Kernel Clock Speed (MHz)<br />
|-<br />
| 0 || 0 || 37 || 42<br />
|-<br />
| 0 || 1 || 35 || 40<br />
|-<br />
| 0 || 2 || 32 || 37<br />
|-<br />
| 0 || 3 || 29 || 34<br />
|-<br />
| 0 || 4 || 27 || 32<br />
|-<br />
| 0 || 5 || 24 || 29<br />
|-<br />
| 0 || 6 || 22 || 27<br />
|-<br />
| 0 || 7 || 19 || 24<br />
|-<br />
| 0 || 8 || 16 || 21<br />
|-<br />
| 1 || 0 || 37 || 42<br />
|-<br />
| 1 || 1 || 35 || 40<br />
|-<br />
| 1 || 2 || 32 || 37<br />
|-<br />
| 1 || 3 || 30 || 35<br />
|-<br />
| 1 || 4 || 27 || 32<br />
|-<br />
| 1 || 5 || 24 || 29<br />
|-<br />
| 1 || 6 || 22 || 27<br />
|-<br />
| 1 || 7 || 19 || 24<br />
|-<br />
| 1 || 8 || 16 || 21<br />
|-<br />
| 2 || 0 || 37 || 42<br />
|-<br />
| 2 || 1 || 35 || 40<br />
|-<br />
| 2 || 2 || 32 || 37<br />
|-<br />
| 2 || 3 || 30 || 35<br />
|-<br />
| 2 || 4 || 27 || 32<br />
|-<br />
| 2 || 5 || 24 || 29<br />
|-<br />
| 2 || 6 || 22 || 27<br />
|-<br />
| 2 || 7 || 19 || 24<br />
|-<br />
| 2 || 8 || 16 || 21<br />
|-<br />
| 3 || 0 || 79 || 84<br />
|-<br />
| 3 || 1 || 74 || 79<br />
|-<br />
| 3 || 2 || 69 || 74<br />
|-<br />
| 3 || 3 || 63 || 68<br />
|-<br />
| 3 || 4 || 58 || 63<br />
|-<br />
| 3 || 5 || 53 || 58<br />
|-<br />
| 3 || 6 || 48 || 53<br />
|-<br />
| 3 || 7 || 43 || 48<br />
|-<br />
| 3 || 8 || 37 || 42<br />
|-<br />
| 4 || 0 || 107 || 112<br />
|-<br />
| 4 || 1 || 100 || 105<br />
|-<br />
| 4 || 2 || 93 || 98<br />
|-<br />
| 4 || 3 || 86 || 91<br />
|-<br />
| 4 || 4 || 79 || 84<br />
|-<br />
| 4 || 5 || 72 || 77<br />
|-<br />
| 4 || 6 || 65 || 70<br />
|-<br />
| 4 || 7 || 58 || 63<br />
|-<br />
| 4 || 8 || 51 || 56<br />
|-<br />
| 5 || 0 || 162 || 167<br />
|-<br />
| 5 || 1 || 152 || 157<br />
|-<br />
| 5 || 2 || 142 || 147<br />
|-<br />
| 5 || 3 || 131 || 136<br />
|-<br />
| 5 || 4 || 121 || 126<br />
|-<br />
| 5 || 5 || 110 || 115<br />
|-<br />
| 5 || 6 || 100 || 105<br />
|-<br />
| 5 || 7 || 90 || 95<br />
|-<br />
| 5 || 8 || 79 || 84<br />
|-<br />
| 6 || 0 || 218 || 223<br />
|-<br />
| 6 || 1 || 204 || 209<br />
|-<br />
| 6 || 2 || 190 || 195<br />
|-<br />
| 6 || 3 || 176 || 181<br />
|-<br />
| 6 || 4 || 163 || 168<br />
|-<br />
| 6 || 5 || 148 || 153<br />
|-<br />
| 6 || 6 || 135 || 140<br />
|-<br />
| 6 || 7 || 121 || 126<br />
|-<br />
| 6 || 8 || 107 || 112<br />
|-<br />
| 7 || 0 || 329 || 334<br />
|-<br />
| 7 || 1 || 308 || 313<br />
|-<br />
| 7 || 2 || 287 || 292<br />
|-<br />
| 7 || 3 || 266 || 271<br />
|-<br />
| 7 || 4 || 246 || 251<br />
|-<br />
| 7 || 5 || 225 || 230<br />
|-<br />
| 7 || 6 || 204 || 209<br />
|-<br />
| 7 || 7 || 183 || 188<br />
|-<br />
| 7 || 8 || 162 || 167<br />
|-<br />
| 8 || 0 || 439 || 444<br />
|-<br />
| 8 || 1 || 411 || 416<br />
|-<br />
| 8 || 2 || 384 || 389<br />
|-<br />
| 8 || 3 || 356 || 361<br />
|-<br />
| 8 || 4 || 329 || 334<br />
|-<br />
| 8 || 5 || 301 || 306<br />
|-<br />
| 8 || 6 || 273 || 278<br />
|-<br />
| 8 || 7 || 246 || 251<br />
|-<br />
| 8 || 8 || 218 || 223<br />
|-<br />
| 9 || 0 || 494 || 499<br />
|-<br />
| 9 || 1 || 463 || 468<br />
|-<br />
| 9 || 2 || 432 || 437<br />
|-<br />
| 9 || 3 || 401 || 406<br />
|-<br />
| 9 || 4 || 370 || 375<br />
|-<br />
| 9 || 5 || 339 || 344<br />
|-<br />
| 9 || 6 || 308 || 313<br />
|-<br />
| 9 || 7 || 277 || 282<br />
|-<br />
| 9 || 8 || 245 || 250<br />
|-<br />
| 10 || 0 || 328 || 333<br />
|-<br />
| 10 || 1 || 308 || 313<br />
|-<br />
| 10 || 2 || 287 || 292<br />
|-<br />
| 10 || 3 || 266 || 271<br />
|-<br />
| 10 || 4 || 245 || 250<br />
|-<br />
| 10 || 5 || 225 || 230<br />
|-<br />
| 10 || 6 || 204 || 209<br />
|-<br />
| 10 || 7 || 183 || 188<br />
|-<br />
| 10 || 8 || 162 || 167<br />
|-<br />
| 11 || 0 || 37 || 42<br />
|-<br />
| 11 || 1 || 35 || 40<br />
|-<br />
| 11 || 2 || 32 || 37<br />
|-<br />
| 11 || 3 || 30 || 35<br />
|-<br />
| 11 || 4 || 27 || 32<br />
|-<br />
| 11 || 5 || 24 || 29<br />
|-<br />
| 11 || 6 || 22 || 27<br />
|-<br />
| 11 || 7 || 19 || 24<br />
|-<br />
| 11 || 8 || 16 || 21<br />
|-<br />
| 12 || 0 || 121 || 126<br />
|-<br />
| 12 || 1 || 113 || 118<br />
|-<br />
| 12 || 2 || 105 || 110<br />
|-<br />
| 12 || 3 || 97 || 102<br />
|-<br />
| 12 || 4 || 90 || 95<br />
|-<br />
| 12 || 5 || 82 || 87<br />
|-<br />
| 12 || 6 || 74 || 79<br />
|-<br />
| 12 || 7 || 66 || 71<br />
|-<br />
| 12 || 8 || 58 || 63<br />
|-<br />
| 13 || 0 || 245 || 250<br />
|-<br />
| 13 || 1 || 230 || 235<br />
|-<br />
| 13 || 2 || 214 || 219<br />
|-<br />
| 13 || 3 || 199 || 204<br />
|-<br />
| 13 || 4 || 183 || 188<br />
|-<br />
| 13 || 5 || 168 || 173<br />
|-<br />
| 13 || 6 || 152 || 157<br />
|-<br />
| 13 || 7 || 136 || 141<br />
|-<br />
| 13 || 8 || 121 || 126<br />
|-<br />
| 14 || 0 || 439 || 444<br />
|-<br />
| 14 || 1 || 412 || 417<br />
|-<br />
| 14 || 2 || 384 || 389<br />
|-<br />
| 14 || 3 || 356 || 361<br />
|-<br />
| 14 || 4 || 329 || 334<br />
|-<br />
| 14 || 5 || 301 || 306<br />
|-<br />
| 14 || 6 || 273 || 278<br />
|-<br />
| 14 || 7 || 246 || 251<br />
|-<br />
| 14 || 8 || 218 || 223<br />
|-<br />
| 15 || 0 || 494 || 499<br />
|-<br />
| 15 || 1 || 463 || 468<br />
|-<br />
| 15 || 2 || 433 || 438<br />
|-<br />
| 15 || 3 || 401 || 406<br />
|-<br />
| 15 || 4 || 370 || 375<br />
|-<br />
| 15 || 5 || 339 || 344<br />
|-<br />
| 15 || 6 || 308 || 313<br />
|-<br />
| 15 || 7 || 277 || 282<br />
|-<br />
| 15 || 8 || 245 || 250<br />
|-<br />
| 16 || 0 || 37 || 42<br />
|-<br />
| 16 || 1 || 35 || 40<br />
|-<br />
| 16 || 2 || 32 || 37<br />
|-<br />
| 16 || 3 || 29 || 34<br />
|-<br />
| 16 || 4 || 27 || 32<br />
|-<br />
| 16 || 5 || 24 || 29<br />
|-<br />
| 16 || 6 || 22 || 27<br />
|-<br />
| 16 || 7 || 19 || 24<br />
|-<br />
| 16 || 8 || 16 || 21<br />
|}<br />
<br />
=== VENEZIA Clock ===<br />
The register at physical address <code>0xE3103020</code> seems to control the clock frequency of VENEZIA.<br />
<br />
{| class="wikitable"<br />
|+ Allowed register values<br />
! Value !! Clock speed<br />
|-<br />
| 0x1 || 41MHz<br />
|-<br />
| 0x2 || 55MHz<br />
|-<br />
| 0x3 || 83MHz<br />
|-<br />
| 0x4 || 111MHz<br />
|-<br />
| 0x5 || 166MHz<br />
|-<br />
| 0x6 || 222MHz<br />
|-<br />
| 0x7 || 333MHz<br />
|}<br />
<br />
=== Vip Clock ===<br />
<br />
{| class="wikitable"<br />
|+ Allowed register values<br />
! Value !! Clock speed<br />
|-<br />
| 0x1 || 41MHz<br />
|-<br />
| 0x2 || 55MHz<br />
|-<br />
| 0x3 || 83MHz<br />
|-<br />
| 0x4 || 111MHz<br />
|-<br />
| 0x5 || 166MHz<br />
|-<br />
| 0x6 || 222MHz<br />
|}<br />
<br />
=== CMeP Clock ===<br />
The low 8 bits of the register at physical address <code>0xE3103040</code> control CMeP clock speed, and Main Xbar, I/O Bus speed too.<br />
This was guessed because it is used in a <code>usleep()</code>-like function to calculate the input for a <code>sleep_for_cycles()</code> function.<br />
<br />
<br />
Testing was performed using SceLT5 as a time reference (µs-accurate), and compared against the hardcoded table in <code>second_loader</code>.<br />
{| class="wikitable"<br />
|-<br />
! Value !! Main Xbar !! I/O Bus !! CMeP speed (measured) !! Table value<br />
|-<br />
| 0x0 || Unknown || Unknown || 41.5 MHz<br />
|rowspan="8"|N/A<br />
|-<br />
| 0x1 || Unknown || Unknown || 41.5 MHz<br />
|-<br />
| 0x2 || Unknown || Unknown || 55.4 MHz<br />
|-<br />
| 0x3 || Unknown || Unknown || 83.0 MHz<br />
|-<br />
| 0x4 || Unknown || Unknown || 110.7 MHz<br />
|-<br />
| 0x5 || Unknown || Unknown || 166.0 MHz<br />
|-<br />
| 0x6 || Unknown || Unknown || 110.7 MHz<br />
|-<br />
| 0x7 || Unknown || Unknown || 166.0 MHz<br />
|-<br />
| 0x10000 || Undefined || Undefined || 27.7 MHz || 50 MHz<br />
|-<br />
| 0x10001 || Undefined || Undefined || 27.7 MHz || 50 MHz<br />
|-<br />
| 0x10002 || 56 MHz || 27 MHz || 27.7 MHz || 27 MHz<br />
|-<br />
| 0x10003 || 83 MHz || 42 MHz || 41.5 MHz || 42 MHz<br />
|-<br />
| 0x10004 || 111 MHz || 56 MHz || 55.3 MHz || 56 MHz<br />
|-<br />
| 0x10005 || 166 MHz || 83 MHz || 83.0 MHz || 83 MHz<br />
|-<br />
| 0x10006 || 222 MHz || 111 MHz || 110.7 MHz || 111 MHz<br />
|-<br />
| 0x10007 || 333 MHz || 166 MHz || 166.0 MHz || 160 MHz<br />
|}<br />
<br />
<code>second_loader</code> sets the register to 0x10005, meaning CMeP usually runs at 83MHz.<br />
<br />
=== CameraBus Clock ===<br />
<br />
{| class="wikitable"<br />
|+ Allowed register values<br />
! Value !! Clock speed<br />
|-<br />
| 1 || 41 MHz<br />
|-<br />
| 2 || 67 MHz<br />
|-<br />
| 3 || 83 MHz<br />
|-<br />
| 4 || 133 MHz<br />
|-<br />
| 5 || 166 MHz<br />
|}<br />
<br />
=== DRAM Main Clock ===<br />
<br />
{| class="wikitable"<br />
|+ Allowed register values<br />
! Value !! Clock speed (measured)<br />
|-<br />
| 1 || 170 MHz<br />
|}<br />
<br />
=== DRAM Sub Clock ===<br />
<br />
{| class="wikitable"<br />
|+ Allowed register values<br />
! Value !! Clock speed (measured)<br />
|-<br />
| 1 || 170 MHz<br />
|}<br />
<br />
=== Msif Clock ===<br />
<br />
{| class="wikitable"<br />
|+ Allowed register values<br />
! Value !! Clock speed<br />
|-<br />
| 0x10000 || 20 MHz<br />
|-<br />
| 0x10001 || 40 MHz<br />
|-<br />
| 0x10002 || 60 MHz<br />
|}<br />
<br />
Bit 0x10000 is optional i.e by default Msif runs at 20 MHz. Its effect is unknown.<br />
<br />
=== Compat/GpuXbar Clock ===<br />
<br />
{| class="wikitable"<br />
|+ Allowed register values<br />
! Value !! Compat Clock speed !! GpuXbar Clock speed<br />
|-<br />
| 0 || 333 MHz || 166 MHz<br />
|-<br />
| 1 || Unknown || 111 MHz<br />
|-<br />
| 2 || 222 MHz || 83 MHz<br />
|}<br />
<br />
=== Dmac5 Clock ===<br />
<br />
{| class="wikitable"<br />
|+ Allowed register values<br />
! Value !! Clock speed<br />
|-<br />
| 1 || 41 MHz<br />
|-<br />
| 2 || 83 MHz<br />
|-<br />
| 3 || 133 MHz<br />
|-<br />
| 4 || 166 MHz<br />
|}<br />
<br />
=== Sys Clock ===<br />
<br />
{| class="wikitable"<br />
|+ Allowed register values<br />
! Value !! Clock speed<br />
|-<br />
| 0 || 222 MHz<br />
|-<br />
| 1 || 190 MHz<br />
|}<br />
<br />
== ScePervasive2 (0xE3110000) ==<br />
<br />
{| class="wikitable"<br />
|-<br />
! Offset<br />
! Description<br />
|-<br />
| 0x248<br />
| <code>VIP_PROT_BAP_ERRV</code><br />
|-<br />
| 0x24C<br />
| <code>VIP_PROT_BAP_ERRC</code><br />
|-<br />
| 0x250<br />
| <code>VIP_PROT_BAP_ERRA</code><br />
|-<br />
| 0x254<br />
| <code>VIP_PROT_VDPD_ERRV</code><br />
|-<br />
| 0x258<br />
| <code>VIP_PROT_VDPD_ERRC</code><br />
|-<br />
| 0x25C<br />
| <code>VIP_PROT_VDPD_ERRA</code><br />
|-<br />
| 0x260<br />
| <code>VIP_PROT_VDPM_ERRV</code><br />
|-<br />
| 0x264<br />
| <code>VIP_PROT_VDPM_ERRC</code><br />
|-<br />
| 0x268<br />
| <code>VIP_PROT_VDPM_ERRA</code><br />
|-<br />
| 0x348<br />
| <code>VENE_PROT_REG_ERRV</code><br />
|-<br />
| 0x34C<br />
| <code>VENE_PROT_REG_ERRC</code><br />
|-<br />
| 0x350<br />
| <code>VENE_PROT_REG_ERRA</code><br />
|-<br />
| 0xC00<br />
| 0x0 alias for ARM (0 / 1) = (0x1f000000 / 0x40000000)<br />
|-<br />
| 0xD04<br />
| SPM128 Bus Error Address register<br />
|-<br />
| 0xD08<br />
| SPM128 Bus Error Attribute register<br />
|-<br />
| 0xD14<br />
| SPM32 Bus Error Address register<br />
|-<br />
| 0xD18<br />
| SPM32 Bus Error Attribute register<br />
|-<br />
| 0xD24<br />
| CompatRAM Bus Error Address register<br />
|-<br />
| 0xD28<br />
| CompatRAM Bus Error Attribute register<br />
|-<br />
| 0xD34<br />
| Pervasive2 Bus Error Address register - maybe <code>PERVASIVE2_SYS_BEADR</code><br />
|-<br />
| 0xD38<br />
| Pervasive2 Bus Error Attribute register - maybe <code>PERVASIVE2_SYS_BEATB</code><br />
|-<br />
| 0xD44<br />
| SPM128 Secure Bus Error Address register<br />
|-<br />
| 0xD48<br />
| SPM128 Secure Bus Error Attribute register<br />
|-<br />
| 0xD54<br />
| SPM32 Secure Bus Error Address register<br />
|-<br />
| 0xD58<br />
| SPM32 Secure Bus Error Attribute register<br />
|-<br />
| 0xD64<br />
| CompatRAM Secure Bus Error Address register<br />
|-<br />
| 0xD68<br />
| CompatRAM Secure Bus Error Attribute register<br />
|-<br />
| 0xD74<br />
| Pervasive2 Secure Bus Error Address register - maybe <code>PERVASIVE2_SYS_SBEADR</code><br />
|-<br />
| 0xD78<br />
| Pervasive2 Secure Bus Error Attribute register - maybe <code>PERVASIVE2_SYS_SBEATB</code><br />
|-<br />
| 0xD80<br />
| BET0 (Bus Error Target 0) - full name may be <code>PERVASIVE2_SYS_BET0</code><br />
|-<br />
| 0xD90<br />
| BET1 (Bus Error Target 1) - full name may be <code>PERVASIVE2_SYS_BET1</code><br />
|-<br />
| 0xD94<br />
| <code>PERVASIVE2_SYS_BEBT</code> - Bus Error ?Bus Target?<br />
|-<br />
| 0xDC0<br />
| SBET0 (Secure Bus Error Target 0) - full name may be <code>PERVASIVE2_SYS_SBET0</code><br />
|-<br />
| 0xDD0<br />
| SBET1 (Secure Bus Error Target 1) - full name may be <code>PERVASIVE2_SYS_SBET1</code><br />
|-<br />
| 0xDD4<br />
| <code>PERVASIVE2_SYS_SBEBT</code> - Secure Bus Error ?Bus Target?<br />
|-<br />
| 0xF30<br />
| USB PHY ready state - Bit 0 = Port 0, Bit 1 = Port 1, Bit 2 = Port 2<br />
|-<br />
| 0xF34<br />
| USB PHY interrupt state - Bit 0 = Port 0, Bit 1 = Port 1, Bit 2 = Port 2<br />
|-<br />
| 0xF40<br />
| Bit 0 = Memory Card insert state<br />
|-<br />
| 0xF44<br />
| Memory Card insert interrupt state - Bit 0 = Card removed, Bit 1 = Card inserted<br />
|-<br />
| 0xF50<br />
| USB VBUS state - Bit 0 = Port 0, Bit 1 = Port 1, Bit 2 = Port 2<br />
|-<br />
| 0xF54<br />
| USB VBUS interrupt state<br />
|}<br />
<br />
<br />
[[Category:Devices]]</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=SceDeci4pSDfMgr&diff=20887
SceDeci4pSDfMgr
2023-12-31T16:14:25Z
<p>CreepNT: /* Types */ Add names for OpenParam</p>
<hr />
<div>== Module ==<br />
<br />
This module exists only in non-secure world. The SELF can be found in <code>os0:kd/deci4p_sdfmgr.skprx</code>.<br />
{| class="wikitable"<br />
|-<br />
! Version !! World !! Privilege<br />
|-<br />
| 0.990-3.65 || Non-secure || Kernel<br />
|}<br />
<br />
== Libraries ==<br />
<br />
=== Known NIDs ===<br />
<br />
{| class="wikitable"<br />
|-<br />
! Version !! Name !! World !! Visibility !! NID<br />
|-<br />
| 0.990-3.65 || [[SceDeci4pSDfMgr#SceDeci4pSDfMgrForKernel|SceDeci4pSDfMgrForKernel]] || Non-secure || Kernel || 0xA1386CB2<br />
|}<br />
<br />
== Types ==<br />
<br />
<source lang="C"><br />
//Error codes (guessed names)<br />
#define SCE_DECI_SYS_ERROR_INVALID_ARGUMENT (-2146893823) //<! 0x80090001<br />
#define SCE_DECI_SYS_ERROR_INVALID_SOCKET (-2146893822) //<! 0x80090002 - ExSend returns INVALID_ARGUMENT on a bad socket though :x<br />
#define SCE_DECI_SYS_ERROR_ALREADY_REGISTERED (-2146893821) //<! 0x80090003<br />
#define SCE_DECI_SYS_ERROR_NO_ENTRY (-2146893820) //<! 0x80090004 - no free entry to create socket remaining<br />
#define SCE_DECI_SYS_ERROR_ILLEGAL_ADDR (-2146893819) //<! 0x80090005 - unexpected NULL provided<br />
#define SCE_DECI_SYS_ERROR_INVALID_ARGUMENT_SIZE (-2146893818) //<! 0x80090006<br />
#define SCE_DECI_SYS_ERROR_BLOCKED (-2146893817) //<! 0x80090007<br />
#define SCE_DECI_SYS_ERROR_UNKNOWN_A (-2146893814) //<! 0x8009000A<br />
#define SCE_DECI_SYS_ERROR_NO_HOST_IF (-2146893811) //<! 0x8009000D - no Host Interface<br />
<br />
#define SCE_SDFMGR_EXCP_TYPE_PABT (0)<br />
#define SCE_SDFMGR_EXCP_TYPE_DABT (1)<br />
#define SCE_SDFMGR_EXCP_TYPE_UNDEF (2)<br />
#define SCE_SDFMGR_EXCP_TYPE_BUS (3)<br />
<br />
typedef int (* SceSDfMgrExceptionCallback)(SceExcpmgrExceptionContext *context, SceUInt32 pc, SceUInt32 cpsr);<br />
<br />
typedef SceInt32 SceSDfMgrSocketId;<br />
<br />
#define SCE_SDFMGR_EVENT_READ (1) // received something<br />
#define SCE_SDFMGR_EVENT_READDONE (2)<br />
#define SCE_SDFMGR_EVENT_WRITE (3) // something to send<br />
#define SCE_SDFMGR_EVENT_WRITEDONE (4)<br />
#define SCE_SDFMGR_EVENT_TYPE_5 (5)<br />
#define SCE_SDFMGR_EVENT_TYPE_6 (6)<br />
<br />
typedef void (* SceSDfMgrEventHandler)(SceUInt32 event, void* eventData, void* pCommon); //<! pCommon is the data passed to Open/ExOpen<br />
<br />
typedef struct _SceSDfMgrOpenParam {<br />
SceSize size; //<! Size of this structure (0x1C)<br />
SceUInt32 uProtocol; //<! Also called "clientId". ID of the registered protocol.<br />
SceUInt32 unk8;<br />
SceUInt32 uVersion; //<! Protocol version<br />
SceUInt32 uVersionLimit;<br />
SceUInt16 unk14;<br />
SceUInt16 flags; //<! Bitflag: 0x1 makes the initial "status" 0x3 instead of 0x1, 0x2 makes a call to dcmpSendStatusProtocolAlias, ...<br />
char* name; //<! Name of the "caller" - example: DCMP<br />
} SceSDfMgrOpenParam;<br />
<br />
typedef void (* SceSDfMgrBreakHook)(void);<br />
</source><br />
<br />
== SceDeci4pSDfMgrForKernel ==<br />
<br />
=== sceSDfMgrOpenForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xA55F5F0D<br />
|}<br />
<br />
Acquires an interrupt-suspending lock and calls [[SceDeci4pSDfMgr#sceSDfMgrExOpenForKernel|sceSDfMgrExOpenForKernel]].<br />
<br />
<source lang="C">SceSDfMgrSocketId sceSDfMgrOpenForKernel(SceSDfMgrEventHandler eventHandler, const SceSDfMgrOpenParam* openParam, void* pCommon);</source><br />
<br />
=== sceSDfMgrExOpenForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xCF4A3E03<br />
|}<br />
<br />
Opens a SDfMgr socket. <code>openParam</code> is not retained and can be disposed of after this call.<br />
<br />
<source lang="C">SceSDfMgrSocketId sceSDfMgrExOpenForKernel(SceSDfMgrEventHandler eventHandler, const SceSDfMgrOpenParam* openParam, void* pCommon);</source><br />
<br />
=== sceSDfMgrExSendForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xDAFE03AD<br />
|}<br />
<br />
Sends up to <code>bufLen</code> bytes from <code>buffer</code>, and returns number of bytes sent on success.<br />
<br />
Note that <code>buffer</code> is not '''<code>const</code>''': this is not a typo. <code>buffer</code> may be written to under specific conditions.<br />
<br />
<source lang="C">SceSSize sceSDfMgrExSendForKernel(SceSDfMgrSocketId sock, void* buffer, SceSize bufLen);</source><br />
<br />
=== sceSDfMgrExReqSendForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xB44083E1<br />
|}<br />
<br />
=== sceSDfMgrExRecvForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xF43F5941<br />
|}<br />
<br />
Receives up to <code>bufLen</code> bytes in <code>buffer</code>, and returns number of bytes received on success.<br />
<br />
<source lang="C">SceSSize sceSDfMgrExRecvForKernel(SceSDfMgrSocketId sock, void* buffer, SceSize bufLen);</source><br />
<br />
=== sceSDfMgrCloseForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x86CFC8C6<br />
|}<br />
<br />
Acquires an interrupt-suspending lock and calls [[SceDeci4pSDfMgr#sceSDfMgrExCloseForKernel|sceSDfMgrExCloseForKernel]].<br />
<br />
<source lang="C">SceInt32 sceSDfMgrCloseForKernel(SceSDfMgrSocketId sock);</source><br />
<br />
=== sceSDfMgrExCloseForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x90E8D453<br />
|}<br />
<br />
Close a SDfMgr socket.<br />
<br />
<source lang="C">SceInt32 sceSDfMgrExCloseForKernel(SceSDfMgrSocketId sock);</source><br />
<br />
=== sceSDfMgrBreakSystemForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xEDFBA012<br />
|}<br />
<br />
Sets up some internal state and calls <code>[[SceKernelIntrMgr#sceKernelGenerateSoftIntrForDriver]](0, 1, 0)</code>.<br />
<br />
<source lang="C">SceInt32 sceSDfMgrBreakSystemForKernel(void);</source><br />
<br />
=== sceSDfMgrContinueSystemForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x9A653F19<br />
|}<br />
<br />
Sets up some internal state and calls <code>sceKernelGenerateSoftIntrForDriver(0, 1, 0)</code>.<br />
<br />
<source lang="C">SceInt32 sceSDfMgrContinueSystemForKernel(void);</source><br />
<br />
=== SceDeci4pSDfMgrForKernel_A963E333 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xA963E333<br />
|}<br />
<br />
Calls <code>[[SceDeci4pSDfMgr#sceSDfMgrExReqSend|sceSDfMgrExReqSend]](sock)</code>, then may call an Host Interface function and/or call <code>sceKernelGenerateSoftIntrForDriver(1, 0, targetLUT[sceKernelCpuId()])</code> where <code>targetLUT = {1, 2, 4, 8}</code>.<br />
<br />
<source lang="C">SceInt32 SceDeci4pSDfMgrForKernel_A963E333(SceSDfMgrSocketId sock);</source><br />
<br />
=== SceDeci4pSDfMgrForKernel_98AEC60E ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x98AEC60E<br />
|}<br />
<br />
=== SceDeci4pSDfMgrForKernel_FFC95B63 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xFFC95B63<br />
|}<br />
<br />
Equivalent to [[SceDeci4pDfMgr#SceDeci4pDfMgrForDebugger_6D26CC56|SceDeci4pDfMgrForDebugger_6D26CC56]].<br />
<br />
Writes <code>val</code> as a 3-byte unsigned integer to <code>ptr</code>.<br />
<br />
<source lang="C">void SceDeci4pSDfMgrForKernel_FFC95B63(void* ptr, SceUInt32 val);</source><br />
<br />
=== SceDeci4pSDfMgrForKernel_68903C1D ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x68903C1D<br />
|}<br />
<br />
Equivalent to [[SceDeci4pDfMgr#SceDeci4pDfMgrForDebugger_CACAB5F9|SceDeci4pDfMgrForDebugger_CACAB5F9]].<br />
<br />
Reads value at <code>ptr</code> as a 3-byte unsigned integer and returns it.<br />
<br />
<source lang="C">SceUInt32 SceDeci4pSDfMgrForKernel_68903C1D(void* ptr);</source><br />
<br />
=== SceDeci4pSDfMgrForKernel_81E7C5BD ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x81E7C5BD<br />
|}<br />
<br />
Special <code>memset</code> variant. <code>len</code> will be aligned '''down''' to meet 4-byte alignment requirement (i.e. bottom 2 bits of <code>len</code> are ignored).<br />
<br />
<source lang="C">void* SceDeci4pSDfMgrForKernel_81E7C5BD(void* dst, int ch, size_t len);</source><br />
<br />
=== SceDeci4pSDfMgrForKernel_5996E2DB ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x5996E2DB<br />
|}<br />
<br />
Equivalent to <code>memcpy</code>.<br />
<br />
<source lang="C">void* SceDeci4pSDfMgrForKernel_8A3B06F2(void* dst, void* src, size_t len);</source><br />
<br />
=== SceDeci4pSDfMgrForKernel_8A3B06F2 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x8A3B06F2<br />
|}<br />
<br />
Equivalent to <code>memset</code>.<br />
<br />
<source lang="C">void* SceDeci4pSDfMgrForKernel_8A3B06F2(void* dst, int ch, size_t len);</source><br />
<br />
=== SceDeci4pSDfMgrForKernel_CCD56670 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || 0xCCD56670<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
Equivalent to <code>memchr</code>.<br />
<br />
<source lang="C">void* SceDeci4pSDfMgrForKernel_CCD56670(void* s, int ch, size_t len);</source><br />
<br />
=== SceDeci4pSDfMgrForKernel_501CE61D ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x501CE61D<br />
|}<br />
<br />
This is a <code>printf</code>-like function.<br />
<br />
<source lang="C">size_t SceDeci4pSDfMgrForKernel_501CE61D(char* fmt, ...);</source><br />
<br />
=== SceDeci4pSDfMgrForKernel_0A6437B6 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x0A6437B6<br />
|}<br />
<br />
A potential name for is function is <code>sceSDfMgrIsSystemInBreakForKernel</code>.<br />
<br />
Returns respectively 1 or 0 depending on whether [[SceDeci4pSDfMgr#sceSDfMgrBreakSystem|sceSDfMgrBreakSystem]] or [[SceDeci4pSDfMgr#sceSDfMgrContinueSystem|sceSDfMgrContinueSystem]] was called last.<br />
<br />
<source lang="C">SceBool SceDeci4pSDfMgrForKernel_0A6437B6(void);</source><br />
<br />
=== sceSDfMgrUnregisterExcpHandlerForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xB050A0D5<br />
|}<br />
<br />
Temp name was <code>sceSDfMgrUnregisterCpuExcpCallbackForKernel</code>. This name is a deduction from [[SceDeci4pSDfMgr#sceSDfMgrRegisterExcpHandlerForKernel|sceSDfMgrRegisterExcpHandlerForKernel]].<br />
<br />
Unregisters an exception handler previously registered using [[SceDeci4pSDfMgr#sceSDfMgrRegisterExcpHandlerForKernel|sceSDfMgrRegisterExcpHandlerForKernel]]. Call it using the same arguments as provided to [[SceDeci4pSDfMgr#sceSDfMgrRegisterExcpHandlerForKernel|sceSDfMgrRegisterExcpHandlerForKernel]].<br />
<br />
<source lang="C">SceInt32 sceSDfMgrUnregisterExcpHandlerForKernel(SceSDfMgrExceptionCallback func, SceUInt32 type);</source><br />
<br />
=== sceSDfMgrRegisterExcpHandlerForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x6BF5553C<br />
|}<br />
<br />
Temp name was <code>sceSDfMgrRegisterCpuExcpCallbackForKernel</code>.<br />
<br />
Used by [[SceDeci4pSDbgp]].<br />
<br />
<source lang="C">SceInt32 sceSDfMgrRegisterExcpHandlerForKernel(SceSDfMgrExceptionCallback func, SceUInt32 type);</source><br />
<br />
=== sceSDfMgrRegisterBreakHookForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xB22B42FB<br />
|}<br />
<br />
Registers a function to be called when some exceptions or interrupts happen.<br />
<br />
<source lang="C">SceInt32 sceSDfMgrRegisterBreakHookForKernel(SceSDfMgrBreakHook hook);</source><br />
<br />
=== sceSDfMgrUnregisterBreakHookForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xE53400AE<br />
|}<br />
<br />
This is a guessed name. This name is a deduction from [[SceDeci4pSDfMgr#sceSDfMgrRegisterBreakHookForKernel|sceSDfMgrRegisterBreakHookForKernel]].<br />
<br />
Unregisters a break hook previously registered using [[SceDeci4pSDfMgr#sceSDfMgrRegisterBreakHookForKernel|sceSDfMgrRegisterBreakHookForKernel]]. Call it using the same argument as provided to [[SceDeci4pSDfMgr#sceSDfMgrRegisterBreakHookForKernel|sceSDfMgrRegisterBreakHookForKernel]].<br />
<br />
<source lang="C">SceInt32 sceSDfMgrUnregisterBreakHookForKernel(SceSDfMgrBreakHook hook);</source><br />
<br />
=== sceSDfMgrPollForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x152D98DF<br />
|}<br />
<br />
=== sceSDfMgrGetMemoryTypeForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x35238B8A<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
If DIP switch 210 is set, returns SCE_KERNEL_MEMBLOCK_TYPE_KERNEL_TOOL_RW, else returns SCE_KERNEL_MEMBLOCK_TYPE_KERNEL_ROOT_GAME_RW.<br />
<br />
<source lang="C">SceUInt32 sceSDfMgrGetMemoryTypeForKernel(void);</source><br />
<br />
SceDeci4pSDfMgrForKernel_11340BD4: 0x11340BD4<br />
SceDeci4pSDfMgrForKernel_3A25594F: 0x3A25594F<br />
SceDeci4pSDfMgrForKernel_4D974C08: 0x4D974C08<br />
SceDeci4pSDfMgrForKernel_4EA65698: 0x4EA65698<br />
SceDeci4pSDfMgrForKernel_58D7597A: 0x58D7597A<br />
SceDeci4pSDfMgrForKernel_59C077B3: 0x59C077B3<br />
SceDeci4pSDfMgrForKernel_682D0EFB: 0x682D0EFB<br />
SceDeci4pSDfMgrForKernel_BFB482D8: 0xBFB482D8<br />
SceDeci4pSDfMgrForKernel_C38EA67A: 0xC38EA67A<br />
SceDeci4pSDfMgrForKernel_FCF211FB: 0xFCF211FB<br />
<br />
[[Category:ARM]]<br />
[[Category:Kernel]]<br />
[[Category:Modules]]<br />
[[Category:Library]]</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=Bugs&diff=20884
Bugs
2023-12-31T00:58:55Z
<p>CreepNT: /* Kernel */ Add "sceKernelThreadMgrModuleBoot doesn't clear q1"</p>
<hr />
<div>The PS Vita has bugs. Some bugs can lead to [[Vulnerabilities]]. Others lead to nothing useful (yet) but can serve as examples of what not to do.<br />
<br />
= Exploitable bugs =<br />
<br />
See [[Vulnerabilities]].<br />
<br />
= Non-exploitable bugs =<br />
<br />
== [[CMeP]] ==<br />
<br />
=== CMeP does not check m' >= N during RSA signature verification ===<br />
<br />
Discovered on 2023-02-22. Actually tested on 2023-08-21.<br />
<br />
<b>This is not a real bug.</b><br />
<br />
Most of CMeP's RSA signature verification does not check for <code>m' >= N</code>.<br />
<br />
However, you can input a value greater than N and it remains safe because it does <code>m' % N</code> (modulo) first through the bignum hardware.<br />
<br />
This makes the RSA signature verification function return success when there is one legitimate signature and any number of fake signatures (<code>m' + N * any_num</code>).<br />
<br />
== [[TrustZone]] ==<br />
<br />
=== SceTimerForUsleep is accessible from NS ===<br />
<br />
The [[Hardware_Timers|SceTimerForUsleep]] timer (Word Timer 7) is reserved for the TrustZone kernel. However, this timer's MMIO range is not blacklisted from access by ARM cores in Non-Secure state. An attacker in Non-Secure state can thus change the timer's configuration, even if it is being used from Secure state.<br />
<br />
This timer is used for the implementation of [[SceKernelIntrMgr#sceKernelUsleepForTZS|<code>sceKernelUsleep</code>]], which can be roughly summed up as "''program the timer to send an interrupt after delay has elapsed and wait for the interrupt''".<br />
By stopping the timer while core X is executing [[SceKernelIntrMgr#sceKernelUsleepForTZS|<code>sceKernelUsleep()</code>]] in Secure state, this allows an attacker on another core ''in Non-Secure'' state to hang core X (as it waits for an interrupt that will never be delivered).<br />
In theory, this could be used to create or enlarge a ToCToU window; in practice, this attack is useless because only the SMC 0x121 handler (inside [[SceDriverTzs]]) uses [[SceKernelIntrMgr#sceKernelUsleepForTZS|<code>sceKernelUsleep()</code>]] and it isn't vulnerable to ToCToU. This was only checked in 3.65 and may not be true in older firmwares.<br />
<br />
For obvious reasons, interrupts are not disabled while waiting in [[SceKernelIntrMgr#sceKernelUsleepForTZS|<code>sceKernelUsleep</code>]] - thus, this vulnerability does '''not''' allow an attacker to prevent Secure state interrupts handling on a core.<br />
<br />
== [[Kernel]] ==<br />
<br />
=== sceKernelThreadMgrModuleBoot doesn't clear q1 ===<br />
<br />
Discovered on 2022-08-29 by CreepNT.<br />
<br />
At the beginning of <code>sceKernelThreadMgrModuleBoot</code> in [[SceKernelThreadMgr]], a subroutine is called to initialize all VFP registers to the value 0x7FF8DEAD7F80DEAD (as double).<br />
However, the routine forgets to set register <code>q1</code>, leaving it uninitialized.<br />
<br />
This bug is not very important because it doesn't cause any malfunction and the VFP registers will be overwritten at some point when scheduling starts.<br />
<br />
=== Syscall table collision between modules ===<br />
<br />
Because of the time between a slot is allocated and the time it is written to, there could be collisions. For example, assume there is one empty syscall slot left. Two modules each exporting syscalls are loaded and both of them are assigned the final free slot. One user library is loaded that imports from the first module. Then it imports from the second module. At this point, the function pointer exported by the first module is replaced with the second one.<br />
<br />
It is unlikely this would lead to any security vulnerabilities, but it could create system instability. However, if the system has so many (let us assume more than 3000) syscalls loaded, it may be already in an unstable state.<br />
<br />
=== Kernel heap pointer leak in sceKernelGetLibraryInfoByNID ===<br />
<br />
Discovered on 2019-12-17 by Princess of Sleeping.<br />
<br />
[[SceKernelModulemgr#sceKernelGetLibraryInfoByNID]] leaks a kernel heap pointer, but it is probably not useful for kernel exploitation.<br />
<br />
SceKernelLibraryInfo.libname is a pointer to kernel memory. See [[SceKernelModulemgr#Types]].<br />
<br />
PoC code:<br />
<source lang="C"><br />
SceUID modids[0x80];<br />
SceSize num = 0x80;<br />
SceKernelLibraryInfo libinfo;<br />
libinfo.size = sizeof(libinfo);<br />
sceKernelGetModuleList(~0, modids, (int *)&num);<br />
sceKernelGetLibraryInfoByNID(modids[num - 2], 0xCAE9ACE6, &libinfo);<br />
sceClibPrintf("LEAKED KERNEL HEAP POINTER !!! ---> 0x%X <--- !!!\n", libinfo.libname);<br />
</source><br />
<br />
Not fixed as of FW 3.600.011.<br />
<br />
=== SceIofilemgr misses internal NULL pointer checks ===<br />
<br />
[[SceIofilemgr]]'s syscalls wrappers do various checks in usermode for the sanity of usermode arguments, but some internal functions that the syscalls call do not do proper checks.<br />
<br />
For example, you can simply trigger a Kernel DABT by running the following code: <source lang="C">sceIoDevctl(NULL, 0, NULL, 0, NULL, 0);</source><br />
<br />
Confirmed in FW 2.10. FWs >=3.60 have proper checks.<br />
<br />
=== sceAppMgrDestroyAppByAppId triggers kernel panic ===<br />
<br />
Triggering a usermode exception immediately after calling sceAppMgrDestroyAppByAppId causes ?[[SceKernelThreadMgr]]? to get confused and trigger a kernel exception.<br />
<br />
=== sceKernelCreateThread in thumb mode ===<br />
<br />
[[SceKernelThreadMgr#sceKernelCreateThreadForUser]] checks the memory attributes to see if the entry point is executable, but in thumb mode, the function pointer always has bit 0 as 1, so if the entry point is the last 4-bytes of a memory page, then the next check fails and returns 0x80020006.<br />
<br />
<source lang="C"><br />
res = sceKernelIsEqualAccessibleRangeProcBySWForDriver(pid, memory_attr, entry, 4);<br />
</source><br />
<br />
=== sceNetRecvfromForDriver 0xC0022005 error on kernel call ===<br />
<br />
This is because the internal function always sets the is_user flag in the parameter, so setting the kernel memory pointer to data in [[SceNetPs#sceNetRecvfromForDriver]] will result in an error in [[SceSysmem#sceKernelCopyToUserDomainForKernel]] or [[SceSysmem#sceKernelCopyToUserTextDomainForKernel]].<br />
<br />
<source lang="C"><br />
// Offsets are for FW 3.60<br />
<br />
// Patch by function hook<br />
SceUID target = -1;<br />
tai_hook_ref_t FUN_8100d5a8_ref;<br />
int FUN_8100d5a8_patch(void *a1, void *a2, void *a3, int a4, void *a5, void *a6) {<br />
if (target == sceKernelGetThreadIdForDriver())<br />
*(int *)(a3 + 5 * 4) = 1; // 0:user 1:kernel 2~:kpanic<br />
return TAI_CONTINUE(int, FUN_8100d5a8_ref, a1, a2, a3, a4, a5, a6);<br />
}<br />
<br />
<br />
// Patch by code injection (recommended)<br />
int patch_netrecv_0xC0022005(void) {<br />
/*<br />
810067b2 c0 ef 10 00 vmov.i32 d16,#0 -> DD F8 30 C0 ldr ip, [sp, #0x30]<br />
810067b6 19 68 ldr r1, [r3]<br />
810067b8 a2 60 str r2, [r4, #8]<br />
810067ba da f8 0c 30 ldr.w r3, [sl, #0xc]<br />
<br />
810067be c4 e9 07 55 strd r5, r5, [r4,#0x1c] -> C4 E9 07 C5 strd ip, r5, [r4,#0x1c]<br />
810067c2 a5 61 str r5, [r4, #0x18]<br />
<br />
810067c4 e3 60 str r3, [r4, #0xc]<br />
810067c6 61 62 str r1, [r4, #0x24]<br />
<br />
810067c8 c4 ed 04 0b vstr.64 d16, [r4,#0x10] -> C4 E9 04 55 strd r5, r5, [r4,#0x10]<br />
*/<br />
SceUID module_id;<br />
void *patch_point;<br />
char inst[0x20];<br />
module_id = sceKernelSearchModuleByNameForDriver("SceNetPs");<br />
module_get_offset(0x10005, module_id, 0, 0x67b2, (uintptr_t *)&patch_point);<br />
memcpy(inst, patch_point, 0x1E);<br />
memcpy(&(inst[0x0]), (const char[4]){0xDD, 0xF8, 0x30, 0xC0}, 4);<br />
memcpy(&(inst[0xC]), (const char[4]){0xC4, 0xE9, 0x07, 0xC5}, 4);<br />
memcpy(&(inst[0x16]), (const char[4]){0xC4, 0xE9, 0x04, 0x55}, 4);<br />
taiInjectDataForKernel(0x10005, module_id, 0, 0x67B2, inst, 0x1E);<br />
return 0;<br />
}<br />
</source><br />
<br />
=== Illegal alignment check of kernel allocator ===<br />
<br />
Discovered on 2021-08-30 by Princess of Sleeping.<br />
<br />
For example, if 0x880 is passed as the alignment argument of kernel malloc, the function will not return NULL.<br />
<br />
This affects at least [[SceNetPs]] malloc and system malloc internal/external.<br />
<br />
=== Ignored sceGUIDGetNameCore error propagation ===<br />
<br />
Discovered on 2022-03-10 by Princess of Sleeping.<br />
<br />
sceGUIDGetNameCore, which is called internally by [[SceSysmem#sceGUIDGetNameForDriver]] or [[SceSysmem#sceGUIDGetName2ForDriver]], always returns 0 even if an error occurs in the function.<br />
<br />
<source lang="C"><br />
void unsafe_calling_example_1(void) {<br />
int res;<br />
const char *name;<br />
<br />
// Use some tricks to reach sceGUIDGetNameCore with invalid guid.<br />
res = sceGUIDGetName((invalid_guid | 1) & ~0xC0000000, &name);<br />
<br />
// res is always 0 even failed internally.<br />
// And sceGUIDGetNameCore initializes name with NULL, but if the internal check fails too early, name is not initialized and is undefined.<br />
}<br />
<br />
void unsafe_calling_example_2(void) {<br />
const char *name;<br />
<br />
// Use some tricks to reach sceGUIDGetNameCore with invalid guid.<br />
name = sceGUIDGetName2((invalid_guid | 1) & ~0xC0000000);<br />
<br />
// res is always 0 even failed internally.<br />
// And sceGUIDGetNameCore initializes name with NULL, but if the internal check fails too early, name is not initialized and is undefined.<br />
// If sceGUIDGetNameCore failed internally, name value is *(uint32_t *)(unsafe_calling_example_2_current_sp - 0x10)<br />
}<br />
<br />
void safe_calling_example_1(void) {<br />
int res;<br />
const char *name = NULL; // Initialize with NULL in advance<br />
<br />
// Use some tricks to reach sceGUIDGetNameCore with invalid guid.<br />
res = sceGUIDGetName((invalid_guid | 1) & ~0xC0000000, &name);<br />
<br />
// res is always 0 even failed internally.<br />
<br />
if(NULL == name){<br />
sceKernelPrintf("Failed %s\n", "sceGUIDGetName");<br />
}<br />
}<br />
<br />
void safe_calling_example_2(void) {<br />
int res;<br />
const char *name;<br />
<br />
// Add guid valid check<br />
res = some_guid_valid_check(invalid_guid);<br />
if (res < 0)<br />
return; // If invalid guid it, do not call sceGUIDGetName2.<br />
<br />
// Use some tricks to reach sceGUIDGetNameCore with invalid guid.<br />
name = sceGUIDGetName2((invalid_guid | 1) & ~0xC0000000);<br />
<br />
// name is always not NULL.<br />
}<br />
</source><br />
<br />
=== Incomplete register restore on intr handler ===<br />
<br />
Discovered on 2023-03-08 by Princess of Sleeping.<br />
<br />
Confirmed on fw 1.810.<br />
<br />
In the example below, an interrupt occurs when rw_data is loaded. In that case the interrupt handler will handle it, but not fully restore the DACR when leaving the function, but restore it from the ThreadCB.<br />
<br />
And what is set in ThreadCB is the kernel's default client setting of 0x55550000. So when the interrupt ends and you try to write to rx_data, a DABT occurs.<br />
<br />
<source><br />
int resolve_something(void *rx_data, void *rw_data){<br />
<br />
SceUInt32 dacr = sceKernelGetDACR();<br />
sceKernelSetDACR(dacr | 0xFFFF0000);<br />
<br />
int write_data = *(int *)rw_data;<br />
<br />
// Happened intr And Setting dacr to 0x55550000 on intr_handler register restore.<br />
<br />
*(int *)rx_data = write_data; // Trigger DABT because there is no write in RX.<br />
<br />
sceKernelSetDACR(dacr);<br />
<br />
return 0;<br />
}<br />
</source><br />
<br />
Add disable intr to fix these.<br />
<br />
<source><br />
int resolve_something(void *rx_data, void *rw_data){<br />
<br />
asm volatile ("cpsid aif\n");<br />
SceUInt32 dacr = sceKernelGetDACR();<br />
sceKernelSetDACR(dacr | 0xFFFF0000);<br />
<br />
int write_data = *(int *)rw_data;<br />
*(int *)rx_data = write_data;<br />
<br />
sceKernelSetDACR(dacr);<br />
asm volatile ("cpsie aif\n");<br />
<br />
return 0;<br />
}<br />
</source><br />
<br />
=== DACR corrupte due to sceKernelIsAccessibleRangeProc ===<br />
<br />
If [[SceSysmem#sceKernelIsAccessibleRangeProcForDriver|sceKernelIsAccessibleRangeProc]] is specified in the pid argument, switches to the target process MMU Mapping, but does not restore DACR correctly at the time of termination processing.<br />
<br />
Simplified code.<br />
<br />
<source><br />
int sceKernelIsAccessibleRangeProc(int pid, int perm, const void *addr, int size){<br />
<br />
if(pid != 0){<br />
SceUInt32 dacr = sceKernelGetDACR();<br />
set_process_mmu(pid);<br />
sceKernelIsAccessibleRangeProc_core(perm, addr, size);<br />
sceKernelSetDACR(dacr & 0x55555555);<br />
}else{<br />
// ...<br />
}<br />
}<br />
</source><br />
<br />
Be careful if you are in Development Kit. The callback of sceKernellPrintf calls sceKernelIsAccessibleRangeProc. (SceSysmem::sceKernellPrintf -> SceDeci4pSTtyp::handler -> call sceKernelIsAccessibleRangeProc for n/s format)<br />
<br />
Also, if you crash something when you write on RX with after DACR 0xFFFFFFFF, suspect this. This is not the only function for MMU Mapping like this.<br />
<br />
=== Limited buffer size in dbginfo handler for sceKernelPrintf* ===<br />
<br />
The handler properly converts dbginfo like <code>0:0xAAAAAAAA55555555(something_func:335):0xA5A5A5A5(file.c):Hi\n</code> and outputs it to tty, but its buffer size is limited, so if the function name or file name is too long, the conversion will be cut off and the incorrect output will be output to tty.<br />
<br />
=== Wrong range control in vnode lock/unlock ===<br />
<br />
If your thread tries to [[SceIofilemgr#sceVfsLockVnodeForDriver|lock]] the vnode while another thread is locking the target vnode, <code>vp->waiter</code> is incremented, but <code>waiter</code> is a 32-bit member, but the lock function Tries to increment over a range of 64-bits.<br />
<br />
=== <code>R_ARM_CALL</code>/<code>R_ARM_JUMP24</code> relocations not performed properly ===<br />
<br />
Discovered on 2023-06-17 by CreepNT.<br />
<br />
There is a bug in the [[SceKernelModulemgr]] routine that handles relocation types <code>R_ARM_CALL</code> (28) and <code>R_ARM_JUMP24</code> (29):<br />
<source lang="C"><br />
//S, A and P correspond to the relocation variables detailed in the "ELF for the Arm® Architecture" document.<br />
int displacement = (A - P) + S;<br />
unsigned opcode = read_opcode_from_address(P);<br />
<br />
if ((opcode & 0xF0000000) == 0x0) { //<- bug here<br />
opcode = (opcode & 0xFEFFFFFF) | (displacement & 0x2) << 23; //write bit 1 of displacement in 'H' bit of BLX<br />
}<br />
opcode = (opcode & 0xFF000000) | (displacement >> 2) & 0xFFFFFF; //write displacement in imm24 (bottom 2 bits not needed due to code alignment)<br />
<br />
write_opcode_to_address(P);<br />
</source><br />
<br />
The <code>if</code>-gated code is supposed to handle the special case of the <code>BLX</code> instruction, which has an additional bit (<code>H</code>) of storage for the offset to target function (because ARM code is 4-byte aligned but Thumb code is 2-byte aligned). The <code>BLX</code> instruction should be identified because it has <code>cond=0xF</code>, but this code checks for <code>cond=0x0</code> instead (<code>EQ</code>).<br />
<br />
This bug will thus cause all relocated <code>BLEQ</code> instructions to turn into <code>BEQ</code> instructions - fortunately, this has no consequence because the instructions are equivalent.<br />
<br />
However, and most importantly, it also results in some <code>BLX</code> instructions not being properly relocated (as <code>H</code> is not set/cleared when it should). One of three scenarios happens when a <code>BLX</code> is "relocated":<br />
* <code>H</code> has the correct value: everything goes fine<br />
* <code>H</code> is set but should be clear: <code>BLX</code> will skip the first instruction of the target function<br />
* <code>H</code> is clear but should be set: <code>BLX</code> will jump to the one instruction right before the target function's start<br />
<br />
When an improperly relocated <code>BLX</code> is executed, the program may end crashing (e.g. UNDEFINED abort), behave unexpectedly (function doesn't actually run, argument is corrupted, etc) or appear to work properly depending on the exact situation.<br />
<br />
This bug exists since at least firmware 0.920 and has never been fixed. It is plausible it exists since an earlier (or even the first) revision of the OS.<br />
<br />
=== sceVfsMount deadlock bug ===<br />
<br />
When trying to mount a file system (vfs type 2) with sceVfsMount, if you set a regular file to <code>SceVfsMountParam->pVfsMount2->blockdevName</code> or <code>SceVfsMountParam->pVfsMount2->blockdevNameNoPart</code> instead of <code>SceVfsMountParam->blockdevName</code>, sceVfsMount returns 0x80010016 and the function is seems error successfully.<br />
<br />
However, vfs_get_devfile_vnode called by sceVfsMount checks the vnode attribute (0x2000) and fails, but at this time, it returns to sceVfsMount without releasing some of the vnodes, seems causing a deadlock when the system suspends.<br />
<br />
=== ScePfsMgr cannot read files larger than 0xFFFF8000 bytes ===<br />
<br />
Discovered on 2023-12-12.<br />
<br />
This was tested with sw version 3.200.<br />
<br />
If you run the following code on a file larger than 4GiB, you can "correctly" read 0xFFFF8000-bytes (4GiB - 0x8000-bytes) without error print.<br />
<br />
<source lang="C"><br />
sceIoLseek(fd, 0LL, SCE_SEEK_SET);<br />
do {<br />
res = sceIoRead(fd, buffer, 0x8000);<br />
if(res > 0){<br />
// something<br />
}<br />
} while(res > 0);<br />
<br />
if(res < 0){<br />
scceClibPrintf("sceIoRead error 0x%X\n", res);<br />
}<br />
</source><br />
<br />
However, the file should be more than 4GiB, so it's clearly a bug.<br />
<br />
Also, when run the following code, the following error log is output.<br />
<br />
<source lang="C"><br />
sceIoLseek(fd, 0x100000000LL /* 4GiB offset */, SCE_SEEK_SET);<br />
sceIoRead(fd, buffer, 0x8000);<br />
</source><br />
<br />
And the log looks like this, with `offset=0`, so it looks like some overflow is occurring.<br />
<br />
<source><br />
efile/crypt_engine_impl.c(197) _icv_gd_verify: ICV mismatch offset=0 (k=0).<br />
facade/facade.c(305) _waitfor_discard_read_packet: waitfor_crypt() r=0x80140f02.<br />
efile/crypt_engine_impl.c(306) _crypt_for_read: _issue_primitive() r=0x80140f02.<br />
facade/facade.c(410) _facade_read_pread_impl: _waitfor_discard_read_packet() r=0x80140f02.<br />
facade/facade.c(506) scePfsFacadeVfsPread: _facade_read_pread_impl() r=0x80140f02.<br />
</source><br />
<br />
== [[Kernel Boot Loader]] ==<br />
<br />
=== Out of range access in SKBL ===<br />
<br />
Discovered on 2022-01-20 by Princess of Sleeping.<br />
<br />
To decode [[ARZL]] encoded [[TrustZone]] [[SceSysmem]], [[SKBL]] maps [[Physical Memory|Compati SRAM]] (PA 0x1C000000) to [[TrustZone]] VA with a size of 2MiB. It then calls [[SKBL#sceArlzDecode]] with an improper argument, thus using glitches during decoding to exceed 2MiB will pass the size check and access outside the range of the device, so it can trigger a Data abort exception.<br />
<br />
Moreover, even if [[SKBL#sceArlzDecode]] returns an error code, it will be passed to the argument of [[SKBL#sceArlzArmFilter]] without being checked, so access for up to 0x80560201-bytes will occur.<br />
<br />
<source lang="C"><br />
if (sceKernelCpuId() == 0) {<br />
sceKernelMMUMapSections(*(void **)(param_1 + 0x60), 0x1061D007, 0xC, 0x1C000000, 0x200000 /* mapping size */, 0x1C000000);<br />
res = sceArlzDecode(0x1C000000 /* dst */, 0x1000000 /* dst max size */, &ARZL_encoded_SceSysmem[4] /* src */, NULL);<br />
size = sceArlzArmFilter(0x1C000000, res, 0);<br />
g_Tzs_SceSysmem_start_address = 0x1C000000;<br />
g_Tzs_SceSysmem_end_address = 0x1C000000 + size;<br />
}<br />
</source><br />
<br />
It is currently just a bug as no glitching has been tried and as a Data abort exception is not useful.<br />
<br />
=== Incorrect mapping size specified to <code>MapASLR</code> ===<br />
<br />
Discovered on 2023-07-25 by CreepNT. '''This bug also affects NSKBL.'''<br />
<br />
Since System Software version ?, SKBL and NSKBL randomize the virtual address of objects allocated during boot that remain mapped after KBL ends. To achieve this, the ASLR seed from [[KBL Param]] and the size of each mapping are used by the <code>MapASLR</code> routine. Along with an internal bitmap to keep track of the previously allocated virtual memory pages, it finds a virtual address aligned with <code>vsize</code> such that enough pages to fit <code>vsize</code> bytes are free after it, before marking the whole range as ''allocated''. However, the first call to <code>MapASLR</code> (for ''SceKernelL2PageTable000'') is performed with <code>vsize=0x1000</code> instead of <code>vsize=0x2000</code>. This results in an improper update of the bitmap - some virtual memory that should be considered ''allocated'' remains marked as ''free''. This bug will usually not result in any noticeable behavior because all other allocations are performed properly - in addition, all other <code>vsize</code>s are >= 0x2000 so they are more strictly aligned, thus reducing the risk of overlap. However, due to the random nature of this algorithm, it might be possible that certain ASLR seeds cause a kernel panic (in SKBL) due to two allocations overlapping (this should be caught later during Sysmem start, as the Memblock objects created to back these mappings should conflict).<br />
<br />
Probably present since ASLR was introduced in SKBL & NSKBL. Not fixed as of System Software 3.74.<br />
<br />
== Non-Secure Kernel Boot Loader (NSKBL) ==<br />
<br />
=== Null dereference in the NSKBL kernel panic handler ===<br />
<br />
(2021/06/19 by Princess of Sleeping) The kernel panic handler accesses the SceSysroot pointer, but since that pointer is set to NULL during early boot, NULL access to SceSysroot occurs.<br />
<br />
CelesteBlue: If I understood correctly, this means that as long as [[NSKBL]] is running, a non-secure [[Kernel]] panic from any cause will end up in a DABT exception at NSKBL level.<br />
<br />
CreepNT: The global SceSysroot pointer is initialized during <code>sceKernelSysrootStart</code> (soon after the MMU is brought up) and any panic after this point will not DABT.<br />
However, if a panic happens before but the MMU is disabled, since 0 is a valid (physical) address, no DABT will occur (but since bogus "Sysroot" data will be read, system may e.g. PABT if bogus data is interpreted as a function pointer).<br />
This only leaves a tiny window during which the MMU is enabled but <code>sceKernelSysrootStart</code> has not been executed where a panic will cause a DABT (but since there is basically no code in that window that can panic, a DABT should never happen because of this bug).<br />
<br />
Present in FW 3.600.011, 3.650.011.<br />
<br />
=== Out-of-bounds write in sceKernelSysrootStart ===<br />
<br />
(2023/04/25 by CreepNT)<br />
<br />
In old firmwares, during the execution of the <code>sceKernelSysrootStart</code> function, 0x80 bytes are allocated from the Sysroot heap then divided in 4 blocks of 0x20 bytes each. Each CPU then loads the address of its block into the <code>TPIDRPRW</code> register.<br />
<br />
Later on during this same function, the <code>sceKernelTlsKernelSet</code> subroutine is called - however, it expects <code>TPIDRPRW</code> to hold a pointer to a <code>ThreadCB</code> (Thread object) which is much larger than 0x20, and does the following: <code>*(uint32_t*)(TPIDRPRW + 0x74) = 0;</code>. This results in an out-of-bounds write at offsets 0x74, 0x94, 0xB4 and 0xD4 of the Sysroot heap for CPU0, CPU1, CPU2 and CPU3 respectively.<br />
<br />
However, this bug has no real consequence (and was probably never noticed) because the data at these offsets is:<br />
* 0x74: inside the TPIDRPRW block, which is unused<br />
* 0x94: inside a 0x28 bytes allocation which has not been written to yet<br />
* 0xB4: inside heap padding (all allocations are rounded up to 32/64B boundary)<br />
* 0xD4: offset 0x14 inside the <code>SceKblParam</code> structure, which is unused<br />
<br />
Exists since at least System Software version 0.920.050. Fixed in System Software 0.990 - due to a rework of the kernel TLS system, <code>sceKernelTlsKernelSet</code> was removed; thus the invalid call is no longer performed.<br />
<br />
=== Incorrect mapping size specified to <code>MapASLR</code> ===<br />
See [[Bugs#Incorrect_mapping_size_specified_to_MapASLR| the description in SKBL]].<br />
<br />
== Shell ==<br />
<br />
=== Unvalidated IPMI arguments lead to DoS ===<br />
<br />
(2023/05/31 by CreepNT, reported by M Ibrahim) At least one IPMI server (<code>SceDownload</code>) does not validate the amount of <code>IPMI::DataInfo</code> (input) or <code>IPMI::BufferInfo</code> (output) arguments received before using them. This leads to garbage being used as pointers and dereferenced, in turn crashing the SceShell process due to a Data Abort Exception.<br />
<br />
It ''might'' be possible to use this as a vector for a data-only attack on Shell.<br />
<br />
Present in firmware 3.60.</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=IdStorage&diff=20883
IdStorage
2023-12-30T18:56:12Z
<p>CreepNT: /* 0x102 */ Add DeviceNum name</p>
<hr />
<div>See also [https://playstationdev.wiki/pspdevwiki/index.php?title=IDStorage].<br />
<br />
= Description =<br />
<br />
Region of the PSVita eMMC where perconsole info is stored.<br />
<br />
= Location =<br />
<br />
Idstorage data is stored at first raw partition (code 0x1). Use [https://github.com/TeamMolecule/sceutils/blob/master/extract_idstorage.py] to extract.<br />
<br />
= Structure =<br />
<br />
The IdStorage partition is divided in two parts: the mapping table and the leaves.<br />
<br />
== Mapping table ==<br />
<br />
The mapping table is located at the start of the partition. It's an array of 16-bit leaf IDs that serves as a leaf ID->index mapping table. The mapping table must be at least one-sector wide but may be bigger.<br />
<br />
There are two leaf IDs reserved for usage in the mapping table: all entries corresponding to the mapping table (i.e. the first <code>M</code> entries for an </code>M</code> sectors sized table) must hold the value <code>0xFFF5</code>, and all unallocated leaves hold the value <code>0xFFFF</code>.<br />
<br />
To lookup a leaf index based on its ID, use the following algorithm:<br />
<source lang="C"><br />
#define M /* implementation defined */<br />
#define SECTOR_SIZE (512)<br />
<br />
#define NUM_TABLE_ITEMS ((M * SECTOR_SIZE) / sizeof(uint16_t))<br />
uint16_t g_mappingTable[NUM_TABLE_ITEMS];<br />
<br />
int leafIndexFromId(unsigned id) {<br />
if (id >= 0xFFF0)<br />
return /* ERROR: invalid leaf ID */;<br />
<br />
for (int i = 0; i < NUM_TABLE_ITEMS; i++) {<br />
if (g_mappingTable[i] == id)<br />
return i;<br />
}<br />
return /* ERROR: leaf ID is not in mapping table */;<br />
}<br />
</source><br />
<br />
== Leaves ==<br />
<br />
Leaves are sector-sized (512 bytes) areas in the IdStorage partition used to store arbitrary data. While the data stored may be smaller, a leaf always occupies one sector in the partition.<br />
<br />
To read a leaf's data, obtain the leaf index (this can be known directly, or obtained from a leaf ID using the previously mentioned algorithm) then read 512 bytes starting at offset <code>512 * leafIndex</code> in the IdStorage partition.<br />
<br />
== Limits ==<br />
<br />
The number of leaves that can be stored in an IdStorage partition is limited by three factors: the size of the partition, the size of the mapping table and the size of leaf IDs.<br />
<br />
* An <code>M</code> sectors wide mapping table can hold up to <code>255 * M</code> leaves<br />
** This is because a single-sector mapping table can reference <code>SECTOR_SIZE/sizeof(u16) - 1 = 255</code> leaves (the <code>- 1</code> is needed because a table consumes one entry for itself)<br />
* A <code>P</code> sectors wide partition can hold up to <code>P - M</code> leaves<br />
** This is because leaves are sector-sized, and the mapping table consumes <code>M</code> sectors<br />
* There are 65520 leaf IDs available<br />
** While an unsigned 16-bit variable can hold 65536 values, IDs superior or equal to 0xFFF0 are reserved and cannot be used<br />
<br />
From this, we can conclude that an IdStorage partition of <code>P</code> sectors with an <code>M</code> sectors mapping table can hold up to <code>min(255*M, P-M, 65520)</code> leaves. We can also deduce an IdStorage partition is optimally shaped (no space is non-allocatable) when <code>P = 256 * M</code>.<br />
<br />
On Vita, the IdStorage partition is 512KiB and 32 sectors are reserved for the indexing table (<code>P = 1024, M = 32</code>, a non-optimal choice), which means the console's partition can hold '''up to 992 IdStorage leaves'''.<br />
<br />
= Leaf content =<br />
<br />
In this section, the following conventions and terms are used:<br />
* Empty: area has all bits set to 1 (i.e., 0xFF)<br />
* Present / Not present: the leaf exists in IdStorage partition<br />
* The content of a leaf always starts at offset 0.<br />
* If leaf contents are smaller than 512 bytes, the unused parts are left empty.<br />
* Strings are padded with NUL bytes if the content is smaller than maximum size, but may be non-NUL terminated<br />
<br />
Leaves not listed in this section have not been found in any unit, and leaves listed in this section are not all found in every unit.<br />
<br />
The following information may not be valid for all pre-production units (DEM/CEM).<br />
<br />
== Idps certificates ==<br />
<br />
Leaves 0x000~0x07F are written to IdStorage during manufacturing by a function called '''<code>_writeIdpsCert</code>'''.<br />
<br />
Leaf 0x07E contains the signed SHA-256 digest of leaves 0x000~0x07D (signed using RSA-2048). The public key used for signature verification can be found in <code>factTest.self</code>.<br />
<br />
Leaf 0x07F is not covered by the signature but is flashed in <code>_writeIdpsCert</code> nonetheless.<br />
<br />
=== Empty leaves ===<br />
<br />
The following leaves have always been observed to only contain zeroes:<br />
* 0x008~0x01F<br />
* 0x028~0x03F<br />
* 0x050~0x07D<br />
* 0x7F<br />
<br />
=== 0x000~0x007 - SceIdStoragePspCertificates ===<br />
<br />
Identical across all units and duplicated in leaves 0x020 to 0x027.<br />
<br />
=== 0x040~0x047 - SceIdStoragePsp2Certificates ===<br />
<br />
Console-unique.<br />
<br />
=== 0x048~0x04F ===<br />
<br />
Console-unique. May be certificate(s).<br />
<br />
=== 0x07E ===<br />
<br />
Console-unique.<br />
<br />
The RSA-2048 signature of the Idps certificates (2048 bits/256 bytes) is located at offset 0x60 of this leaf.<br />
<br />
Data contained between 0x0 and 0x5F is unknown, and data between 0x160 and 0x1FF is unused (always 00).<br />
<br />
== 0x80 - SMI ==<br />
<br />
Service / Manufacturing Information (SMI)<br />
<br />
Console-unique. Contains minimal firmware version (checked in [[Second Loader|<code>second_loader</code>]]).<br />
<br />
<source lang="c"><br />
struct SMILeaf {<br />
uint8_t magic[4]; //'SMI\0'<br />
uint32_t version; //1<br />
uint32_t min_fwv; //Minimal firmware version<br />
uint8_t unused[0x80 - 0xC];<br />
//Encrypted with per-console keys.<br />
//This is used to verify the leaf has not been modified.<br />
uint8_t encrypted_data[0x200 - 0x80];<br />
};<br />
</source><br />
<br />
== 0x100 ==<br />
<br />
Name may be <code>Idlog</code>.<br />
<br />
Console-unique. Two strings related to manufacturing.<br />
<br />
Both strings are 0x100 bytes wide; one starts at offset 0 and one at offset 0x100.<br />
<br />
The string at offset 0x100 is written at a different stage (end of manufacturing?) than the string at offset 0, so it is possible to find units with only first string written (e.g., a Dolphin CEM-3000 unit).<br />
<br />
== 0x102 ==<br />
<br />
Console-unique. Per-console factory/service product information.<br />
<br />
<source lang="c"><br />
typedef struct {<br />
u32 server_ip;<br />
u16 server_port;<br />
u8 netmask; //Number of '1' bits in netmask<br />
u8 unused;<br />
u32 client_ip;<br />
u32 defaultGW;<br />
} conn_param;<br />
<br />
struct Leaf0x102 {<br />
u32 unk0;<br />
u32 unk4;<br />
struct {<br />
u8 id;<br />
u8 state;<br />
} ProcessId[0x20];<br />
char gcpId[0x20];<br />
char productId[0x20];<br />
//The following fields indicate the number of X present in unit<br />
struct {<br />
u8 ComNum; //Com (3G module)<br />
u8 WlanNum; //Ethernet is also counted in here, despite field name<br />
u8 BtNum; //Bluetooth<br />
u8 BatteryNum;<br />
u8 HdmiNum;<br />
u8 CpNum; //Communication Processor<br />
struct { //Guessed field names<br />
u8 Front;<br />
u8 Back;<br />
} CameraNum;<br />
struct { //Guessed field names<br />
u8 Front;<br />
u8 Back;<br />
} TouchNum;<br />
u8 SixSenseNum; //Gyro<br />
u8 EMagNum; //Magnetometer / Compass<br />
u8 GpsNum;<br />
u8 AnaDevNum; //a.k.a. Analog Pad (AP) or Joystick<br />
u8 DisplayNum;<br />
u8 SimNum; //SIM slot<br />
} DeviceNum;<br />
u8 SimPackNum; //Prepaid SIM card<br />
u8 ComType;<br />
u8 unused_9A[14];<br />
u32 contentsVer; //spkgInfo.version from sceSblUsGetSpkgInfo(0x18)<br />
u8 unk_AC[4];<br />
u8 unk_B0;<br />
u8 unused_B1[0x7];<br />
u8 unk_B8;<br />
u8 unused_B9[3];<br />
conn_param conn_param_0; //For WLAN test?<br />
conn_param conn_param_1; //For Ethernet test?<br />
char ssid[0x20]; //SSID of AP used for WLAN test<br />
u8 test_bt_addr[6]; //Bluetooth MAC address for BT test<br />
u8 unused_106[2];<br />
char ImeiBarcode[32];<br />
char PartsNoBardcode[16];<br />
char Imsi[16];<br />
char IccId[20];<br />
u8 unused_15C[4];<br />
<br />
//Version of the software executed on the unit<br />
//during manufacturing. Each element of the array<br />
//corresponds to a different program.<br />
u32 softVer[3];<br />
u8 unused_16C[4];<br />
struct {<br />
char essid[12];<br />
u8 channel;<br />
} WlanTestApInfo;<br />
u8 unused_17D[3];<br />
u16 WlanRssi;<br />
u8 unused_182[6];<br />
<br />
//Obtained from sceSblUsGetSpkgInfo(0x1C), which<br />
//corresponds to preinstall data patch Spkg.<br />
//First 4 bytes = spkgInfo.version<br />
//Fifth byte = spkgInfo.status[1]<br />
u8 CustomThemeVersion[5];<br />
u8 unused_18D[3];<br />
<br />
//If set, clears itself at some point during<br />
//factTest and skips something<br />
u8 ConfigProcessJumpFlag;<br />
u8 unused_191[111];<br />
};<br />
</source><br />
<br />
== 0x103 ==<br />
<br />
Console-unique. Unit hardware information.<br />
<br />
{| class="wikitable" style="text-align:center"<br />
|-<br />
! Offset<br />
! Size<br />
! Name<br />
! Description<br />
|-<br />
| 0x000<br />
| 0x4<br />
| ErnieHwInfo<br />
| style="text-align:left;" | [[KBL_Param#Hardware_Info|Ernie (Syscon) Hardware Information]]<br />
|-<br />
| 0x004<br />
| 0x4<br />
| ErnieFwVersion<br />
| style="text-align:left;" | [[SceSyscon#sceSysconGetErnieVersionForDriver|Ernie Firmware Version]] (also called Ernie Verison)<br />
|-<br />
| 0x008<br />
| 0x4<br />
| ErnieDlVersion<br />
| style="text-align:left;" | [[SceSyscon#sceSysconGetErnieDLVersionForDriver|ErnieDlVersion]]<br />
|-<br />
| 0x00C<br />
| 0x2<br />
| ErnieCfgVersion<br />
| style="text-align:left;" | Obtained from <code>scePdPowerGetConfigStorageInfo</code>. Part of the [[Syscon]] "ConfZZ" header.<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x00E<br />
| 0x12<br />
| colspan="2" | Empty<br />
|-<br />
| 0x020<br />
| 0x8<br />
| EmmcFwVersion<br />
| style="text-align:left;" | Vendor ID (1 byte), empty space (1 byte) and Device Version (6 bytes)<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x028<br />
| 0x8<br />
| colspan="2" | Empty<br />
|-<br />
| 0x030<br />
| 0x8<br />
| EmmcFwVersion2<br />
| style="text-align:left;" | Vendor ID (1 byte), Device Version (6 bytes) and an additional byte (for Samsung eMMC, 0 otherwise)<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x038<br />
| 0x8<br />
| colspan="2" | Empty<br />
|-<br />
| 0x040<br />
| 0x2<br />
| ElmoFWVer<br />
| style="text-align:left;" | [[SceSyscon#sceSysconGetElmoFwVersionForDriver|Elmo Firmware Version]]<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x042<br />
| 0x1E<br />
| colspan="2" | Empty<br />
|-<br />
| 0x060<br />
| 0x2<br />
| CookieFWVer<br />
| style="text-align:left;" | [[SceSyscon#sceSysconGetCookieFwVersionForDriver|Cookie Firmware Version]]<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x062<br />
| 0x1E<br />
| colspan="2" | Empty<br />
|-<br />
| 0x080<br />
| 0x2<br />
| BarkleyFwVersion<br />
| rowspan="2" style="text-align:left;" | [[SceSyscon#sceSysconMotionGetDeviceInfoForDriver|Motion Device]] Firmware Version/Hardware Information<br />
|-<br />
| 0x082<br />
| 0x2<br />
| BarkleyHwInfo<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x084<br />
| 0x1C<br />
| colspan="2" | Empty<br />
|-<br />
| 0x0A0<br />
| 0x2<br />
| AbbyHWVersion<br />
| rowspan="3" style="text-align:left;" | [[SceSyscon#sceSysconGetBatteryVersionForDriver|Abby HW/FW/DF Version]]<br />
|-<br />
| 0x0A2<br />
| 0x2<br />
| AbbyFWVersion<br />
|-<br />
| 0x0A4<br />
| 0x2<br />
| AbbyDFVersion<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x0A6<br />
| 0x02<br />
| colspan="2" | Empty<br />
|-<br />
| 0x0A8<br />
| 0x02<br />
| BatteryVoltageCalib<br />
| rowspan="2" style="text-align:left;" | Battery calibration data (for Abby)<br />
|-<br />
| 0x0AA<br />
| 0x02<br />
| BatteryCurrentCalib<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x0AC<br />
| 0x14<br />
| colspan="2" | Empty<br />
|-<br />
| 0x0C0<br />
| 0x8<br />
| TouchpanelFWVersion<br />
| style="text-align:left;" | [[SceSyscon#sceSysconGetTouchpanelDeviceInfoForDriver|Touchpanel Version info]] (4 <code>u16</code>s)<br />
|-<br />
| 0x0C8<br />
| 0x4<br />
| TouchpanelConfigVersion<br />
| style="text-align:left;" | 2 <code>u16</code>s<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x0CC<br />
| 0x4<br />
| colspan="2" | Empty<br />
|-<br />
| 0x0D0<br />
| 0x10<br />
| TouchpanelLotInfo<br />
| style="text-align:left;" | 8 bytes for each panel<br />
|-<br />
| 0x0E0<br />
| 0x4<br />
| WlanBtHWRevision<br />
| style="text-align:left;" | WLAN/Bluetooth Hardware Revision<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x0E4<br />
| 0x4<br />
| colspan="2" | Empty<br />
|-<br />
| 0x0E8<br />
| 0x6<br />
| WlanMacAddress<br />
| style="text-align:left;" | WLAN MAC Address<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x0EE<br />
| 0x2<br />
| colspan="2" | Empty<br />
|-<br />
| 0x0F0<br />
| 0x6<br />
| BtMacAddress<br />
| style="text-align:left;" | Bluetooth MAC Address (usually equal to WlanMacAddress + 1)<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x0F6<br />
| 0xA<br />
| colspan="2" | Empty<br />
|-<br />
| 0x100<br />
| 0x20<br />
| BatteryLotInfo<br />
| style="text-align:left;" | ASCII string<br />
|-<br />
| 0x120<br />
| 0x84<br />
| <br />
| style="text-align:left;" | An ASCII string containing a date.<br />
|-<br />
| 0x184<br />
| 0x10<br />
| OLEDLotInfo<br />
| style="text-align:left;" | ASCII string<br />
|-<br />
| 0x194<br />
| 0x10<br />
| <br />
| style="text-align:left;" | An ASCII string (usually starting with TDA).<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x1A4<br />
| 0x4<br />
| colspan="2" | Empty<br />
|-<br />
| 0x1A8<br />
| 0x20<br />
| LcdModLotInfo<br />
| style="text-align:left;" | ASCII string<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x1C8<br />
| 0x38<br />
| colspan="2" | Empty<br />
|}<br />
<br />
== 0x104 ==<br />
<br />
Console-unique. Test/diagnostic results.<br />
<br />
This leaf is only present if diagnostic software has been executed on the unit or some factory tests failed.<br />
<br />
== 0x110 - WlanRegion ==<br />
<br />
The following algorithm is used to derive it from PsCode:<br />
<source lang="c"><br />
byte WlanRegion[3]; //Leaf contains only 3 bytes of data<br />
<br />
switch(pscode.product_code) {<br />
case 0x100:<br />
case 0x101:<br />
case 0x102:<br />
case 0x104:<br />
case 0x10B:<br />
case 0x10F:<br />
case 0x110:<br />
case 0x111:<br />
WlanRegion[2] = 0;<br />
WlanRegion[1] = 7;<br />
break;<br />
case 0x103:<br />
case 0x106:<br />
case 0x108:<br />
case 0x10A:<br />
case 0x10D:<br />
case 0x10E:<br />
WlanRegion[2] = 0;<br />
WlanRegion[1] = 0x1F;<br />
break;<br />
case 0x105:<br />
case 0x107:<br />
case 0x109:<br />
case 0x10C:<br />
WlanRegion[2] = 1;<br />
WlanRegion[1] = 0x1F;<br />
break;<br />
default:<br />
goto error;<br />
}<br />
WlanRegion[0] = 0xFF;<br />
</source><br />
<br />
== 0x111 - WlanMacAddress ==<br />
<br />
Console-unique. The MAC address of the Wireless LAN adapter (6 bytes).<br />
<br />
== 0x112 - MtpSerial ==<br />
<br />
Console-unique. The serial number reported via the MTP protocol (32 UTF-16 characters).<br />
<br />
== 0x113 ==<br />
<br />
Console-unique on 3G units and empty on all others. Contains informations related to the 3G modem.<br />
<br />
== 0x114 - DeviceLocation ==<br />
<br />
Identical for all consoles of a generation (one kind for Fat, one kind for Slim, empty on PSTV).<br />
<br />
Contains four <code>struct DeviceLocation</code>s describing the location of physical devices in the unit.<br />
<br />
<source lang="c><br />
struct DeviceLocation { //size is 0x10 bytes<br />
//0x00 - Front camera<br />
//0x01 - Back camera<br />
//0x10 - Accelerometer<br />
//0x11 - Gyro<br />
uint32_t type;<br />
int32_t x;<br />
int32_t y;<br />
int32_t z;<br />
};<br />
</source><br />
<br />
The structures are usually found in the following order: Cameras followed by Motion (Acc + Gyro).<br />
<br />
There is also an unknown int32 flag at offset 0x100.<br />
<br />
== 0x115 - ProductTypeInfo ==<br />
<br />
Identical for all consoles "with same SKU". A string of 16 characters containing information about the product type.<br />
<br />
Example values:<br />
* <code>PDEL100000010000</code> (PDEL-1000)<br />
* <code>PCH01004ZAZ20000</code> (PCH-1004 - Call of Duty: Black Ops Declassified limited edition)<br />
* <code>PCH01100AA010002</code> (Crystal Black PCH-1100 - docomo carrier)<br />
* <code>PCH02000ZA120000</code> (White PCH-2000)<br />
<br />
Decomposition: <code>FFFF NNNN PPPP xxx O</code><br />
* <code>FFFF-NNNN PPPP</code> is usually printed on the product's box<br />
** <code>FFFF</code> = family (e.g., PCH, PDEL)<br />
** <code>NNNN</code> = number (e.g., 1000, 1004, 1100)<br />
** <code>PPPP</code> = variant code (e.g., 0001, ZAZ2, AA01, ZA12)<br />
* <code>xxx</code> = ? (always 000?)<br />
* <code>O</code> = Product target operator (carrier ID for 3G models - usually matches offset 0x88 of leaf 0x113 on SIM-locked models).<br />
** 1: US operator<br />
** 2: JP operator<br />
** 3: EU generic<br />
** 4: Asia generic<br />
** 5: Canada operator<br />
** 6: Mexico generic<br />
<br />
== 0x116 - ColorVariation ==<br />
<br />
Used for wave color by SceShell if present. ([https://github.com/Princess-of-Sleeping/psp2wpp/blob/master/src/main.c#L441-L467 Patch example])<br />
<br />
<source lang="c"><br />
struct ColorVariation {<br />
uint8_t unk0;<br />
uint16_t unk1; //maybe just two uint8_t?<br />
uint8_t unk3;<br />
/* rest of the leaf is empty */<br />
};<br />
</source><br />
<br />
Example values:<br />
* Call of Duty: Black Ops Declassified limited edition PCH-1004: <code>{ 0x01, 0x0000, 0x00 }</code><br />
* Glacier White PCH-2000 / White PSTV: <code>{ 0x01, 0x000C, 0x00 }</code><br />
<br />
== 0x117 - TemperatureThreashold ==<br />
<br />
The typo in this leaf's name is present in SCE code.<br />
<br />
Contains 4 elements of 1 byte each, which are always all zeroes when the leaf is present.<br />
<br />
Sent to Syscon?<br />
<br />
== 0x118 - AudioParam ==<br />
<br />
1 byte. If set to 0 (or the leaf is absent?), AVLS is never forcefully enabled.<br />
<br />
Should be 0x0 except on units with PsCode Product Code 0x105 (Europe/East/Africa), 0x107 (Great Britain/United Kingdom) or 0x109 (Australia/New Zealand).<br />
<br />
== 0x119 - EtherMacAddress ==<br />
<br />
Console-unique. The MAC address of the Ethernet adapter (6 bytes).<br />
<br />
Empty or not present for non-PSTV units.<br />
<br />
== 0x11A - WebBrowserParam ==<br />
<br />
1 byte.<br />
<br />
Seen:<br />
0x02 on PCH200X, 0x11 on PSTV<br />
<br />
Should be 0x1 on Fat CEX/DEX, 0x2 on Slim, 0x11 on PSTV and 0x0 on all other units.<br />
<br />
== 0x11B - ShutterParam ==<br />
<br />
1 byte. When leaf is present and contains 0x01, the value returned by <code>sceAVConfigGetShutterVol()</code> changes from 30 to 26.<br />
<br />
Seen: 0x01 on PCH200X, 0x00 on PSTV.<br />
<br />
Should be 0x1 on Slim units and 0x0 on all others.<br />
<br />
== 0x11C - LedInfoParam ==<br />
<br />
1 byte.<br />
<br />
Seen: 0x01 on PCH200X, 0x00 on PSTV<br />
<br />
Should be 0x1 on Slim units and 0x0 on all others.</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=SceSblUpdateMgr&diff=20882
SceSblUpdateMgr
2023-12-27T20:50:41Z
<p>CreepNT: /* Types */ Fix fields of SceSblUsSpkgInfo</p>
<hr />
<div>See also [[Updater]]. This module performs many platform checks.<br />
<br />
== Module ==<br />
<br />
This module exists only in the non-secure kernel. The SELF can be found in <code>bootfs:update_mgr.skprx</code>.<br />
<br />
{| class="wikitable"<br />
! Version !! World !! Privilege<br />
|-<br />
| 0.931-3.740.011 || Non-secure || Kernel<br />
|}<br />
<br />
== Libraries ==<br />
<br />
=== Known NIDs ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! Name !! World !! Visibility !! NID<br />
|-<br />
| 0.931-1.692.000 || SceSblUpdateMgrForKernel || Non-secure || Kernel || 0xC4466E48<br />
|-<br />
| 0.931-1.692.000 || SceSblUpdateMgrForDriver || Non-secure || Kernel || 0x0E04CD3D<br />
|-<br />
| 0.931-3.740.011 || SceSblSsUpdateMgr || Non-secure || User || 0x31406C49<br />
|-<br />
| 0.990-1.692.000 || SceSblSsUpdateMgrAdditional || Non-secure || User || 0xBDD7A86F<br />
|}<br />
<br />
== Types ==<br />
<br />
<source lang="C"><br />
typedef char SceUpdateMode;<br />
<br />
typedef struct SceSblUsSpkgInfo { // Size is 0x10 on FW 0.931-0.990<br />
SceSize size; // size of this structure<br />
uint32_t version;<br />
uint8_t status[4];<br />
int reserved2;<br />
} SceSblUsSpkgInfo;<br />
<br />
typedef struct SceKernelSpackageArgs { // Size is 0x2C on FW 0.931<br />
SceSize arg_size; // Size of this structure<br />
SceUInt32 package_type;<br />
void *addr;<br />
SceSize size;<br />
SceUInt32 flags;<br />
char unk[0x8];<br />
SceUInt32 seq_no;<br />
SceUInt32 result;<br />
SceUInt32 progress;<br />
SceUInt32 written_rates;<br />
} SceKernelSpackageArgs;<br />
</source><br />
<br />
== SceSblUpdateMgrForKernel ==<br />
<br />
SceSblUpdateMgrForKernel functions and NIDs are exactly identical to SceSblUpdateMgrForDriver.<br />
<br />
== SceSblUpdateMgrForDriver ==<br />
<br />
=== sceSblUsVerifyPupForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-1.692.000 || 0xD593D613<br />
|}<br />
<br />
<source lang="C">int sceSblUsVerifyPupForDriver(const char *path);</source><br />
<br />
=== sceSblUsVerifyPupHeaderForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-1.692.000 || 0xBAFCA304<br />
|}<br />
<br />
<source lang="C">int sceSblUsVerifyPupHeaderForDriver(const char *path);</source><br />
<br />
=== sceSblUsVerifyPupSegmentForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-1.692.000 || 0xF43372C4<br />
|}<br />
<br />
<source lang="C">int sceSblUsVerifyPupSegmentForDriver(const char *path);</source><br />
<br />
=== sceSblUsVerifyPupSegmentByIdForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-1.692.000 || 0xB4AC7684<br />
|}<br />
<br />
<source lang="C">int sceSblUsVerifyPupSegmentByIdForDriver(const char *path, void *arg2, int seg_id, int arg4);</source><br />
<br />
=== sceSblUsVerifyPupWatermarkForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-1.692.000 || 0xDD90C4B9<br />
|}<br />
<br />
<source lang="C">int sceSblUsVerifyPupWatermarkForDriver(const char *path);</source><br />
<br />
=== sceSblUsUpdateSpackageForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-1.692.000 || 0xF41138F1<br />
|}<br />
<br />
<source lang="C">int sceSblUsUpdateSpackageForDriver(int package_type, void *kaddr, SceSize size, uint32_t flags, int *pRequestId);</source><br />
<br />
=== sceSblUsInspectSpackageForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-1.692.000 || 0xE7F5A4C0<br />
|}<br />
<br />
<source lang="C">int sceSblUsInspectSpackageForDriver(int package_type, void *kaddr, SceSize size, uint32_t flags, int *pRequestId);</source><br />
<br />
=== sceSblUsExtractSpackageForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-1.692.000 || 0x87AC6E73<br />
|}<br />
<br />
<source lang="C">int sceSblUsExtractSpackageForDriver(int package_type, void *kaddr, SceSize size, uint32_t flags, int *pRequestId);</source><br />
<br />
=== sceSblUsAllocateBufferForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-1.692.000 || 0x2D69BFDC<br />
|}<br />
<br />
<source lang="C">int sceSblUsAllocateBufferForDriver(SceSize size, void **kaddr);</source><br />
<br />
=== sceSblUsReleaseBufferForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-1.692.000 || 0x45B91736<br />
|}<br />
<br />
<source lang="C">int sceSblUsReleaseBufferForDriver(void *kaddr);</source><br />
<br />
=== sceSblUsGetStatusForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-1.692.000 || 0x99D57D18<br />
|}<br />
<br />
<source lang="C">int sceSblUsGetStatusForDriver(int node_type, int requestId, uint32_t *seq_no, uint32_t *result, uint32_t *progress, uint32_t *written_rates);</source><br />
<br />
=== sceSblUsGetSpkgInfoForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-1.692.000 || 0xAE7D3BF5<br />
|}<br />
<br />
<source lang="C">int sceSblUsGetSpkgInfoForDriver(int package_type, SceSblUsSpkgInfo *pInfo);</source><br />
<br />
=== sceSblUsGetUpdateModeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-1.692.000 || 0xEEC71CCC<br />
|}<br />
<br />
Get UpdateMode from [[Ernie#NVS|Ernie NVS]].<br />
<br />
<source lang="C">int sceSblUsGetUpdateModeForDriver(SceUpdateMode *mode);</source><br />
<br />
=== sceSblUsSetUpdateModeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-1.692.000 || 0x266820E9<br />
|}<br />
<br />
Set UpdateMode to [[Ernie#NVS|Ernie NVS]].<br />
<br />
<source lang="C">int sceSblUsSetUpdateModeForDriver(SceUpdateMode mode);</source><br />
<br />
=== SceSblUpdateMgrForDriver_6ACEF44D ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-1.692.000 || 0x6ACEF44D<br />
|}<br />
<br />
Only returns 0.<br />
<br />
<source lang="C">int SceSblUpdateMgrForDriver_6ACEF44D(void);</source><br />
<br />
=== sceSblUsPowerControlForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-1.692.000 || 0x64ECC81A<br />
|}<br />
<br />
<source lang="C">int sceSblUsPowerControlForDriver(int mode, int flag);</source><br />
<br />
=== sceSblUsGetApplicableVersionForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-1.692.000 || 0x7CC73839<br />
|}<br />
<br />
<source lang="C"><br />
// type must be 1 or 9 else "builtin revoke list cannot be found"<br />
int sceSblUsGetApplicableVersionForDriver(int type, void *versionBuf);<br />
</source><br />
<br />
=== SceSblUpdateMgrForDriver_C8D235C4 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.996.090-1.692.000 || 0xC8D235C4<br />
|}<br />
<br />
== SceSblSsUpdateMgrAdditional ==<br />
<br />
This library was not present on FW 0.931, and was removed since FW 1.80. Its functions were moved to SceSblSsUpdateMgr library.<br />
<br />
=== sceSblUsInformUpdateStartedForUser ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990-1.692.000 || 0x1E40A14E<br />
|}<br />
<br />
Example of value for unk_number: 300.<br />
<br />
<source lang="C">int sceSblUsInformUpdateStartedForUser(SceUInt32 nTask, int unk_number, const char *message, SceSize messageLength);</source><br />
<br />
=== sceSblUsInformUpdateOngoingForUser ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990-1.692.000 || 0x3A917CCE<br />
|}<br />
<br />
<source lang="C">int sceSblUsInformUpdateOngoingForUser(SceUInt32 nTask, SceUInt32 percentage);</source><br />
<br />
=== sceSblUsInformUpdateFinishedForUser ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990-1.692.000 || 0x4734B987<br />
|}<br />
<br />
<source lang="C">int sceSblUsInformUpdateFinishedForUser(SceUInt32 nTask, const char *message, SceSize messageLength);</source><br />
<br />
=== sceSblUsSetSwInfoIntForUser ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990-1.692.000 || 0xA870D285<br />
|}<br />
<br />
Example of (name, value) couples:<br />
<pre><br />
("SdkVersion", 0x1692000)<br />
("ScVersion", ?).<br />
</pre><br />
<br />
<source lang="C">int sceSblUsSetSwInfoIntForUser(const char *name, SceSize nameLength, SceUInt32 value);</source><br />
<br />
=== sceSblUsSetSwInfoStrForUser ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990-1.692.000 || 0x8C7255C8<br />
|}<br />
<br />
Example of (name, value) couples:<br />
<pre><br />
SysRevision: "sys-revision"<br />
SysBuildNumber: "sys-build-number"<br />
VshRepository: "vsh-repository-path"<br />
VshRevision: "vsh-revision"<br />
VshBuildNumber: "vsh-build-number"<br />
</pre><br />
<br />
<source lang="C">int sceSblUsSetSwInfoStrForUser(const char *name, SceSize nameLength, const char *value, SceSize valueLength);</source><br />
<br />
=== sceSblUsSetSwInfoBinForUser ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990-1.692.000 || 0xF157E34A<br />
|}<br />
<br />
<source lang="C">int sceSblUsSetSwInfoBinForUser(const char *name, SceSize nameLength, const void *value, SceSize valueLength);</source><br />
<br />
== SceSblSsUpdateMgr ==<br />
<br />
=== sceSblUsGetUpdateModeForUser ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-3.740.011 || 0x8E834565<br />
|}<br />
<br />
Temp name was sceSblSsUpdateMgrGetBootMode.<br />
<br />
Get UpdateMode from [[Ernie#NVS|Ernie NVS]].<br />
<br />
<source lang="C">int sceSblUsGetUpdateModeForUser(SceUpdateMode *mode);</source><br />
<br />
=== sceSblUsSetUpdateModeForUser ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-3.740.011 || 0xC725E3F0<br />
|}<br />
<br />
Temp name was sceSblSsUpdateMgrSetBootMode.<br />
<br />
Set UpdateMode to [[Ernie#NVS|Ernie NVS]].<br />
<br />
<source lang="C">int sceSblUsSetUpdateModeForUser(SceUpdateMode mode);</source><br />
<br />
=== sceSblUsPowerControlForUser ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-3.740.011 || 0x1825D954<br />
|}<br />
<br />
Temp name was sceSblSsUpdateMgrSendCommand.<br />
<br />
<source lang="C"><br />
// Modes:<br />
// 0: reboot target and/or CP with or without CP update. flag = 2 -> reboot CP, flag = 5 -> reboot Ernie<br />
// 1: shutdown target. flag 5 = shutdown Ernie<br />
// 2: sceKernelPowerLock(0)<br />
// 3: sceKernelPowerUnlock(0)<br />
// 4: LED ON<br />
// 5: LED OFF<br />
// 6: LED INIT<br />
// 7: sceKernelPowerTick(flag)<br />
// 8: Checks if CP is enabled by DIP switch 194.<br />
<br />
int sceSblUsPowerControlForUser(int mode, int flag);<br />
</source><br />
<br />
=== sceSblUsGetSpkgInfoForUser ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-3.740.011 || 0x8E3EC2E1<br />
|}<br />
<br />
Temp name was sceSblSsUpdateMgrGetSpkgInfo.<br />
<br />
<source lang="C">int sceSblUsGetSpkgInfoForUser(int package_type, SceSblUsSpkgInfo *pInfo);</source><br />
<br />
=== sceSblUsVerifyPupForUser ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-3.740.011 || 0x6F5EDBF4<br />
|}<br />
<br />
path max len: 0x3FF bytes<br />
<br />
<source lang="C">int sceSblUsVerifyPupForUser(const char *path);</source><br />
<br />
=== sceSblUsVerifyPupAdditionalSignForUser ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990 || not present<br />
|-<br />
| 3.60-3.740.011 || 0xB19366CB<br />
|}<br />
<br />
path max len: 0x3FF bytes<br />
<br />
<source lang="C">int sceSblUsVerifyPupAdditionalSignForUser(const char *path);</source><br />
<br />
=== sceSblUsVerifyPupHeaderForUser ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.940-3.740.011 || 0x9BE17A06<br />
|}<br />
<br />
path max len: 0x3FF bytes<br />
<br />
<source lang="C">int sceSblUsVerifyPupHeaderForUser(const char *path);</source><br />
<br />
=== sceSblUsVerifyPupSegmentForUser ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-3.740.011 || 0xD47FD33E<br />
|}<br />
<br />
path max len: 0x3FF bytes<br />
<br />
<source lang="C">int sceSblUsVerifyPupSegmentForUser(const char *path, SceUInt64 segment_index);</source><br />
<br />
=== sceSblUsVerifyPupSegmentByIdForUser ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-3.740.011 || 0x95FC1A0A<br />
|}<br />
<br />
path max len: 0x3FF bytes<br />
<br />
<source lang="C">int sceSblUsVerifyPupSegmentByIdForUser(const char *path, uint64_t seg_id);</source><br />
<br />
=== sceSblUsVerifyPupWatermarkForUser ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-3.740.011 || 0xC6CDEB8D<br />
|}<br />
<br />
path max len: 0x3FF bytes<br />
<br />
<source lang="C">int sceSblUsVerifyPupWatermarkForUser(const char *path);</source><br />
<br />
=== sceSblUsUpdateSpackageForUser ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-3.740.011 || 0x6E8DDAC4<br />
|}<br />
<br />
<source lang="C">int sceSblUsUpdateSpackageForUser(int package_type, SceKernelSpackageArgs *args, int *pRequestId);</source><br />
<br />
=== sceSblUsInspectSpackageForUser ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-3.740.011 || 0x1A39F6EE<br />
|}<br />
<br />
<source lang="C">int sceSblUsInspectSpackageForUser(int package_type, SceKernelSpackageArgs *args, int *pRequestId);</source><br />
<br />
=== sceSblUsExtractSpackageForUser ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-3.740.011 || 0xC1792A1C<br />
|}<br />
<br />
<source lang="C">int sceSblUsExtractSpackageForUser(int package_type, SceKernelSpackageArgs *args, int *pRequestId);</source><br />
<br />
=== sceSblUsGetExtractSpackageForUser ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-3.740.011 || 0x4897AD56<br />
|}<br />
<br />
<source lang="C"><br />
// node_type must be 0, 1 or 2<br />
<br />
int sceSblUsGetExtractSpackageForUser(int node_type, int requestId, SceKernelSpackageArgs *args);<br />
</source><br />
<br />
=== sceSblUsAllocateBufferForUser ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-3.740.011 || 0x4C06F41C<br />
|}<br />
<br />
<source lang="C">int sceSblUsAllocateBufferForUser(SceSize size, void **uaddr);</source><br />
<br />
=== sceSblUsReleaseBufferForUser ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-3.740.011 || 0xBD677F5A<br />
|}<br />
<br />
<source lang="C">int sceSblUsReleaseBufferForUser(void *uaddr);</source><br />
<br />
=== sceSblUsGetStatusForUser ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-3.740.011 || 0xF403143E<br />
|}<br />
<br />
<source lang="C">int sceSblUsGetStatusForUser(int node_type, int requestId, SceKernelSpackageArgs *args);</source><br />
<br />
=== sceSblUsCheckSystemIntegrityForUser ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-3.740.011 || 0xBED8DFC7<br />
|}<br />
<br />
Check if the current process is system privileged.<br />
<br />
<source lang="C">SceInt32 sceSblUsCheckSystemIntegrityForUser(void);</source><br />
<br />
=== sceSblUsGetApplicableVersionForUser ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-3.740.011 || 0x3ADD4B7A<br />
|}<br />
<br />
<source lang="C"><br />
// type must be 1 or 9 else returns error "builtin revoke list cannot be found"<br />
int sceSblUsGetApplicableVersionForUser(int type, void *versionBuf);<br />
</source><br />
<br />
=== sceSblUsInformUpdateStartedForUser ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990 || not present<br />
|-<br />
| 1.000.071-3.740.011 || 0x9FC8E905<br />
|}<br />
<br />
<source lang="C">int sceSblUsInformUpdateStartedForUser(int number1, int number2, const char *str, SceSize len);</source><br />
<br />
=== sceSblUsInformUpdateOngoingForUser ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990 || not present<br />
|-<br />
| 1.000.071-3.740.011 || 0xD0CB50AC<br />
|}<br />
<br />
<source lang="C">int sceSblUsInformUpdateOngoingForUser(int number1, int number2);</source><br />
<br />
=== sceSblUsInformUpdateFinishedForUser ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990 || not present<br />
|-<br />
| 1.000.071-3.740.011 || 0x2A02DCFB<br />
|}<br />
<br />
<source lang="C">int sceSblUsInformUpdateFinishedForUser(int number, const char *str, SceSize len);</source><br />
<br />
=== sceSblUsSetSwInfoIntForUser ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990 || not present<br />
|-<br />
| 1.000.071-3.740.011 || 0x157AD4AD<br />
|}<br />
<br />
<source lang="C">int sceSblUsSetSwInfoIntForUser(char *str, SceSize len, SceUInt32 number);</source><br />
<br />
=== sceSblUsSetSwInfoStrForUser ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990 || not present<br />
|-<br />
| 1.000.071-3.740.011 || 0xFE930747<br />
|}<br />
<br />
<source lang="C">int sceSblUsSetSwInfoStrForUser(char *str1, SceSize len1, char *str2, SceSize len2);</source><br />
<br />
=== sceSblUsSetSwInfoBinForUser ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990 || not present<br />
|-<br />
| 1.000.071-3.740.011 || 0x92A8002B<br />
|}<br />
<br />
<source lang="C">int sceSblUsSetSwInfoBinForUser(char *str1, SceSize len1, char *str2, SceSize len2);</source><br />
<br />
[[Category:ARM]]<br />
[[Category:Kernel]]<br />
[[Category:Modules]]<br />
[[Category:Library]]</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=IdStorage&diff=20881
IdStorage
2023-12-27T20:48:50Z
<p>CreepNT: /* 0x102 */ Add leaf structure</p>
<hr />
<div>See also [https://playstationdev.wiki/pspdevwiki/index.php?title=IDStorage].<br />
<br />
= Description =<br />
<br />
Region of the PSVita eMMC where perconsole info is stored.<br />
<br />
= Location =<br />
<br />
Idstorage data is stored at first raw partition (code 0x1). Use [https://github.com/TeamMolecule/sceutils/blob/master/extract_idstorage.py] to extract.<br />
<br />
= Structure =<br />
<br />
The IdStorage partition is divided in two parts: the mapping table and the leaves.<br />
<br />
== Mapping table ==<br />
<br />
The mapping table is located at the start of the partition. It's an array of 16-bit leaf IDs that serves as a leaf ID->index mapping table. The mapping table must be at least one-sector wide but may be bigger.<br />
<br />
There are two leaf IDs reserved for usage in the mapping table: all entries corresponding to the mapping table (i.e. the first <code>M</code> entries for an </code>M</code> sectors sized table) must hold the value <code>0xFFF5</code>, and all unallocated leaves hold the value <code>0xFFFF</code>.<br />
<br />
To lookup a leaf index based on its ID, use the following algorithm:<br />
<source lang="C"><br />
#define M /* implementation defined */<br />
#define SECTOR_SIZE (512)<br />
<br />
#define NUM_TABLE_ITEMS ((M * SECTOR_SIZE) / sizeof(uint16_t))<br />
uint16_t g_mappingTable[NUM_TABLE_ITEMS];<br />
<br />
int leafIndexFromId(unsigned id) {<br />
if (id >= 0xFFF0)<br />
return /* ERROR: invalid leaf ID */;<br />
<br />
for (int i = 0; i < NUM_TABLE_ITEMS; i++) {<br />
if (g_mappingTable[i] == id)<br />
return i;<br />
}<br />
return /* ERROR: leaf ID is not in mapping table */;<br />
}<br />
</source><br />
<br />
== Leaves ==<br />
<br />
Leaves are sector-sized (512 bytes) areas in the IdStorage partition used to store arbitrary data. While the data stored may be smaller, a leaf always occupies one sector in the partition.<br />
<br />
To read a leaf's data, obtain the leaf index (this can be known directly, or obtained from a leaf ID using the previously mentioned algorithm) then read 512 bytes starting at offset <code>512 * leafIndex</code> in the IdStorage partition.<br />
<br />
== Limits ==<br />
<br />
The number of leaves that can be stored in an IdStorage partition is limited by three factors: the size of the partition, the size of the mapping table and the size of leaf IDs.<br />
<br />
* An <code>M</code> sectors wide mapping table can hold up to <code>255 * M</code> leaves<br />
** This is because a single-sector mapping table can reference <code>SECTOR_SIZE/sizeof(u16) - 1 = 255</code> leaves (the <code>- 1</code> is needed because a table consumes one entry for itself)<br />
* A <code>P</code> sectors wide partition can hold up to <code>P - M</code> leaves<br />
** This is because leaves are sector-sized, and the mapping table consumes <code>M</code> sectors<br />
* There are 65520 leaf IDs available<br />
** While an unsigned 16-bit variable can hold 65536 values, IDs superior or equal to 0xFFF0 are reserved and cannot be used<br />
<br />
From this, we can conclude that an IdStorage partition of <code>P</code> sectors with an <code>M</code> sectors mapping table can hold up to <code>min(255*M, P-M, 65520)</code> leaves. We can also deduce an IdStorage partition is optimally shaped (no space is non-allocatable) when <code>P = 256 * M</code>.<br />
<br />
On Vita, the IdStorage partition is 512KiB and 32 sectors are reserved for the indexing table (<code>P = 1024, M = 32</code>, a non-optimal choice), which means the console's partition can hold '''up to 992 IdStorage leaves'''.<br />
<br />
= Leaf content =<br />
<br />
In this section, the following conventions and terms are used:<br />
* Empty: area has all bits set to 1 (i.e., 0xFF)<br />
* Present / Not present: the leaf exists in IdStorage partition<br />
* The content of a leaf always starts at offset 0.<br />
* If leaf contents are smaller than 512 bytes, the unused parts are left empty.<br />
* Strings are padded with NUL bytes if the content is smaller than maximum size, but may be non-NUL terminated<br />
<br />
Leaves not listed in this section have not been found in any unit, and leaves listed in this section are not all found in every unit.<br />
<br />
The following information may not be valid for all pre-production units (DEM/CEM).<br />
<br />
== Idps certificates ==<br />
<br />
Leaves 0x000~0x07F are written to IdStorage during manufacturing by a function called '''<code>_writeIdpsCert</code>'''.<br />
<br />
Leaf 0x07E contains the signed SHA-256 digest of leaves 0x000~0x07D (signed using RSA-2048). The public key used for signature verification can be found in <code>factTest.self</code>.<br />
<br />
Leaf 0x07F is not covered by the signature but is flashed in <code>_writeIdpsCert</code> nonetheless.<br />
<br />
=== Empty leaves ===<br />
<br />
The following leaves have always been observed to only contain zeroes:<br />
* 0x008~0x01F<br />
* 0x028~0x03F<br />
* 0x050~0x07D<br />
* 0x7F<br />
<br />
=== 0x000~0x007 - SceIdStoragePspCertificates ===<br />
<br />
Identical across all units and duplicated in leaves 0x020 to 0x027.<br />
<br />
=== 0x040~0x047 - SceIdStoragePsp2Certificates ===<br />
<br />
Console-unique.<br />
<br />
=== 0x048~0x04F ===<br />
<br />
Console-unique. May be certificate(s).<br />
<br />
=== 0x07E ===<br />
<br />
Console-unique.<br />
<br />
The RSA-2048 signature of the Idps certificates (2048 bits/256 bytes) is located at offset 0x60 of this leaf.<br />
<br />
Data contained between 0x0 and 0x5F is unknown, and data between 0x160 and 0x1FF is unused (always 00).<br />
<br />
== 0x80 - SMI ==<br />
<br />
Service / Manufacturing Information (SMI)<br />
<br />
Console-unique. Contains minimal firmware version (checked in [[Second Loader|<code>second_loader</code>]]).<br />
<br />
<source lang="c"><br />
struct SMILeaf {<br />
uint8_t magic[4]; //'SMI\0'<br />
uint32_t version; //1<br />
uint32_t min_fwv; //Minimal firmware version<br />
uint8_t unused[0x80 - 0xC];<br />
//Encrypted with per-console keys.<br />
//This is used to verify the leaf has not been modified.<br />
uint8_t encrypted_data[0x200 - 0x80];<br />
};<br />
</source><br />
<br />
== 0x100 ==<br />
<br />
Name may be <code>Idlog</code>.<br />
<br />
Console-unique. Two strings related to manufacturing.<br />
<br />
Both strings are 0x100 bytes wide; one starts at offset 0 and one at offset 0x100.<br />
<br />
The string at offset 0x100 is written at a different stage (end of manufacturing?) than the string at offset 0, so it is possible to find units with only first string written (e.g., a Dolphin CEM-3000 unit).<br />
<br />
== 0x102 ==<br />
<br />
Console-unique. Per-console factory/service product information.<br />
<br />
<source lang="c"><br />
typedef struct {<br />
u32 server_ip;<br />
u16 server_port;<br />
u8 netmask; //Number of '1' bits in netmask<br />
u8 unused;<br />
u32 client_ip;<br />
u32 defaultGW;<br />
} conn_param;<br />
<br />
struct Leaf0x102 {<br />
u32 unk0;<br />
u32 unk4;<br />
struct {<br />
u8 id;<br />
u8 state;<br />
} ProcessId[0x20];<br />
char gcpId[0x20];<br />
char productId[0x20];<br />
//The following fields indicate the number of X present in unit<br />
u8 ComNum; //Com (3G module)<br />
u8 WlanNum; //Ethernet is also counted in here, despite field name<br />
u8 BtNum; //Bluetooth<br />
u8 BatteryNum;<br />
u8 HdmiNum;<br />
u8 CpNum; //Communication Processor<br />
struct { //Guessed field names<br />
u8 Front;<br />
u8 Back;<br />
} CameraNum;<br />
struct { //Guessed field names<br />
u8 Front;<br />
u8 Back;<br />
} TouchNum;<br />
u8 SixSenseNum; //Gyro<br />
u8 EMagNum; //Magnetometer / Compass<br />
u8 GpsNum;<br />
u8 AnaDevNum; //a.k.a. Analog Pad (AP) or Joystick<br />
u8 DisplayNum;<br />
u8 SimNum; //SIM slot<br />
u8 SimPackNum; //Prepaid SIM card<br />
u8 ComType;<br />
u8 unused_9A[14];<br />
u32 contentsVer; //spkgInfo.version from sceSblUsGetSpkgInfo(0x18)<br />
u8 unk_AC[4];<br />
u8 unk_B0;<br />
u8 unused_B1[0x7];<br />
u8 unk_B8;<br />
u8 unused_B9[3];<br />
conn_param conn_param_0; //For WLAN test?<br />
conn_param conn_param_1; //For Ethernet test?<br />
char ssid[0x20]; //SSID of AP used for WLAN test<br />
u8 test_bt_addr[6]; //Bluetooth MAC address for BT test<br />
u8 unused_106[2];<br />
char ImeiBarcode[32];<br />
char PartsNoBardcode[16];<br />
char Imsi[16];<br />
char IccId[20];<br />
u8 unused_15C[4];<br />
<br />
//Version of the software executed on the unit<br />
//during manufacturing. Each element of the array<br />
//corresponds to a different program.<br />
u32 softVer[3];<br />
u8 unused_16C[4];<br />
struct {<br />
char essid[12];<br />
u8 channel;<br />
} WlanTestApInfo;<br />
u8 unused_17D[3];<br />
u16 WlanRssi;<br />
u8 unused_182[6];<br />
<br />
//Obtained from sceSblUsGetSpkgInfo(0x1C), which<br />
//corresponds to preinstall data patch Spkg.<br />
//First 4 bytes = spkgInfo.version<br />
//Fifth byte = spkgInfo.status[1]<br />
u8 CustomThemeVersion[5];<br />
u8 unused_18D[3];<br />
<br />
//If set, clears itself at some point during<br />
//factTest and skips something<br />
u8 ConfigProcessJumpFlag;<br />
u8 unused_191[111];<br />
};<br />
</source><br />
<br />
== 0x103 ==<br />
<br />
Console-unique. Unit hardware information.<br />
<br />
{| class="wikitable" style="text-align:center"<br />
|-<br />
! Offset<br />
! Size<br />
! Name<br />
! Description<br />
|-<br />
| 0x000<br />
| 0x4<br />
| ErnieHwInfo<br />
| style="text-align:left;" | [[KBL_Param#Hardware_Info|Ernie (Syscon) Hardware Information]]<br />
|-<br />
| 0x004<br />
| 0x4<br />
| ErnieFwVersion<br />
| style="text-align:left;" | [[SceSyscon#sceSysconGetErnieVersionForDriver|Ernie Firmware Version]] (also called Ernie Verison)<br />
|-<br />
| 0x008<br />
| 0x4<br />
| ErnieDlVersion<br />
| style="text-align:left;" | [[SceSyscon#sceSysconGetErnieDLVersionForDriver|ErnieDlVersion]]<br />
|-<br />
| 0x00C<br />
| 0x2<br />
| ErnieCfgVersion<br />
| style="text-align:left;" | Obtained from <code>scePdPowerGetConfigStorageInfo</code>. Part of the [[Syscon]] "ConfZZ" header.<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x00E<br />
| 0x12<br />
| colspan="2" | Empty<br />
|-<br />
| 0x020<br />
| 0x8<br />
| EmmcFwVersion<br />
| style="text-align:left;" | Vendor ID (1 byte), empty space (1 byte) and Device Version (6 bytes)<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x028<br />
| 0x8<br />
| colspan="2" | Empty<br />
|-<br />
| 0x030<br />
| 0x8<br />
| EmmcFwVersion2<br />
| style="text-align:left;" | Vendor ID (1 byte), Device Version (6 bytes) and an additional byte (for Samsung eMMC, 0 otherwise)<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x038<br />
| 0x8<br />
| colspan="2" | Empty<br />
|-<br />
| 0x040<br />
| 0x2<br />
| ElmoFWVer<br />
| style="text-align:left;" | [[SceSyscon#sceSysconGetElmoFwVersionForDriver|Elmo Firmware Version]]<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x042<br />
| 0x1E<br />
| colspan="2" | Empty<br />
|-<br />
| 0x060<br />
| 0x2<br />
| CookieFWVer<br />
| style="text-align:left;" | [[SceSyscon#sceSysconGetCookieFwVersionForDriver|Cookie Firmware Version]]<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x062<br />
| 0x1E<br />
| colspan="2" | Empty<br />
|-<br />
| 0x080<br />
| 0x2<br />
| BarkleyFwVersion<br />
| rowspan="2" style="text-align:left;" | [[SceSyscon#sceSysconMotionGetDeviceInfoForDriver|Motion Device]] Firmware Version/Hardware Information<br />
|-<br />
| 0x082<br />
| 0x2<br />
| BarkleyHwInfo<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x084<br />
| 0x1C<br />
| colspan="2" | Empty<br />
|-<br />
| 0x0A0<br />
| 0x2<br />
| AbbyHWVersion<br />
| rowspan="3" style="text-align:left;" | [[SceSyscon#sceSysconGetBatteryVersionForDriver|Abby HW/FW/DF Version]]<br />
|-<br />
| 0x0A2<br />
| 0x2<br />
| AbbyFWVersion<br />
|-<br />
| 0x0A4<br />
| 0x2<br />
| AbbyDFVersion<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x0A6<br />
| 0x02<br />
| colspan="2" | Empty<br />
|-<br />
| 0x0A8<br />
| 0x02<br />
| BatteryVoltageCalib<br />
| rowspan="2" style="text-align:left;" | Battery calibration data (for Abby)<br />
|-<br />
| 0x0AA<br />
| 0x02<br />
| BatteryCurrentCalib<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x0AC<br />
| 0x14<br />
| colspan="2" | Empty<br />
|-<br />
| 0x0C0<br />
| 0x8<br />
| TouchpanelFWVersion<br />
| style="text-align:left;" | [[SceSyscon#sceSysconGetTouchpanelDeviceInfoForDriver|Touchpanel Version info]] (4 <code>u16</code>s)<br />
|-<br />
| 0x0C8<br />
| 0x4<br />
| TouchpanelConfigVersion<br />
| style="text-align:left;" | 2 <code>u16</code>s<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x0CC<br />
| 0x4<br />
| colspan="2" | Empty<br />
|-<br />
| 0x0D0<br />
| 0x10<br />
| TouchpanelLotInfo<br />
| style="text-align:left;" | 8 bytes for each panel<br />
|-<br />
| 0x0E0<br />
| 0x4<br />
| WlanBtHWRevision<br />
| style="text-align:left;" | WLAN/Bluetooth Hardware Revision<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x0E4<br />
| 0x4<br />
| colspan="2" | Empty<br />
|-<br />
| 0x0E8<br />
| 0x6<br />
| WlanMacAddress<br />
| style="text-align:left;" | WLAN MAC Address<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x0EE<br />
| 0x2<br />
| colspan="2" | Empty<br />
|-<br />
| 0x0F0<br />
| 0x6<br />
| BtMacAddress<br />
| style="text-align:left;" | Bluetooth MAC Address (usually equal to WlanMacAddress + 1)<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x0F6<br />
| 0xA<br />
| colspan="2" | Empty<br />
|-<br />
| 0x100<br />
| 0x20<br />
| BatteryLotInfo<br />
| style="text-align:left;" | ASCII string<br />
|-<br />
| 0x120<br />
| 0x84<br />
| <br />
| style="text-align:left;" | An ASCII string containing a date.<br />
|-<br />
| 0x184<br />
| 0x10<br />
| OLEDLotInfo<br />
| style="text-align:left;" | ASCII string<br />
|-<br />
| 0x194<br />
| 0x10<br />
| <br />
| style="text-align:left;" | An ASCII string (usually starting with TDA).<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x1A4<br />
| 0x4<br />
| colspan="2" | Empty<br />
|-<br />
| 0x1A8<br />
| 0x20<br />
| LcdModLotInfo<br />
| style="text-align:left;" | ASCII string<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x1C8<br />
| 0x38<br />
| colspan="2" | Empty<br />
|}<br />
<br />
== 0x104 ==<br />
<br />
Console-unique. Test/diagnostic results.<br />
<br />
This leaf is only present if diagnostic software has been executed on the unit or some factory tests failed.<br />
<br />
== 0x110 - WlanRegion ==<br />
<br />
The following algorithm is used to derive it from PsCode:<br />
<source lang="c"><br />
byte WlanRegion[3]; //Leaf contains only 3 bytes of data<br />
<br />
switch(pscode.product_code) {<br />
case 0x100:<br />
case 0x101:<br />
case 0x102:<br />
case 0x104:<br />
case 0x10B:<br />
case 0x10F:<br />
case 0x110:<br />
case 0x111:<br />
WlanRegion[2] = 0;<br />
WlanRegion[1] = 7;<br />
break;<br />
case 0x103:<br />
case 0x106:<br />
case 0x108:<br />
case 0x10A:<br />
case 0x10D:<br />
case 0x10E:<br />
WlanRegion[2] = 0;<br />
WlanRegion[1] = 0x1F;<br />
break;<br />
case 0x105:<br />
case 0x107:<br />
case 0x109:<br />
case 0x10C:<br />
WlanRegion[2] = 1;<br />
WlanRegion[1] = 0x1F;<br />
break;<br />
default:<br />
goto error;<br />
}<br />
WlanRegion[0] = 0xFF;<br />
</source><br />
<br />
== 0x111 - WlanMacAddress ==<br />
<br />
Console-unique. The MAC address of the Wireless LAN adapter (6 bytes).<br />
<br />
== 0x112 - MtpSerial ==<br />
<br />
Console-unique. The serial number reported via the MTP protocol (32 UTF-16 characters).<br />
<br />
== 0x113 ==<br />
<br />
Console-unique on 3G units and empty on all others. Contains informations related to the 3G modem.<br />
<br />
== 0x114 - DeviceLocation ==<br />
<br />
Identical for all consoles of a generation (one kind for Fat, one kind for Slim, empty on PSTV).<br />
<br />
Contains four <code>struct DeviceLocation</code>s describing the location of physical devices in the unit.<br />
<br />
<source lang="c><br />
struct DeviceLocation { //size is 0x10 bytes<br />
//0x00 - Front camera<br />
//0x01 - Back camera<br />
//0x10 - Accelerometer<br />
//0x11 - Gyro<br />
uint32_t type;<br />
int32_t x;<br />
int32_t y;<br />
int32_t z;<br />
};<br />
</source><br />
<br />
The structures are usually found in the following order: Cameras followed by Motion (Acc + Gyro).<br />
<br />
There is also an unknown int32 flag at offset 0x100.<br />
<br />
== 0x115 - ProductTypeInfo ==<br />
<br />
Identical for all consoles "with same SKU". A string of 16 characters containing information about the product type.<br />
<br />
Example values:<br />
* <code>PDEL100000010000</code> (PDEL-1000)<br />
* <code>PCH01004ZAZ20000</code> (PCH-1004 - Call of Duty: Black Ops Declassified limited edition)<br />
* <code>PCH01100AA010002</code> (Crystal Black PCH-1100 - docomo carrier)<br />
* <code>PCH02000ZA120000</code> (White PCH-2000)<br />
<br />
Decomposition: <code>FFFF NNNN PPPP xxx O</code><br />
* <code>FFFF-NNNN PPPP</code> is usually printed on the product's box<br />
** <code>FFFF</code> = family (e.g., PCH, PDEL)<br />
** <code>NNNN</code> = number (e.g., 1000, 1004, 1100)<br />
** <code>PPPP</code> = variant code (e.g., 0001, ZAZ2, AA01, ZA12)<br />
* <code>xxx</code> = ? (always 000?)<br />
* <code>O</code> = Product target operator (carrier ID for 3G models - usually matches offset 0x88 of leaf 0x113 on SIM-locked models).<br />
** 1: US operator<br />
** 2: JP operator<br />
** 3: EU generic<br />
** 4: Asia generic<br />
** 5: Canada operator<br />
** 6: Mexico generic<br />
<br />
== 0x116 - ColorVariation ==<br />
<br />
Used for wave color by SceShell if present. ([https://github.com/Princess-of-Sleeping/psp2wpp/blob/master/src/main.c#L441-L467 Patch example])<br />
<br />
<source lang="c"><br />
struct ColorVariation {<br />
uint8_t unk0;<br />
uint16_t unk1; //maybe just two uint8_t?<br />
uint8_t unk3;<br />
/* rest of the leaf is empty */<br />
};<br />
</source><br />
<br />
Example values:<br />
* Call of Duty: Black Ops Declassified limited edition PCH-1004: <code>{ 0x01, 0x0000, 0x00 }</code><br />
* Glacier White PCH-2000 / White PSTV: <code>{ 0x01, 0x000C, 0x00 }</code><br />
<br />
== 0x117 - TemperatureThreashold ==<br />
<br />
The typo in this leaf's name is present in SCE code.<br />
<br />
Contains 4 elements of 1 byte each, which are always all zeroes when the leaf is present.<br />
<br />
Sent to Syscon?<br />
<br />
== 0x118 - AudioParam ==<br />
<br />
1 byte. If set to 0 (or the leaf is absent?), AVLS is never forcefully enabled.<br />
<br />
Should be 0x0 except on units with PsCode Product Code 0x105 (Europe/East/Africa), 0x107 (Great Britain/United Kingdom) or 0x109 (Australia/New Zealand).<br />
<br />
== 0x119 - EtherMacAddress ==<br />
<br />
Console-unique. The MAC address of the Ethernet adapter (6 bytes).<br />
<br />
Empty or not present for non-PSTV units.<br />
<br />
== 0x11A - WebBrowserParam ==<br />
<br />
1 byte.<br />
<br />
Seen:<br />
0x02 on PCH200X, 0x11 on PSTV<br />
<br />
Should be 0x1 on Fat CEX/DEX, 0x2 on Slim, 0x11 on PSTV and 0x0 on all other units.<br />
<br />
== 0x11B - ShutterParam ==<br />
<br />
1 byte. When leaf is present and contains 0x01, the value returned by <code>sceAVConfigGetShutterVol()</code> changes from 30 to 26.<br />
<br />
Seen: 0x01 on PCH200X, 0x00 on PSTV.<br />
<br />
Should be 0x1 on Slim units and 0x0 on all others.<br />
<br />
== 0x11C - LedInfoParam ==<br />
<br />
1 byte.<br />
<br />
Seen: 0x01 on PCH200X, 0x00 on PSTV<br />
<br />
Should be 0x1 on Slim units and 0x0 on all others.</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=SceExcpmgr&diff=20877
SceExcpmgr
2023-12-27T00:44:05Z
<p>CreepNT: /* SMC calls */ Add name for CDRAM SMCs</p>
<hr />
<div>SceExcpmgr is a kernel module that sets up exception handling. A version exists in both non-secure and secure worlds. In non-secure world, after the kernel is booted up, the exception handlers pointed to by VBAR all jump into code in this module.<br />
<br />
== Module ==<br />
<br />
This module exists in both non-secure and secure world. The non-secure world SELF can be found in <code>os0:kd/excpmgr.skprx</code>.<br />
<br />
{| class="wikitable"<br />
|-<br />
! Version !! World !! Privilege<br />
|-<br />
| 0.931.010-3.740.011 || Non-secure || Kernel<br />
|-<br />
| 0.931.010-1.69 || Secure || Kernel<br />
|}<br />
<br />
== Libraries ==<br />
<br />
=== Known NIDs ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! Name !! World !! Visibility !! NID<br />
|-<br />
| 0.931.010-3.610.011 || [[SceExcpmgr#SceExcpmgrForKernel|SceExcpmgrForKernel]] || Non-secure || Kernel || 0x4CA0FDD5<br />
|-<br />
| 3.630.011-3.740.011 || [[SceExcpmgr#SceExcpmgrForKernel|SceExcpmgrForKernel]] || Non-secure || Kernel || 0x1496A5B5<br />
|-<br />
| 0.931.010-1.80 || [[SceExcpmgr#SceExcpmgrForTZS|SceExcpmgrForTZS]] || Secure || Kernel || 0x8F526F35<br />
|}<br />
<br />
== Types ==<br />
<br />
<source lang="C"><br />
// All data in this structure are per-core (field_name[0] belongs to CPU0, field_name[1] to CPU1, etc)<br />
<br />
typedef struct _DBGBVC_save {<br />
SceUInt32 unk_0x00;<br />
SceUInt32 unk_0x04;<br />
SceUInt32 DBGBVR0;<br />
SceUInt32 DBGBCR0;<br />
SceUInt32 DBGBVR1;<br />
SceUInt32 DBGBCR1;<br />
SceUInt32 DBGBVR2;<br />
SceUInt32 DBGBCR2;<br />
SceUInt32 DBGBVR3;<br />
SceUInt32 DBGBCR3;<br />
SceUInt32 DBGBVR4;<br />
SceUInt32 DBGBCR4;<br />
} DBGBVC_save;<br />
<br />
typedef struct _DBGWVC_save {<br />
SceUInt32 unk_0x00;<br />
SceUInt32 unk_0x04;<br />
SceUInt32 DBGWVR0;<br />
SceUInt32 DBGWCR0;<br />
SceUInt32 DBGWVR1;<br />
SceUInt32 DBGWCR1;<br />
SceUInt32 DBGWVR2;<br />
SceUInt32 DBGWCR2;<br />
SceUInt32 DBGWVR3;<br />
SceUInt32 DBGWCR3;<br />
} DBGWVC_save;<br />
<br />
typedef struct _SceExcpmgrCB {<br />
// Incremented by the first exception handler, must be 1 when then decremented before returning from an exception.<br />
// If not, raise a nested exception kernel panic.<br />
SceUInt32 nestedExceptionCount[4];<br />
int unused[4]; // Seemingly unused<br />
void *ExcpStackTop[4]; // Stack size is 0x1000<br />
void *ExcpStackBottom[4];<br />
void *unk_0x40;<br />
DBGBVC_save *pDBGBVC_save;<br />
DBGWVC_save *pDBGWVC_save;<br />
} SceExcpmgrCB;<br />
<br />
// Exception handlers' prototype<br />
typedef void(SceExcpmgrExceptionHandler)(SceExcpmgrExceptionContext* context, SceExcpmgrExceptionHandlingCode code); //Prototype for non-zero priority handlers<br />
typedef void(SceExcpmgrPriority0ExceptionHandler)(void); //Prototype for priority 0 handlers<br />
<br />
// Parameter for the RegisterHandler/ReleaseHandler functions<br />
typedef struct __attribute__((aligned(4))) _SceExcpmgrExceptionHandlerContext {<br />
struct _SceExcpmgrExceptionHandlerContext *next; // Pointer to the next handler in the chain<br />
SceUInt32 must_be_zero; // Unused - probably required for alignement reasons<br />
// Code of the exception handler goes here.<br />
} SceExcpmgrExceptionHandlerContext;<br />
<br />
typedef struct SceArmWaypoint { //!< Size is 0x10-bytes<br />
SceUInt32 flags;<br />
SceUIntPtr prev_inst; // pc<br />
SceUIntPtr curr_inst; // target<br />
SceUInt32 event;<br />
} SceArmWaypoint;<br />
<br />
// Structure that holds the CPU's state at the moment when an exception was raised<br />
typedef struct _SceExcpmgrExceptionContext { //!< Size is 0x400 on FW 3.60<br />
SceUInt32 r0;<br />
SceUInt32 r1;<br />
SceUInt32 r2;<br />
SceUInt32 r3;<br />
SceUInt32 r4;<br />
SceUInt32 r5;<br />
SceUInt32 r6;<br />
SceUInt32 r7;<br />
SceUInt32 r8;<br />
SceUInt32 r9;<br />
SceUInt32 r10;<br />
SceUInt32 r11;<br />
SceUInt32 r12;<br />
SceUInt32 sp;<br />
SceUInt32 lr;<br />
SceUInt32 pc; // address of faulting instruction (+4)<br />
SceExcpmgrExceptionCode excode;<br />
SceUInt32 SPSR;<br />
SceUInt32 CPACR;<br />
SceUInt32 FPSCR;<br />
SceUInt32 FPEXC;<br />
SceUInt32 CONTEXTIDR;<br />
SceUInt32 TPIDRURW;<br />
SceUInt32 TPIDRURO;<br />
SceUInt32 TPIDRPRW;<br />
SceUInt32 TTBR1;<br />
SceUInt32 unused68;<br />
SceUInt32 DACR;<br />
SceUInt32 DFSR;<br />
SceUInt32 IFSR;<br />
SceUInt32 DFAR;<br />
SceUInt32 IFAR;<br />
SceUInt32 PAR;<br />
SceUInt32 TEEHBR;<br />
SceUInt32 PMCR;<br />
SceUInt32 PMCNTENSET;<br />
SceUInt32 PMCNTENSET_2; //<! Second copy of PMCNTENSET<br />
SceUInt32 PMSELR;<br />
SceUInt32 PMCCNTR;<br />
SceUInt32 PMUSERENR;<br />
SceUInt32 PMXEVTYPER0;<br />
SceUInt32 PMXEVCNTR0;<br />
SceUInt32 PMXEVTYPER1;<br />
SceUInt32 PMXEVCNTR1;<br />
SceUInt32 PMXEVTYPER2;<br />
SceUInt32 PMXEVCNTR2;<br />
SceUInt32 PMXEVTYPER3;<br />
SceUInt32 PMXEVCNTR3;<br />
SceUInt32 PMXEVTYPER4;<br />
SceUInt32 PMXEVCNTR4;<br />
SceUInt32 PMXEVTYPER5;<br />
SceUInt32 PMXEVCNTR5;<br />
SceUInt32 unusedD0;<br />
SceUInt32 unkD4; //<! Comes from SceVfpIntRegs memblock<br />
SceUInt32 DBGSCRext;<br />
SceUInt32 unusedDC[9]; <br />
SceUInt64 VFP_registers[32]; //<! Content of floating-point registers d0-d31<br />
SceArmWaypoint waypoint[0x20]; //<! Comes from SceVfpIntRegs memblock<br />
} SceExcpmgrExceptionContext;<br />
<br />
typedef enum {<br />
// For all codes != 3, calling the last handler in the chain should call sceKernelSysrootReturnFromExcpToThreadForKernel and return properly<br />
SCE_EXCPMGR_EXCEPTION_HANDLING_CODE_0 = (int16_t)0,<br />
SCE_EXCPMGR_EXCEPTION_HANDLING_CODE_1 = (int16_t)1,<br />
SCE_EXCPMGR_EXCEPTION_HANDLING_CODE_2 = (int16_t)2,<br />
// If this code reaches the last handler in the chain, calls SceDebugForKernel_082B8D6A then loops infinitely<br />
SCE_EXCPMGR_EXCEPTION_NOT_HANDLED_FATAL = (int16_t)3,<br />
SCE_EXCPMGR_EXCEPTION_HANDLING_CODE_4 = (int16_t)4<br />
} SceExcpmgrExceptionHandlingCode;<br />
<br />
typedef enum {<br />
SCE_EXCPMGR_EXCEPTION_CODE_RESET = 0, // Reset<br />
SCE_EXCPMGR_EXCEPTION_CODE_UNDEF = 1, // Undefined Instruction<br />
SCE_EXCPMGR_EXCEPTION_CODE_SVC = 2, // Supervisor Call<br />
SCE_EXCPMGR_EXCEPTION_CODE_PABT = 3, // Prefetch Abort<br />
SCE_EXCPMGR_EXCEPTION_CODE_DABT = 4, // Data Abort<br />
SCE_EXCPMGR_EXCEPTION_CODE_RESERVED = 5, // Reserved<br />
SCE_EXCPMGR_EXCEPTION_CODE_IRQ = 6, // Interrupt<br />
SCE_EXCPMGR_EXCEPTION_CODE_FIQ = 7, // Fast Interrupt<br />
} SceExcpmgrExceptionCode;<br />
<br />
typedef struct SceExcpmgrRegistersSave { // Size is at least 0x194 on FW 0.931<br />
SceUInt32 FPEXC; // -0x190<br />
SceUInt32 FPSCR; // -0x18C<br />
SceUInt32 unk_0x188; // -0x188<br />
SceUInt32 unk_0x88[64]; // -0x88<br />
SceUInt32 unk_0x84; // -0x84<br />
SceUInt32 TPIDRURO; // -0x80<br />
SceUInt32 TPIDRPRW; // -0x7C<br />
SceUInt32 unk_0x78; // -0x78<br />
SceUInt32 unk_0x74; // -0x74<br />
SceUInt32 context_id; // -0x70<br />
SceUInt32 unk_0x6C; // -0x6C<br />
SceUInt32 unk_0x68; // -0x68<br />
SceUInt32 unk_0x64; // -0x64<br />
SceUInt32 unk_0x60; // -0x60<br />
SceUInt32 unk_0x5C; // -0x5C<br />
SceUInt32 unk_0x58; // -0x58<br />
SceUInt32 unk_0x54; // -0x54<br />
SceUInt32 unk_0x50; // -0x50<br />
SceUInt32 unk_0x4C; // -0x4C<br />
SceUInt32 unk_0x48; // -0x48<br />
SceUInt32 r0; // -0x44<br />
SceUInt32 r1;<br />
SceUInt32 r2;<br />
SceUInt32 r3;<br />
SceUInt32 r4;<br />
SceUInt32 r5;<br />
SceUInt32 r6;<br />
SceUInt32 r7;<br />
SceUInt32 r8;<br />
SceUInt32 r9;<br />
SceUInt32 r10;<br />
SceUInt32 r11;<br />
SceUInt32 r12;<br />
SceUInt32 sp;<br />
SceUInt32 lr;<br />
SceUInt32 pc;<br />
SceUInt32 CPSR; // -0x4<br />
SceUInt32 unk_0; // -0x0<br />
} SceExcpmgrRegistersSave;<br />
</source><br />
<br />
== Exceptions ==<br />
<br />
At coldboot startup, VBAR is set to 0x51000000. As kernel modules are loaded, SceExcpmgr's module_bootstart updates the VBAR according to the CPU core.<br />
<br />
<code>set_vbar(sceKernelSysrootGetVbaseResetVector() + sceKernelCpuId() * 0x40);</code><br />
<br />
Note - VbaseResetVector consists of 0x120-bytes.<br />
<br />
<source lang="C"><br />
typedef struct _SceKernelVbaseResetVector { // size is 0x120-bytes on 3.60~3.74.<br />
struct {<br />
SceUInt32 instr[8];<br />
void *unk_0x20;<br />
void *unk_0x24; // seems thread stack<br />
void *unk_0x28;<br />
void *unk_0x2C;<br />
SceUInt32 padding[4];<br />
} core[4];<br />
void *handler[8];<br />
} SceKernelVbaseResetVector;<br />
</source><br />
<br />
=== Context ===<br />
<br />
If you handle with priority 0 these contexts are not applied.<br />
<br />
<source><br />
CPACR <- 0xF00000<br />
fpexc <- 0x40000000<br />
<br />
DBGBCR0 <- 0<br />
DBGBCR1 <- 0<br />
DBGBCR2 <- 0<br />
DBGBCR3 <- 0<br />
DBGBCR4 <- 0<br />
DBGBCR5 <- 0<br />
<br />
DBGWCR0 <- 0<br />
DBGWCR1 <- 0<br />
DBGWCR2 <- 0<br />
DBGWCR3 <- 0<br />
<br />
CONTEXTIDR <- 0<br />
TTBR1 <- ?<br />
CONTEXTIDR <- ? (could be restore)<br />
<br />
DACR <- 0x15450000<br />
<br />
TPIDRPRW <- 0<br />
TPIDRURO <- 0<br />
</source><br />
<br />
=== Registered exception handler by PSP2 Kernel ===<br />
<br />
{| class="wikitable mw-collapsible mw-collapsed"<br />
|-<br />
! excode<br />
! priority<br />
! module<br />
! descrption<br />
|-<br />
| rowspan="2" | Reset (0)<br />
| 7<br />
| SceExcpmgr<br />
| sceKernelDefaultHandlerReset<br />
|-<br />
<!-- | Reset (0) --><br />
| Lowest<br />
| SceExcpmgr<br />
| sceKernelDefaultHandler<br />
|-<br />
| rowspan="7" | Undef (1)<br />
| 0<br />
| SceExcpmgr<br />
| Setup the excp context.<br />
|-<br />
<!-- | Undef (1) --><br />
| 2<br />
| SceDeci4pSDfMgr<br />
| Decide whether to return to the excp point or continue with the exception after calling some callback.<br />
|-<br />
<!-- | Undef (1) --><br />
| 4<br />
| SceKernelThreadMgr<br />
| -<br />
|-<br />
<!-- | Undef (1) --><br />
| 5<br />
| SceDeci4pDbgp<br />
| Save information about the exception and continue with the exception.<br />
|-<br />
<!-- | Undef (1) --><br />
| 6<br />
| SceKernelThreadMgr<br />
| -<br />
|-<br />
<!-- | Undef (1) --><br />
| 7<br />
| SceExcpmgr<br />
| sceKernelPanicHandlerUndef<br />
|-<br />
<!-- | Undef (1) --><br />
| Lowest<br />
| SceExcpmgr<br />
| sceKernelDefaultHandler<br />
|-<br />
| rowspan="3" | Svc (2)<br />
| 0<br />
| SceKernelIntrMgr<br />
| svc handler<br />
|-<br />
<!-- | Svc (2) --><br />
| 7<br />
| SceExcpmgr<br />
| sceKernelDefaultHandlerSvc<br />
|-<br />
<!-- | Svc (2) --><br />
| Lowest<br />
| SceExcpmgr<br />
| sceKernelDefaultHandler<br />
|-<br />
| rowspan="7" | Pabt (3)<br />
| 0<br />
| SceExcpmgr<br />
| Setup the excp context.<br />
|-<br />
<!-- | Pabt (3) --><br />
| 2<br />
| SceDeci4pSDfMgr<br />
| Decide whether to return to the excp point or continue with the exception after calling some callback.<br />
|-<br />
<!-- | Pabt (3) --><br />
| 4<br />
| SceKernelThreadMgr<br />
| -<br />
|-<br />
<!-- | Pabt (3) --><br />
| 5<br />
| SceDeci4pDbgp<br />
| Save information about the exception and continue with the exception.<br>Also, if the crashed address is a specific instruction, some callbacks will be called.<br />
|-<br />
<!-- | Pabt (3) --><br />
| 6<br />
| SceKernelThreadMgr<br />
| -<br />
|-<br />
<!-- | Pabt (3) --><br />
| 7<br />
| SceExcpmgr<br />
| sceKernelDefaultHandlerPabt<br />
|-<br />
<!-- | Pabt (3) --><br />
| Lowest<br />
| SceExcpmgr<br />
| sceKernelDefaultHandler<br />
|-<br />
| rowspan="7" | Dabt (4)<br />
| 0<br />
| SceExcpmgr<br />
| Setup the excp context.<br />
|-<br />
<!-- | Dabt (4) --><br />
| 2<br />
| SceDeci4pSDfMgr<br />
| Decide whether to return to the excp point or continue with the exception after calling some callback.<br />
|-<br />
<!-- | Dabt (4) --><br />
| 4<br />
| SceKernelThreadMgr<br />
| -<br />
|-<br />
<!-- | Dabt (4) --><br />
| 5<br />
| SceDeci4pDbgp<br />
| Save information about the exception and continue with the exception.<br />
|-<br />
<!-- | Dabt (4) --><br />
| 6<br />
| SceKernelThreadMgr<br />
| -<br />
|-<br />
<!-- | Dabt (4) --><br />
| 7<br />
| SceExcpmgr<br />
| sceKernelDefaultHandlerDabt<br />
|-<br />
<!-- | Dabt (4) --><br />
| Lowest<br />
| SceExcpmgr<br />
| sceKernelDefaultHandler<br />
|-<br />
| rowspan="2" | Reserved (5)<br />
| 7<br />
| SceExcpmgr<br />
| sceKernelDefaultHandlerReserved<br />
|-<br />
<!-- | Reserved (5) --><br />
| Lowest<br />
| SceExcpmgr<br />
| sceKernelDefaultHandler<br />
|-<br />
| rowspan="3" | Irq (6)<br />
| 0<br />
| SceKernelIntrMgr<br />
| intr handler<br />
|-<br />
<!-- | Irq (6) --><br />
| 7<br />
| SceExcpmgr<br />
| sceKernelDefaultHandlerIrq<br />
|-<br />
<!-- | Irq (6) --><br />
| Lowest<br />
| SceExcpmgr<br />
| sceKernelDefaultHandler<br />
|-<br />
| Fiq (7)<br />
| Lowest<br />
| SceExcpmgr<br />
| sceKernelDefaultHandler<br />
|}<br />
<br />
=== SVC ===<br />
<br />
SVC (Supervisor Call), more commonly called [[Syscalls]] (system calls), is what allows to interact with non-secure [[Kernel]] from usermode.<br />
<br />
The SVC interface is defined in non-secure [[Kernel]] as:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Register<br />
! Value<br />
|-<br />
| R0<br />
| First argument<br />
|-<br />
| R1<br />
| Second argument<br />
|-<br />
| R2<br />
| Third argument<br />
|-<br />
| R3<br />
| Fourth argument<br />
|-<br />
| R12<br />
| Syscall number<br />
|}<br />
<br />
On return, R1-R3 and R12 are cleared to 0x0 or 0xDEADBEEF to prevent any data leaks. All usermode pointers passed to syscalls are accessed with ARM instructions LDRT and STRT for hardware forced permission checks. Syscalls 0x0 - 0xFF are likely a "fastcall" interface that do not mask interrupts or set the DACR, however currently are no such fastcalls defined. Syscalls 0x100 - 0xFFF are made with IRQ interrupts masked and DACR set to 0xFFFF0000 (to prevent access to certain memory domains). Any other syscall numbers are invalid.<br />
<br />
System calls are handled in "system" mode defined in ARMv7 (mode 0b11111).<br />
<br />
Usermode exported functions loaded by [[SceKernelModulemgr]] are exported as syscalls. The number assigned to the syscall are randomized with respect to each library but not within a library. That means, for example, two functions exported by a library will always be some syscall number apart even though that number will change on each boot.<br />
<br />
There is no SVC in secure world because all code in secure world is running as kernel.<br />
<br />
=== SMC ===<br />
<br />
SMC (Secure Monitor Call) is what allows to interact with ARM [[TrustZone]] from non-secure kernel.<br />
<br />
The SMC interface for making a non-secure kernel call to [[TrustZone]] is:<br />
{| class="wikitable"<br />
|-<br />
! Register<br />
! Value<br />
|-<br />
| R0<br />
| First argument<br />
|-<br />
| R1<br />
| Second argument<br />
|-<br />
| R2<br />
| Third argument<br />
|-<br />
| R3<br />
| Fourth argument<br />
|-<br />
| R12<br />
| SMC number<br />
|}<br />
<br />
The SMC interface is very similar to the SVC interface. The SMC handler and MVBAR is set up in [[TrustZone]] by [[#SceExcpmgrForTZS|SceExcpmgrForTZS]].<br />
<br />
0x0 - 0xFF are fast service calls. 0x100 - 0xFFF are normal service calls ran with IRQs masked.<br />
<br />
Secure services are ran in ARM system processor mode (0b11111) in [[TrustZone]].<br />
<br />
SMC calls are registered by [[SceKernelIntrMgr#SceIntrmgrForTZS|SceIntrmgrForTZS]] functions.<br />
<br />
==== SMC calls ====<br />
<br />
{| class="wikitable"<br />
|-<br />
! Number<br />
! Module<br />
! Arguments<br />
! Notes<br />
|-<br />
| 0x101<br />
|<br />
| <source lang="C">int AllocSharedMemory_S(void *pPA, SceSize size);</source><br />
| <code>SCE_MONCALL_SET_SHARED_MEMORY</code> - Sets the physical address of the shared memory area for Secure kernel<br />
|-<br />
| 0x103<br />
|<br />
| <source lang="C">int FreeSharedMemory_S(void);</source><br />
| <code>SCE_MONCALL_UNMAP_KBL</code> - Frees the allocation of virtual ranges <code>0x40000000</code>-<code>0x40100000</code>, <code>0x50000000</code>-<code>0x51000000</code> and <code>0x51000000</code>-<code>0x52000000</code> with UID 0x10007 in Secure state kernel. This does not affect Non-Secure state kernel. Called by SysStateMgr when "''Unmapping Secure KBL''".<br />
|-<br />
| 0x104<br />
|<br />
| <source lang="C">int PervasiveAccessMode(int mode, SceBool cmd);</source><br />
| cmd: 0 clear, 1 set<br />
|-<br />
| 0x105<br />
|<br />
| <source lang="C">int TASAccessMode(int mode, SceBool cmd);</source><br />
| cmd: 0 clear, 1 set<br />
|-<br />
| 0x106<br />
|<br />
| <source lang="C">int Pervasive2AccessMode(int mode, SceBool cmd);</source><br />
| cmd: 0 clear, 1 set<br />
|-<br />
| 0x107<br />
|<br />
| <source lang="C">int RegbusAccessMode(int mode, SceBool cmd);</source><br />
| cmd: 0 clear, 1 set<br />
|-<br />
| 0x10A<br />
|<br />
| <source lang="C">int GetGrabCmpMap(int index);</source><br />
| Gets GRAB Compatibility Map.<br />
|-<br />
| 0x10B<br />
|<br />
| <source lang="C">int SetGrabCmpMap(int index, int map);</source><br />
| Sets GRAB Compatibility Map.<br />
|-<br />
| 0x10C<br />
| [[SceKernelBusError]]<br />
| <source lang="C">int BusErrorDump(void);</source><br />
| Used by [[SceKernelBusError]] when a bus error is handled, just before getting bus error info. Writes bus registers to (shared memory + 0x4000).<br />
|-<br />
| 0x10D<br />
| [[SceKernelBusError]]<br />
| <source lang="C">int BusErrorDump2(void);</source><br />
| Used by [[SceKernelBusError]] when a bus error is handled, just before getting bus error info. Writes bus registers to (shared memory + 0x6000). Replacement of SMC 0x10C that writes to offset 0x6000 instead of 0x4000 and calls sceKernelDcacheCleanInvalidateRange before returning.<br />
|-<br />
| 0x10E<br />
| [[SceKernelBusError]]<br />
| <source lang="C">int BusErrorClear(void);</source><br />
| On FW 0.931, prints a tree of all bus states. On FW 3.60, does nothing and return 0.<br />
|-<br />
| 0x10F<br />
|<br />
| <source lang="C">int smc_ple_flush_kill_and_l1_dcache_clean_invalidate_all(void);</source><br />
| Flushes (and kills if there is activity) the PLE (Preload Engine) and then cleans and invalidates all the L1 Dcache.<br />
|-<br />
| 0x110<br />
| [[SceDriverTzs]]<br />
| <source lang="C">int smc_bus_set_state(int bus, int command);</source><br />
| bus: 1 -> used by [[SceEnumWakeUp]], 2 -> used to enable/disable some things used by the PSP Emulator; maybe CPU, or memory for example. Command: 0 (stop), 1 (start), 2 (LCD DMAC init).<br />
|-<br />
| 0x111<br />
| [[SceDriverTzs]]<br />
| <br />
| Related to bus.<br />
|-<br />
| 0x113<br />
| [[SceDriverTzs]]<br />
| <source lang="c">int smc_bus_clk_gate_switch(ScePVoid *pPervasiveGateBase, SceBool enable);</source><br />
| <br />
|-<br />
| 0x114<br />
| [[SceDriverTzs]]<br />
| <source lang="c">int smc_bus_freq_op(SceUInt32 op, SceUInt32 freq_level);</source><br />
| op: 0 - Set bus frequency, 1 - Get bus frequency, 2 - Set GPU Xbar frequency, 3 - Get GPU Xbar frequency<br />
|-<br />
| 0x117<br />
| [[SceDriverTzs]]<br />
| <source lang="c">int smc_cdram_enable(void);</source><br />
| Seems to enable the CDRAM (by using the [[Physical Memory|SceEmcTop]] registers).<br />
|-<br />
| 0x118<br />
| [[SceDriverTzs]]<br />
| <source lang="c">int smc_cdram_enter_self_resresh(void);</source><br />
| Enter CDRAM self-refresh mode. The <code>resresh</code> typo is in SCE name.<br />
|-<br />
| 0x119<br />
| [[SceDriverTzs]]<br />
| <source lang="c">int smc_cdram_exit_self_resresh(void);</source><br />
| Exit CDRAM self-refresh mode. The <code>resresh</code> typo is in SCE name.<br />
|-<br />
| 0x11A<br />
| [[SceDriverTzs]]<br />
| <source lang="c">int sceSysconSetPowerMode(int type, int mode);</source><br />
| Set power mode. See [[SceSyscon#sceSysconSetPowerModeForDriver|sceSysconSetPowerModeForDriver]].<br />
|-<br />
| 0x11B<br />
| [[SceDriverTzs]]<br />
| <source lang="C">int smc_0x11B(int mode, SceBool cmd);</source><br />
| mode: must be < 0x1000, cmd: 0 set, 1 clear<br />
|-<br />
| 0x11C<br />
| [[SceDriverTzs]]<br />
| <source lang="C">int smc_0x11C(SceUInt32 handle, SceInt32 value);</source><br />
| Used by [[SceLowio#SceGrabForDriver_188BBCC8]].<br />
|-<br />
| 0x11D<br />
| [[SceDriverTzs]]<br />
| <source lang="c">int sceGrabSetCmpMap(int bank, void *pPA);</source><br />
| Valid banks: 0-7, and physical addresses: <code>0x20000000</code>-<code>0x2FFFFFFF</code> and <code>0x42800000</code>-<code>0x7FFFFFFF</code>.<br />
|-<br />
| 0x11E<br />
| [[SceDriverTzs]]<br />
| <source lang="c">int smc_compat_set_state_ex(int command, int ex);</source><br />
| Replacement for SMC 0x110. Used to enable/disable some things used by the PSP Emulator. Maybe the CPU, or memory for example. Command: 0 (stop), 1 (start), 2 (LCD DMAC init). Ex is only used for start (maybe for resume/suspend).<br />
|-<br />
| 0x11F<br />
| [[SceDriverTzs]]<br />
| <source lang="c">int smc_0x11F(int unk);</source><br />
| Valid unk: 1-3. Waits something like a semaphore.<br />
|-<br />
| 0x120<br />
| [[SceDriverTzs]]<br />
| <source lang="c">int smc_compat_get_memory_bank_start_paddr(int bank);</source><br />
| Valid banks 0-7.<br />
|-<br />
| 0x121<br />
| [[SceDriverTzs]]<br />
| <source lang="c">int smc_0x121(int bank1, int bank2);</source><br />
| Valid banks 0-7.<br />
|-<br />
| 0x122<br />
| [[SceDriverTzs]]<br />
| <source lang="c">int sceCrashDumpMonitorCall(int type, void *pTTBR0, void *pVBAR, void *pSysroot);</source><br />
| type: 0 (exception), 1 (panic_or_assertion_failed), 2 (bus error)<br />
|-<br />
| 0x12D<br />
|<br />
| <source lang="C">int sceSblSmSchedInvoke(SceBool priority, void *sm_self_paddr, SceUInt32 num_pa_range, SceSblTzsBridgeArgArea area);</source><br />
| Used by [[SceSblSmschedProxy#sceSblSmSchedProxyInvokeForKernel|sceSblSmSchedProxyInvokeForKernel]].<br />
|-<br />
| 0x12E<br />
|<br />
| <source lang="C">int sceSblSmSchedWait(SceSmSchedRequestId req_id, SceSblTzsBridgeArgArea area);</source><br />
| Used by [[SceSblSmschedProxy#sceSblSmSchedProxyWaitForKernel|sceSblSmSchedProxyWaitForKernel]].<br />
|-<br />
| 0x12F<br />
|<br />
| <source lang="C">int sceSblSmSchedGetStatus(SceSmSchedRequestId req_id, SceSblTzsBridgeArgArea area);</source><br />
| Used by [[SceSblSmschedProxy#sceSblSmSchedProxyGetStatusForKernel|sceSblSmSchedProxyGetStatusForKernel]].<br />
|-<br />
| 0x130<br />
|<br />
| <source lang="C">int sceSblSmSchedKill(SceSmSchedRequestId req_id);</source><br />
| Used by [[SceSblSmschedProxy#sceSblSmSchedProxyKillForKernel|sceSblSmSchedProxyKillForKernel]].<br />
|-<br />
| 0x131<br />
|<br />
| Reserved (on FWs 0.931-3.60).<br />
| <br />
|-<br />
| 0x132<br />
|<br />
| Reserved (on FWs 0.931-3.60).<br />
| <br />
|-<br />
| 0x133<br />
|<br />
| <source lang="C">int smc_sm_sched_proxy_call_func(SceSmSchedRequestId req_id, int mailbox_id, SceUInt32 mailval);</source><br />
| Used by [[SceSblSmschedProxy#sceSblSmSchedProxyCallFuncForKernel|sceSblSmSchedProxyCallFuncForKernel]]. <code>mailval</code> is <code>paddr(SceSblSmschedCallFuncCommand) | 1</code>.<br />
|-<br />
| 0x134<br />
|<br />
| <source lang="C">int sceSblSmSchedReadArm2Cry(SceSmSchedRequestId req_id, int mailbox_id, SceUInt32 *pMailval);</source><br />
| Used by [[SceSblSmschedProxy#sceSblSmSchedProxyReadArm2CryForKernel|sceSblSmSchedProxyReadArm2CryForKernel]].<br />
|-<br />
| 0x135<br />
|<br />
| <source lang="C">int sceSblSmSchedWriteArm2Cry(SceSmSchedRequestId req_id, int mailbox_id, SceUInt32 mailval);</source><br />
| Used by [[SceSblSmschedProxy#sceSblSmSchedProxyWriteArm2CryForKernel|sceSblSmSchedProxyWriteArm2CryForKernel]].<br />
|-<br />
| 0x136<br />
|<br />
| <source lang="C">int sceSblSmSchedWriteCry2Arm(SceSmSchedRequestId req_id, int mailbox_id, SceUInt32 mailval);</source><br />
| Used by [[SceSblSmschedProxy#sceSblSmSchedProxyWriteCry2ArmForKernel|sceSblSmSchedProxyWriteCry2ArmForKernel]].<br />
|-<br />
| 0x137<br />
|<br />
| <source lang="C">int sceSblSmSchedReadCry2Arm(SceSmSchedRequestId req_id, int mailbox_id, SceUInt32 *pMailval);</source><br />
| Used by [[SceSblSmschedProxy#sceSblSmSchedProxyReadCry2ArmForKernel|sceSblSmSchedProxyReadCry2ArmForKernel]].<br />
|-<br />
| 0x138<br />
|<br />
| <source lang="C">int sceSblSmSchedRegisterIntrHandler(SceSmSchedRequestId req_id, int mailbox_id);</source><br />
| Used by [[SceSblSmschedProxy#sceSblSmSchedProxyRegisterIntrHandlerForKernel|sceSblSmSchedProxyRegisterIntrHandlerForKernel]].<br />
|-<br />
| 0x139<br />
|<br />
| <source lang="C">int sceSblSmSchedReleaseIntrHandler(SceSmSchedRequestId req_id, int mailbox_id);</source><br />
| Used by [[SceSblSmschedProxy#sceSblSmSchedProxyReleaseIntrHandlerForKernel|sceSblSmSchedProxyReleaseIntrHandlerForKernel]].<br />
|-<br />
| 0x13A<br />
|<br />
| <source lang="c">int smc_sm_sched_proxy_enable_all_cry2arm_interrupts(SceSmSchedRequestId req_id, int mailbox_id, SceSblTzsBridgeArgArea area);</source><br />
| Interrupt Cry2Arm set enable.<br />
|-<br />
| 0x13B<br />
|<br />
| <source lang="c">int smc_sm_sched_proxy_uninitialize(void);</source><br />
| Interrupt Cry2Arm clear enable. Used by [[SceSblSmschedProxy#sceSblSmSchedProxyUninitializeForKernel|sceSblSmSchedProxyUninitializeForKernel]].<br />
|-<br />
| 0x13C<br />
|<br />
| <source lang="c">int smc_sm_sched_proxy_execute_sk_command(sk_cmd_index cmd_index);</source><br />
| Executes a [[Secure_Kernel#Secure_Kernel_Commands|Secure Kernel command]]. Used by [[SceSblSmschedProxy#sceSblSmSchedProxyExecuteSKCommandForKernel|sceSblSmSchedProxyExecuteSKCommandForKernel]].<br />
|-<br />
| 0x168<br />
|<br />
| <source lang="c">int smc_0x168_dmac(int index, int value);</source><br />
| SceDmacmgrDmac related. Writes <code>value</code> to SceDmacmgrDmac<code>N</code> + <code>0x100</code>. Maybe key_id related.<br />
|-<br />
| 0x169<br />
|<br />
| <source lang="c">int smc_0x169_dmac(int index, int value);</source><br />
| SceDmacmgrDmac related. Writes <code>value</code> to SceDmacmgrDmac<code>N</code> + <code>0x104</code>. Maybe key_id related.<br />
|-<br />
| 0x16A<br />
|<br />
| <source lang="c">int smc_l2_write_control_register(int value);</source><br />
| Flushes and invalidates the entire L2 Cache (Clean and Invalidate by Way with <code>way = 0xFFFF</code>, offset <code>0x7FC</code>), then performs an L2 Cache Sync (offset <code>0x730</code>), and finally writes <code>value</code> to the L2 Control Register (offset <code>0x100</code>).<br />
|-<br />
| 0x16B<br />
|<br />
| <source lang="c">int smc_l2_write_auxiliary_control_register(int value);</source><br />
| Writes <code>value</code> to the L2 Auxiliary Control Register (offset <code>0x104</code>).<br />
|}<br />
<br />
=== Aborts ===<br />
<br />
On development units, data and prefetch aborts can handle <code>BKPT</code> instruction for software breakpoints. [[SceDebug]] uses this to handle usermode breakpoints. There is no built-in support for <code>BKPT</code> in kernel code.<br />
<br />
[[SceSysmem]] uses data aborts with the <code>LDRT</code> and <code>STRT</code> instructions to implement usermode pointer checking. When LDRT/STRT throws a MMU data exception because of an invalid access and the exception came from [[SceSysmem#sceKernelCopyFromUserForDriver]] or [[SceSysmem#sceKernelCopyToUserForDriver]] or related functions, the data abort handler will resume execution.<br />
<br />
=== IRQ ===<br />
<br />
IRQs are only handled in non-secure world. An IRQ in secure world is fatal. See [[SceKernelIntrMgr]].<br />
<br />
=== FIQ ===<br />
<br />
FIQs are only handled in secure world because of the bit set in the SCR. Because of this, it is likely that secure devices such as [[Cmep]] use FIQs to communicate with the Cortex A9 cores. See [[SceKernelIntrMgr]].<br />
<br />
== Built-in handlers behaviour ==<br />
SceExcpmgr is mostly responsible for providing a facility that allows installing exception handlers to other modules. However, it also installs exception handlers by itself.<br />
<br />
SceExcpmgr registers an infinite loop as the default exception handler in <code>module_start</code>. For RESET, SVC, RESERVED and IRQ, another infinite loop handler will be installed at priority 7.<br />
<br />
SceExcpmgr also installs a priority 7 handler for PABT, DABT and UNDEF. As specified in the [[SceExcpmgr#Types|Types section]], those handlers will panic the kernel if they receive <br />
either <code>SCE_EXCPMGR_EXCEPTION_NOT_HANDLED_FATAL</code> or <code>SCE_EXCPMGR_EXCEPTION_HANDLING_CODE_4</code> as their handling code parameter, infinite loop if nested exception count is greater than 1, and call [[SceSysmem#sceKernelSysrootReturnFromExcpToThreadForKernel|sceKernelSysrootReturnFromExcpToThreadForKernel]] otherwise.<br />
<br />
In addition to this, SceExcpmgr installs a priority 0 handler for PABT, DABT and UNDEF.<br />
Those three have a common behaviour: building the <code>SceExcpmgrExceptionContext</code>, incrementing the nested exception count, clearing some CP14 control registers if needed, loading the <code>SceProcessContext</code> provided by [[SceSysmem#SceSysrootForKernel_118657C6|SceSysrootForKernel_118657C6]], setting DACR to 0x15450000 (not done in System Software version 0.990.030), zero'ing out <code>TPIDRPRW</code> and <code>TPIDRURO</code>, and calling a per-handler callback. The CP14 registers that get zero'ed out are the breakpoint control registers (<code>DBGBCR0</code>-<code>DBGBCR5</code>) if a non-NULL pointer has been provided to [[SceExcpmgr#SceExcpmgrForKernel_A66DDFA3|SceExcpmgrForKernel_A66DDFA3]], and the watchpoint control registers (<code>DBGWCR0</code>-<code>DBGWCR3</code>) if a non-NULL pointer has been provided to [[SceExcpmgr#SceExcpmgrForKernel_4FF90618|SceExcpmgrForKernel_4FF90618]].<br />
<br />
=== PABT handler ===<br />
<br />
The PABT handler performs no additional work and merely transfers control to the next exception handler in chain.<br />
<br />
=== UNDEF handler ===<br />
<br />
In System Software version 0.990.030, the UNDEF handler performs no additional work and merely transfers control to the next exception handler in chain.<br />
<br />
Since System Software version ?.??, the UNDEF handler will check if the instruction that caused the exception is a <code>MCRR p15, 0, Rt, Rt2, c11</code>, in which case it will be replaced with a <code>NOP</code> before execution is resumed at the faulting instruction (which is now a <code>NOP</code>).<br />
Otherwise, control is transferred to the next exception handler in chain. According to the ARM Cortex-A9 TRM, this MCRR instruction is used to program the ''Preload Engine'' channels.<br />
<br />
=== DABT handler ===<br />
<br />
The DABT handler is responsible for handling aborts in the [[SceSysmem#sceKernelGetVmaccessRangeForKernel|Vmaccess routines]].<br />
If such an exception has not happened, control is transferred to the next exception handler in chain.<br />
<br />
==== Old Vmaccess model ====<br />
<br />
In System Software revision 0.931.010 and earlier, the Vmaccess functions follow this pattern:<br />
<source lang="armasm"><br />
CopyFromUser32:<br />
ldrt r2, [r0] @or any load from kernel/user<br />
str r2, [r1] @or any store to kernel/user<br />
mov r0, 0 @Return value = SCE_OK<br />
cpy r0, r0<br />
cpy r0, r0 @nop<br />
bx lr<br />
</source><br />
<br />
If an invalid (user) pointer was provided to this function, a Data Abort would occur on the checked instruction (in this case, <code>ldrt</code>).<br />
<br />
When an exception occurs, if the CPU is in ARM mode and <code>pc</code> belongs in the old model Vmaccess range, the DABT handler will set <code>r0 = 0x80022005</code> (SCE_KERNEL_ERROR_INVALID_MEMORY_ACCESS) in the exception context then resume execution 'three instructions after the faulting one', in the <code>nop</code>sled (in modern firmwares, only one instruction is skipped instead of 3).<br />
The caller thus see the function failed as it returned an error code (SCE_KERNEL_ERROR_INVALID_MEMORY_ACCESS).<br />
<br />
In recent firmwares, the old Vmaccess range must be explicitely set via a call to [[SceExcpmgr#SceExcpmgrForKernel_C45C0D3D|SceExcpmgrForKernel_C45C0D3D]] instead of being fetched during the call to [[SceSysmem#sceKernelGetVmaccessRangeForKernel|sceKernelGetVmaccessRange]].<br />
<br />
==== New Vmaccess model ====<br />
<br />
Since System Software revision 0.940, this model has been progressively phased out and replaced with a new Vmaccess model.<br />
<br />
Under the new model, the Vmaccess functions all begin by loading the address of a function in <code>r12</code> but no longer have to follow a specific pattern.<br />
When an exception occurs, if the CPU is in ARM mode and the instruction at <code>pc</code> is a checked memory access instruction (i.e. one of {<code>strt</code>, <code>strht</code>, <code>strbt</code>, <code>ldrt</code>, <code>ldrht</code>, <code>ldrbt</code>, <code>ldrsht</code>, <code>strsbt</code>}), execution is resumed at the address pointed to by <code>r12</code>. The address loaded in <code>r12</code> points to a snippet that cleans the stack if needed then returns SCE_KERNEL_ERROR_INVALID_MEMORY_ACCESS.<br />
<br />
Note that if the old and new model ranges overlap, the latter takes priority.<br />
This means that exceptions raised from code residing in the overlap will be handled under the new model.<br />
<br />
If the DABT or UNDEF handlers return, CP14 registers are restored from either the global variables set previously by [[SceExcpmgr#SceExcpmgrForKernel_4FF90618|SceExcpmgrForKernel_4FF90618]] and [[SceExcpmgr#SceExcpmgrForKernel_A66DDFA3|SceExcpmgrForKernel_A66DDFA3]], or interrupted thread's TPIDRPRW->0x18->0xC if the TPIDRPRW is non-NULL. If no breakpoint restore structure has been provided to [[SceExcpmgr#SceExcpmgrForKernel_A66DDFA3|SceExcpmgrForKernel_A66DDFA3]], then watchpoints will not be restored regardless of whether something was provided to [[SceExcpmgr#SceExcpmgrForKernel_4FF90618|SceExcpmgrForKernel_4FF90618]] or not.<br />
<br />
== Non-exported functions ==<br />
<br />
The following table contains offsets (from the base of <code>.text</code>/segment 0) to non-exported functions whose name is known:<br />
{| class="wikitable" <br />
|-<br />
! Function name<br />
! 0.990.030<br />
! 3.600.011 CEX<br />
|-<br />
| sceKernelDefaultHandlerCfunc<br />
| 0x2138<br />
| 0x1D4C<br />
|-<br />
| sceKernelDefaultHandlerResetCfunc<br />
| 0x21A8<br />
| 0x1D50<br />
|-<br />
| sceKernelDefaultHandlerSvcCfunc<br />
| 0x21D0<br />
| 0x1D54<br />
|-<br />
| sceKernelDefaultHandlerReservedCfunc<br />
| 0x2238<br />
| 0x1D58<br />
|-<br />
| sceKernelDefaultHandlerIrqCfunc<br />
| 0x2260<br />
| 0x1D5C<br />
|-<br />
| sceKernelPanicHandlerUndefCfunc<br />
| 0x2288<br />
| 0x1D60<br />
|-<br />
| sceKernelPanicHandlerPabtCfunc<br />
| 0x22C4<br />
| 0x1D78<br />
|-<br />
| sceKernelPanicHandlerDabtCfunc<br />
| 0x2304<br />
| 0x1D90<br />
|}<br />
<br />
== SceExcpmgrForKernel ==<br />
<br />
=== sceKernelRegisterExceptionHandlerForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x03499636<br />
|-<br />
| 3.65 || 0x00063675<br />
|}<br />
<br />
Temp name was sceExcpmgrRegisterHandlerForKernel.<br />
<br />
Installs an exception handler. The exception handler can be ARM code or Thumb code. Allowed <code>priority</code> values are from 0 (most important) to 7 (least important), including them. Specifying priority 0 will install the handler directly in VBAR, which means its code will run directly when an exception raises (and as such it needs to build the exception context itself).<br />
<code>handler & 0x1</code> must be set if the handler function is Thumb code.<br />
<br />
The syscall handler in FW 1.50 is SceExcpmgr_func_0x81000E40.<br />
<br />
The syscall handler in FW 3.65 is located at offset 0xF40 in [[SceKernelIntrMgr]]'s <code>.text</code> segment.<br />
<br />
<source lang="C">int sceKernelRegisterExceptionHandlerForKernel(SceExcpmgrExceptionCode excode, SceUInt32 priority, SceExcpmgrExceptionHandlerContext *handler);</source><br />
<br />
=== sceKernelRegisterDefaultExceptionHandlerForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0xFFCCB5F9<br />
|-<br />
| 3.65 || 0x416C0E20<br />
|}<br />
<br />
Installs an exception handler for all exceptions. If no exception handler is already installed for an exception, the handler will be installed in the VBAR. <code>handler</code> must be the same parameter that would be passed to [[SceExcpmgr#sceKernelRegisterExceptionHandlerForKernel|sceKernelRegisterExceptionHandlerForKernel]].<br />
<br />
<source lang="C">int sceKernelRegisterDefaultExceptionHandlerForKernel(SceExcpmgrExceptionHandlerContext *handler);</source><br />
<br />
=== sceKernelReleaseExceptionHandlerForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xE04AE286<br />
|-<br />
| 3.65 || 0xDA7BB671<br />
|}<br />
<br />
Uninstalls an exception handler.<br />
<br />
Pass the same arguments as provided to [[SceExcpmgr#sceKernelRegisterExceptionHandlerForKernel|sceKernelRegisterExceptionHandlerForKernel]].<br />
<br />
<source lang="C">int sceKernelReleaseExceptionHandlerForKernel(SceExcpmgrExceptionCode excode, SceExcpmgrExceptionHandlerContext *handler);</source><br />
<br />
=== sceKernelReleaseDefaultExceptionHandlerForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990 || 0x917A6D2B<br />
|-<br />
| 3.60 || not present<br />
|}<br />
<br />
=== sceKernelInitialHandlerDebugUndefCfuncForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0xB77DCBD6<br />
|-<br />
| 3.65 || 0x64A057C7<br />
|}<br />
<br />
Logs some information about the CPU state and backtrace then returns. Freezes with an infinite loop if currentHandlerIndex is superior to 1.<br />
<br />
<source lang="C">void sceKernelInitialHandlerDebugUndefCfuncForKernel(SceExcpmgrExceptionContext* context);</source><br />
<br />
=== sceKernelInitialHandlerDebugPabtCfuncForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x25C0C91B<br />
|-<br />
| 3.65 || 0x64A057C7<br />
|}<br />
<br />
Logs some information about the CPU state and backtrace then returns. Freezes with an infinite loop if currentHandlerIndex is superior to 1.<br />
<br />
<source lang="C">void sceKernelInitialHandlerDebugPabtCfuncForKernel(SceExcpmgrExceptionContext* context);</source><br />
<br />
=== sceKernelInitialHandlerDebugDabtCfuncForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xFFFA3353<br />
|-<br />
| 3.65 || 0xD195E55C<br />
|}<br />
<br />
Logs some information about the CPU state and backtrace then returns. Freezes with an infinite loop if currentHandlerIndex is superior to 1.<br />
<br />
<source lang="C">void sceKernelInitialHandlerDebugDabtCfuncForKernel(SceExcpmgrExceptionContext* context);</source><br />
<br />
=== sceKernelReturnFromExceptionForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0xD17EEE40<br />
|-<br />
| 3.65 || 0x3E55B5C3<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">void sceKernelReturnFromExceptionForKernel(SceExcpmgrExceptionContext *context);</source><br />
<br />
=== SceExcpmgrForKernel_A90AC525 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xA90AC525<br />
|-<br />
| 3.65 || 0x4337DD78<br />
|}<br />
<br />
Returns a pointer to the handler previously registered by [[SceExcpmgr#sceKernelRegisterDefaultExceptionHandlerForKernel|sceKernelRegisterDefaultExceptionHandlerForKernel]].<br />
<br />
<source lang="C">SceExcpmgrExceptionHandlerContext *SceExcpmgrForKernel_A90AC525(void);</source><br />
<br />
=== sceKernelGetExcpStackBottomForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x4C603645<br />
|-<br />
| 3.65 || 0x5420ED8F<br />
|}<br />
<br />
Returns the exception stack bottom for specified CPU core. The stack bottom is the highest address of the stack.<br />
<br />
Reimplementation code:<br />
<source lang="C"><br />
void* sceKernelGetExcpStackBottomForKernel(int coreNum) {<br />
return sceKernelGetExcpDataForKernel()->ExcpStackBottom[coreNum];<br />
}<br />
</source><br />
<br />
<source lang="C">void* sceKernelGetExcpStackBottomForKernel(int coreNum);</source><br />
<br />
=== sceKernelGetExcpCBForKernel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || not present<br />
|-<br />
| 3.60 || 0x08CB30E6<br />
|-<br />
| 3.65 || 0x96C2869C<br />
|}<br />
<br />
This is a guessed name. Temp name was sceKernelGetExcpDataForKernel, sceExcpmgrGetDataForKernel.<br />
<br />
Get exception data pointer (for use by handlers).<br />
<br />
<source lang="C">SceExcpmgrCB *sceKernelGetExcpCBForKernel(void);</source><br />
<br />
=== SceExcpmgrForKernel_3AE9AEE1 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || not present<br />
|-<br />
| 3.60 || 0x3AE9AEE1<br />
|-<br />
| 3.65 || 0x1FBF5654<br />
|}<br />
<br />
Sets a callback function ran by the default UNDEF exception handler before calling the next handler in the chain.<br />
<br />
<source lang="C"><br />
// NOTE : context passed to callback lacks VFP registers<br />
void SceExcpmgrForKernel_3AE9AEE1(void (*callback)(SceExcpmgrExceptionContext*));<br />
</source><br />
<br />
=== SceExcpmgrForKernel_4FF90618 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x4FF90618<br />
|-<br />
| 3.65 || 0xE7487AFD<br />
|}<br />
<br />
Called by [[SceProcessmgr]] during <code>CreateKernelProcess</code>.<br />
<br />
Sets the structure CP14 watchpoint registers will be restored from if TPIDRPRW of thread that raised an exception is NULL (Kernel process). See [[SceExcpmgr#Provided handlers' behaviour]] for more information.<br />
<br />
<source lang="C">void SceExcpmgrForKernel_4FF90618(DBGWVC_save *a1);</source><br />
<br />
=== SceExcpmgrForKernel_A66DDFA3 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0xA66DDFA3<br />
|-<br />
| 3.65 || 0x293DFA04<br />
|}<br />
<br />
Called by [[SceProcessmgr]] during <code>CreateKernelProcess</code>.<br />
<br />
Sets the structure CP14 breakpoint registers will be restored from if TPIDRPRW of thread that raised an exception is NULL (Kernel process). See [[SceExcpmgr#Provided handlers' behaviour]] for more information.<br />
<br />
<source lang="C">void SceExcpmgrForKernel_A66DDFA3(DBGBVC_save *a1);</source><br />
<br />
=== SceExcpmgrForKernel_7ADF11DB ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || Not present<br />
|-<br />
| 3.60 || 0x7ADF11DB<br />
|-<br />
| 3.65 || 0x9EE59C6E<br />
|}<br />
<br />
Sets a callback function ran by the default DABT exception handler before trying to handle the exception.<br />
<br />
<source lang="C"><br />
// NOTE : context passed to callback lacks VFP registers<br />
void SceExcpmgrForKernel_7ADF11DB(void (*callback)(SceExcpmgrExceptionContext*));<br />
</source><br />
<br />
=== SceExcpmgrForKernel_8D223205 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || not present<br />
|-<br />
| 3.60 || 0x8D223205<br />
|-<br />
| 3.65 || 0x58F7212B<br />
|}<br />
<br />
Sets a callback function ran by the default PABT exception handler before calling the next handler in the chain.<br />
<br />
<source lang="C"><br />
// NOTE : context passed to callback lacks VFP registers<br />
void SceExcpmgrForKernel_8D223205(void (*callback)(SceExcpmgrExceptionContext*));<br />
</source><br />
<br />
=== SceExcpmgrForKernel_C45C0D3D ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-0.990 || Not present<br />
|-<br />
| 3.60 || 0xC45C0D3D<br />
|-<br />
| 3.65 || 0x44CE04B8<br />
|}<br />
<br />
Sets the "memory access error area" range. See [[SceExcpmgr#Built-in handlers behaviour|the built-in handlers behaviour section]] for more information.<br />
<br />
In older firmwares (0.990.030), this range is acquired during the call to [[SceSysmem#SceCpuForKernel_9A3281C0|SceCpuForKernel_9A3281C0]]<br />
in SceExcpmgr <code>module_start</code> instead.<br />
<source lang="C">void SceExcpmgrForKernel_C45C0D3D(SceUIntPtr memErrorAreaStart, SceUIntPtr memErrorAreaEnd);</source><br />
<br />
=== SceExcpmgrForKernel_D464A9A7 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0xD464A9A7<br />
|-<br />
| 3.65 || 0xB615A7DA<br />
|}<br />
<br />
Returns the current nested exception count, or 0 if current TPIDRPRW is non-NULL.<br />
<br />
<source lang="C">int SceExcpmgrForKernel_D464A9A7(void);</source><br />
<br />
== SceExcpmgrForTZS ==<br />
<br />
=== SceExcpmgrForTZS_get_default_excp_handler ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-1.80 || 0x07A5790B<br />
|}<br />
<br />
<source lang="C">void *SceExcpmgrForTZS_get_default_excp_handler(void);</source><br />
<br />
=== sceKernelReleaseExceptionHandlerForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-1.80 || 0x166C9362<br />
|}<br />
<br />
<source lang="C">int sceKernelReleaseExceptionHandlerForTZS(SceExcpmgrExceptionCode excode, SceExcpmgrExceptionHandlerContext *handler)</source><br />
<br />
=== sceKernelReleaseDefaultExceptionHandlerForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-1.80 || 0x6282E52C<br />
|}<br />
<br />
<source lang="C">int sceKernelReleaseDefaultExceptionHandlerForTZS(SceExcpmgrExceptionHandlerContext *handler)</source><br />
<br />
=== sceKernelRegisterDefaultExceptionHandlerForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-1.80 || 0xA0434735<br />
|}<br />
<br />
<source lang="C">int sceKernelRegisterDefaultExceptionHandlerForTZS(SceExcpmgrExceptionHandlerContext *handler)</source><br />
<br />
=== sceKernelRegisterMonitorEntryForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0xAC297406<br />
|}<br />
<br />
<source lang="C">int sceKernelRegisterMonitorEntryForTZS(SceExcpmgrExceptionCode excode, SceExcpmgrExceptionHandlerContext *handler);</source><br />
<br />
=== sceKernelRegisterExceptionHandlerForTZS ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-1.80 || 0xDD4C680D<br />
|}<br />
<br />
<source lang="C">int sceKernelRegisterExceptionHandlerForTZS(SceExcpmgrExceptionCode excode, SceUInt32 priority, SceExcpmgrExceptionHandlerContext *handler);</source><br />
<br />
[[Category:ARM]]<br />
[[Category:Kernel]]<br />
[[Category:Modules]]<br />
[[Category:Library]]</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=SceSyscon&diff=20876
SceSyscon
2023-12-27T00:14:36Z
<p>CreepNT: /* SceSysconForDriver_058941D7 */ Add official name from 0.945 scePdPower</p>
<hr />
<div>System Controller.<br />
<br />
== Module ==<br />
<br />
{| class="wikitable"<br />
|-<br />
! Version !! World !! Privilege<br />
|-<br />
| 0.931.010-3.740.011 || Non-secure || Kernel<br />
|}<br />
<br />
== Libraries ==<br />
<br />
=== Known NIDs ===<br />
<br />
{| class="wikitable"<br />
|-<br />
! Version !! Name !! World !! Visibility !! NID<br />
|-<br />
| 0.931.010-3.740.011 || [[SceSyscon#SceSysconForDriver|SceSysconForDriver]] || Non-secure || Kernel || 0x60A35F64<br />
|}<br />
<br />
== Types ==<br />
<br />
<source lang="c"><br />
#define SCE_KERNEL_ERROR_SYSCON_ERROR 0x80250000<br />
#define SCE_SYSCON_ERROR_INVALID_SIZE 0x80250001<br />
#define SCE_SYSCON_ERROR_INVALID_ARGUMENT 0x80250002<br />
#define SCE_SYSCON_ERROR_INVALID_POINTER 0x80250003<br />
#define SCE_SYSCON_ERROR_INVALID_STATUS 0x80250004<br />
#define SCE_SYSCON_ERROR_NOT_INTR_ALLOWED 0x80250005<br />
#define SCE_SYSCON_ERROR_TX_SIZE_TOO_LONG 0x80250006<br />
<br />
#define SCE_SYSCON_ERROR_ILLEGAL_SIZE 0x80250100<br />
#define SCE_SYSCON_ERROR_ILLEGAL_STATUS 0x80250101<br />
#define SCE_SYSCON_ERROR_NOEXEC 0x80250102<br />
#define SCE_SYSCON_ERROR_INVALID_FLAGS 0x80250105<br />
<br />
// Syscon error codes are gotten with 0x80250200 | rx[3], where rx is the data returned by Syscon<br />
<br />
typedef struct SceSysconPacket { // size is 0x80<br />
struct SceSysconPacket *next;<br />
SceUInt32 status; // Lower 16 bits contain flags<br />
SceUID semaId;<br />
SceUInt32 index; // Out: returns to which packet list the packet was inserted into<br />
SceUInt8 tx[32]; // tx[0..1] = cmd, tx[2] = size i.e. sizeof(actual_data)+1, rx[3..31] = actual_data<br />
SceUInt8 rx[32]; // rx[0..1] = cmd, rx[2] = size i.e. sizeof(actual_data)+2, rx[3] = error_code, rx[4..31] = actual_data<br />
void *tx_extra;<br />
void *rx_extra;<br />
SceSize rx_extra_size;<br />
SceUInt32 rx_offset;<br />
int (*callback)(SceSysconPacket *packet, void *argp);<br />
void *argp;<br />
SceUInt32 time;<br />
SceUInt32 unk[5];<br />
} SceSysconPacket;<br />
<br />
typedef enum SceSysconControl {<br />
SCE_SYSCON_CTRL_UP = 0x1,<br />
SCE_SYSCON_CTRL_RIGHT = 0x2,<br />
SCE_SYSCON_CTRL_DOWN = 0x4,<br />
SCE_SYSCON_CTRL_LEFT = 0x8,<br />
SCE_SYSCON_CTRL_TRIANGLE = 0x10,<br />
SCE_SYSCON_CTRL_CIRCLE = 0x20,<br />
SCE_SYSCON_CTRL_CROSS = 0x40,<br />
SCE_SYSCON_CTRL_SQUARE = 0x80,<br />
SCE_SYSCON_CTRL_SELECT = 0x100,<br />
SCE_SYSCON_CTRL_LTRIGGER = 0x200,<br />
SCE_SYSCON_CTRL_RTRIGGER = 0x400,<br />
SCE_SYSCON_CTRL_START = 0x800,<br />
SCE_SYSCON_CTRL_PSBUTTON = 0x1000,<br />
SCE_SYSCON_CTRL_POWER = 0x4000,<br />
SCE_SYSCON_CTRL_VOLUP = 0x10000,<br />
SCE_SYSCON_CTRL_VOLDOWN = 0x20000,<br />
SCE_SYSCON_CTRL_HEADPHONE = 0x8000000<br />
} SceSysconControl;<br />
</source><br />
<br />
Flags (passed to <code>sceSysconCmdExecForDriver</code>, etc), also lower bits of <code>status</code>:<br />
{| class="wikitable"<br />
! Flags !! Meaning<br />
|-<br />
| 0x1 || Some kind of priority that helps to select to which packet list the packet is inserted into.<br />
|-<br />
| 0x100 || Do not insert packet checksum (at <code>tx_buf[2 + len]</code>), where <code>len = tx_buf[2]</code>. And don't memset the rest of the buffer to -1 (<code>memset(tx_buf + len + 3, -1, 29 - len)</code>) if len < 29.<br />
|-<br />
| 0x400 || When set, use rx_extra to receive the data. rx_extra_size must be greater than 32.<br />
|-<br />
| 0x800 || When set, use tx_extra instead of tx for sending data. The size is contained in tx_extra[2] and must be smaller or equal to 253. When cleared: use tx and the size is contained in tx[2], which has to be smaller or equal 29.<br />
|}<br />
<br />
== SceSysconForDriver ==<br />
<br />
=== sceSysconErnieShutdownForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x94AB13CC<br />
|}<br />
<br />
<source lang="C"><br />
#define ERNIE_SHUTDOWN_SHUTDOWN 0<br />
#define ERNIE_SHUTDOWN_REBOOT 1<br />
<br />
int sceSysconErnieShutdownForDriver(int mode);<br />
</source><br />
<br />
=== sceSysconPowerCtrlKermitResetForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x14B99945<br />
|}<br />
<br />
Executes [[SMC]] 0x11A: <code>return sceSysconSetPowerMode(2, 0);</code><br />
<br />
<source lang="C">int sceSysconPowerCtrlKermitResetForDriver(void);</source><br />
<br />
=== sceSysconBatterySWResetForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x87DA378D<br />
|}<br />
<br />
If Syscon version <= 0x70503, it does nothing and returns error 0x8025023F.<br />
<br />
<source lang="C">int sceSysconBatterySWResetForDriver(void);</source><br />
<br />
=== sceSysconGetBatteryFullCapacityForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0xF93CF833<br />
|}<br />
<br />
Used in [[ScePower]]'s module_start.<br />
<br />
<source lang="C">int sceSysconGetBatteryFullCapacityForDriver(void *pResult);</source><br />
<br />
=== sceSysconGetBatteryCycleCountForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0xCD73079D<br />
|}<br />
<br />
Used in [[ScePower]].<br />
<br />
<source lang="C">int sceSysconGetBatteryCycleCountForDriver(void *pRedsult);</source><br />
<br />
=== sceSysconBatteryStartBLModeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x2CEF078E<br />
|}<br />
<br />
<source lang="C">int sceSysconBatteryStartBLModeForDriver(void);</source><br />
<br />
=== sceSysconBatteryStopBLModeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xE4AE7852<br />
|}<br />
<br />
<source lang="C">int sceSysconBatteryStopBLModeForDriver(void);</source><br />
<br />
=== sceSysconBatterySetBLCommandForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xE4F29744<br />
|}<br />
<br />
BL command (1 byte at most) must be contained in either unk_byte or pSrc.<br />
<br />
<source lang="C">int sceSysconBatterySetBLCommandForDriver(SceUInt16 ctx, SceUInt8 unk_byte, void *pSrc, SceUInt8 size);</source><br />
<br />
=== sceSysconBatteryExecBLCommandForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x74B2AB55<br />
|}<br />
<br />
<source lang="C">int sceSysconBatteryExecBLCommandForDriver(SceUInt16 ctx);</source><br />
<br />
=== sceSysconBatteryReadBLCommandForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x448DAFF1<br />
|}<br />
<br />
<source lang="C"><br />
// size must be between 0 and 0x10<br />
int sceSysconBatteryReadBLCommandForDriver(SceUInt16 ctx, SceUInt8 unk1, SceUInt8 unk2, void *pDst, SceUInt8 size);<br />
</source><br />
<br />
=== sceSysconReadBatteryRegForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xC2FB5565<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
=== sceSysconGetManualChargeModeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0x4FEC564C<br />
|}<br />
<br />
<source lang="C">int sceSysconGetManualChargeModeForDriver(int *piMode);</source><br />
<br />
=== sceSysconCtrlManualChargeModeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0xC6A2C9EF<br />
|}<br />
<br />
<source lang="C">int sceSysconCtrlManualChargeModeForDriver(int mode);</source><br />
<br />
=== sceSysconGetLogInfoForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0x701535FC<br />
|}<br />
<br />
<source lang="C"><br />
typedef struct SceSysconLogInfo { // size is 8 on FW 3.600.011<br />
uint8_t unk_0[8];<br />
} SceSysconLogInfo;<br />
<br />
int sceSysconGetLogInfoForDriver(SceSysconLogInfo *pInfo);<br />
</source><br />
<br />
=== sceSysconLogStartForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0x4E55CF5E<br />
|}<br />
<br />
<source lang="C">int sceSysconLogStartForDriver(void);</source><br />
<br />
=== sceSysconLogStartWaitingForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.12 || not present<br />
|-<br />
| 2.500.071-3.740.011 || 0x9C0B1E61<br />
|}<br />
<br />
<source lang="C">int sceSysconLogStartWaitingForDriver(void);</source><br />
<br />
=== sceSysconLogReadDataForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0x487D97F3<br />
|}<br />
<br />
<source lang="C">int sceSysconLogReadDataForDriver(SceUInt32 offset, void *buffer, SceSize size);</source><br />
<br />
=== sceSysconGetTemperatureLogForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.12 || not present<br />
|-<br />
| 2.500.071-3.740.011 || 0x3B354824<br />
|}<br />
<br />
=== sceSysconClearTemperatureLogForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.12 || not present<br />
|-<br />
| 2.500.071-3.740.011 || 0x3843D657<br />
|}<br />
<br />
=== sceSysconGetUsbDetStatusForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0xEF810687<br />
|}<br />
<br />
=== sceSysconCtrlDolceLEDForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0x727F985A<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C"><br />
#define STATE_ON 0<br />
#define STATE_BLINK_SLOW 1<br />
#define STATE_BLINK_FAST 2<br />
<br />
int sceSysconCtrlDolceLEDForDriver(SceUInt32 state);<br />
</source><br />
<br />
=== sceSysconGetTimeStampForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x4D588A0A<br />
|}<br />
<br />
This is a guessed named, derived from PSP. Temp name was sceSysconGetBaryonTimestampForDriver.<br />
<br />
Returns the timestamp of latest installed Syscon firmware patch, formatted as <code>YYYYMMDDhhmm</code>. This comes from a string stored in Syscon firmware under another format: <code>$Date:: YYYY-MM-DD hh:mm:ss +0900#$</code><br />
<br />
Example: <code>$Date:: 2013-12-13 15:52:05 +0900#$</code> in Syscon firmware becomes <code>201312131552</code> in Syscon command 2.<br />
<br />
<source lang="c"><br />
// pTimestamp will point to a buffer of size 0x10 bytes, containing a string of size 13 (12: length + 1: terminal character)<br />
int sceSysconGetTimeStampForDriver(char *pTimestamp);<br />
</source><br />
<br />
=== sceSysconGetWakeupFactorForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xCF5B2F2F<br />
|}<br />
<br />
Result is 2 bytes wakeup factor coming from Syscon command 0x10.<br />
<br />
<source lang="C">int sceSysconGetWakeupFactorForDriver(SceUInt32 *pWakeupFactor);</source><br />
<br />
=== sceSysconCtrlHdmiCecPowerForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x62155962<br />
|}<br />
<br />
If Syscon version is strictly lower than 0x40000, it does nothing and returns 0.<br />
<br />
Sets the pin CDC Hot Plug Detect (HPD) state of the HDMI bridge (AD80244 / ADV7533).<br />
<br />
<source lang="c">int sceSysconCtrlHdmiCecPowerForDriver(SceBool enable_HDMI_CDC_HPD_pin);</source><br />
<br />
=== sceSysconCtrlMotionSensorPowerForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x063425AE<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
If Syscon version is strictly lower than 0x40000, it does nothing and returns 0.<br />
<br />
<source lang="C">int sceSysconCtrlMotionSensorPowerForDriver(SceBool enable);</source><br />
<br />
=== SceSysconForDriver_3FDD29D6 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x3FDD29D6<br />
|}<br />
<br />
<source lang="C">int SceSysconForDriver_3FDD29D6(int a1, SceBool use_flag);</source><br />
<br />
=== sceSysconCtrlVoltageForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.920.050-3.740.011 || 0x7F198FA2<br />
|}<br />
<br />
Temp name was sceSysconSetVoltageForDriver.<br />
<br />
Used in [[ScePower]].<br />
<br />
<source lang="C"><br />
/*<br />
type:<br />
0: Reserved<br />
1: DD1 (VDD - IFTU, DMAC, Internal bus, SPM 32KiB/128KiB) SetSysClockFrequency, SetDmac5ClockFrequency, SetBusClockFrequency, SetCameraBusClockFrequency<br />
2: DD2 (VDDA - ARM core, L2 cache) SetArmClockFrequency<br />
3: DD3 (VDDC - Codec Engine, AVC Decoder) SetVipClockFrequency, SetVeneziaClockFrequency<br />
4: DD4 (VDDG - GPU core) SetGpuClockFrequencyInternal, SetGpuXbarClockFrequency, SetCompatClockFrequency<br />
<br />
vid:<br />
0x22 (0.34V)<br />
0x8A (1.38V) - (something got from ScePervasiveForDriver)<br />
*/<br />
<br />
#define SCE_SYSCON_VOLTAGE_DD1 (1)<br />
#define SCE_SYSCON_VOLTAGE_DD2 (2)<br />
#define SCE_SYSCON_VOLTAGE_DD3 (3)<br />
#define SCE_SYSCON_VOLTAGE_DD4 (4)<br />
<br />
int sceSysconCtrlVoltageForDriver(SceUInt32 type, SceUInt32 vid);</source><br />
<br />
=== sceSysconSetPowerModeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x8A95D35C<br />
|}<br />
<br />
Temp name was sceSysconResetDeviceForDriver.<br />
<br />
<source lang="c">int sceSysconSetPowerModeForDriver(int type, int mode);</source><br />
<br />
It issues <code>SMC #0</code> with <code>r12 = 0x11A</code>.<br />
<br />
The <code>mode</code> argument is usually set to <code>0x2</code> or sometimes <code>0x8002</code> (which seems to correspond to some request by the UDC and BT drivers).<br />
<br />
The <code>type</code> argument determines what to do.<br />
<br />
Real definition names are like: "SCE_SYSCON_POWERMODE_MODE_STANDBY".<br />
<br />
{| class="wikitable"<br />
! Type !! Description !! Syscon command<br />
|-<br />
| 0 || Power off || <code>{0xC0, 0, 5, type, (~mode) & 0xFF, (~mode >> 8) & 0xFF, (mode >> 16) & 0xFF}</code><br />
|-<br />
| 1 || Suspend (low-power state) || <code>{0xC0, 0, 5, type, (~mode) & 0xFF, (~mode >> 8) & 0xFF, (mode >> 16) & 0xFF}</code><br />
|-<br />
| 2 || Cold reset || <code>{0x01, 8, 1, 0}</code><br />
|-<br />
| 3 || ?Reset to update mode? || <code>{0xC1, 0, 2, 0}</code><br />
|-<br />
| 4 || ?Reset to update mode? || <code>{0xC1, 0, 2, 1}</code><br />
|-<br />
| 5 || Hibernate || <code>{0xC2, 0, 2, 0x5A}</code><br />
|-<br />
| 16 || ?? || <code>{0xC0, 0, 5, type, (~mode) & 0xFF, (~mode >> 8) & 0xFF, (mode >> 16) & 0xFF}</code><br />
|-<br />
| 17 || Resume (soft reset: suspend and immediately resume) || <code>{0xC0, 0, 5, type, (~mode) & 0xFF, (~mode >> 8) & 0xFF, (mode >> 16) & 0xFF}</code><br />
|}<br />
<br />
=== sceSysconEnableHibernateIOForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0x4946538A<br />
|}<br />
<br />
<source lang="C">int sceSysconEnableHibernateIOForDriver(int a1);</source><br />
<br />
=== sceSysconWaitReadyForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0x55DF1C9B<br />
|}<br />
<br />
Temp name was sceSysconWaitInitializedForDriver.<br />
<br />
<source lang="c">int sceSysconWaitReadyForDriver(void);</source><br />
<br />
=== sceSysconCmdSyncForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x6E517D22<br />
|}<br />
<br />
<source lang="c">int sceSysconCmdSyncForDriver(SceSysconPacket *packet, int noWait);</source><br />
<br />
=== sceSysconCmdExecForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x9ADDCA4A<br />
|}<br />
<br />
<source lang="c">int sceSysconCmdExecForDriver(SceSysconPacket *packet, unsigned int flags);</source><br />
<br />
=== sceSysconCmdExecAsyncForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xC2224E82<br />
|}<br />
<source lang="c">int sceSysconCmdExecAsyncForDriver(SceSysconPacket *packet, u32 flags, int (*callback)(SceSysconPacket *, void *), void *argp);</source><br />
<br />
=== sceSysconCtrlSdPowerForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xBE1ADE4F<br />
|}<br />
<br />
If Syscon version is strictly lower than 0x40000, it does nothing and returns 0. Calls Syscon command 0x888.<br />
<br />
Enables/disables GameCard reader.<br />
<br />
Used in [[SceSdstor]].<br />
<br />
<source lang="c"><br />
// param: 1 = enable SD (GameCard reader) power, 0 = disable SD (GameCard reader) power<br />
int sceSysconCtrlSdPowerForDriver(SceUInt16 param);<br />
</source><br />
<br />
=== sceSysconCtrlWirelessPowerForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.995.000 || 0x4FBDA504<br />
|-<br />
| 0.996.090-3.740.011 || not present<br />
|}<br />
<br />
If Syscon version is strictly lower than 0x40000, it does nothing and returns 0. Calls Syscon command 0x88A.<br />
<br />
Replaced by function [[#sceSysconCtrlWirelessPower2ForDriver]].<br />
<br />
<source lang="C">int sceSysconCtrlWirelessPowerForDriver(SceUInt16 param);</source><br />
<br />
=== sceSysconCtrlWirelessPower2ForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0xA2E85DB9<br />
|}<br />
<br />
Replacement function for [[#sceSysconCtrlWirelessPowerForDriver]]. Calls Syscon command 0x88A.<br />
<br />
<source lang="C">int sceSysconCtrlWirelessPower2ForDriver(SceUInt16 param);</source><br />
<br />
=== sceSysconCtrlWirelessPowerDownForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.995.000 || 0xDF8C6D2D<br />
|-<br />
| 0.996.090-3.740.011 || not present<br />
|}<br />
<br />
If motherboard is not "hardware info third byte 0x10" (probably IRS-001), it does nothing and returns 0, probably because missing hardware. Calls Syscon command 0xB1. Wireless power down might be a button to enable/disable Wireless, like on PSP.<br />
<br />
<source lang="C">int sceSysconCtrlWirelessPowerDownForDriver(SceUInt16 param);</source><br />
<br />
=== sceSysconVerifyConfigstorageScriptForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.990.000 || not present<br />
|-<br />
| 0.995.000-3.740.011 || 0xCC6F90A8<br />
|}<br />
<br />
This function is not used in the OS and anyway it would always return error because it calls a command that is not implemented in Syscon FW.<br />
<br />
<source lang="C">int sceSysconVerifyConfigstorageScriptForDriver(int a1, void *pScript, SceSize size);</source><br />
<br />
=== sceSysconLoadConfigstorageScriptForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.990.000 || not present<br />
|-<br />
| 0.995.000-3.740.011 || 0x89C5CFD6<br />
|}<br />
<br />
The OS uses this function to change between modes: IDU mode, Show Mode, no mode. This works by spoofing or rewriting [[KBL Param#Hardware Info|Hardware Info]]. This is reboot persistent.<br />
<br />
<source lang="C">int sceSysconLoadConfigstorageScriptForDriver(int a1, void *pScript, SceSize size);</source><br />
<br />
=== sceSysconBeginConfigstorageTransactionForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0xA4968B8C<br />
|}<br />
<br />
<source lang="C">int sceSysconBeginConfigstorageTransactionForDriver(void);</source><br />
<br />
=== sceSysconCommitConfigstorageTransactionForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0x7B9B3617<br />
|}<br />
<br />
<source lang="C">int sceSysconCommitConfigstorageTransactionForDriver(void);</source><br />
<br />
=== sceSysconEndConfigstorageTransactionForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0xFCC3E8EE<br />
|}<br />
<br />
<source lang="C">int sceSysconEndConfigstorageTransactionForDriver(void);</source><br />
<br />
=== sceSysconSetDebugHandlersForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xF245CD6F<br />
|}<br />
<br />
<source lang="c"><br />
/** A set of debug handlers for syscon, that you can set in sceSysconSetDebugHandlersForDriver(). */<br />
typedef struct SceSysconDebugHandlers {<br />
/** Structure size (probably, unused). */<br />
s32 size;<br />
/** Callback ran right before running a packet, with a pointer to it passed as the first argument. */<br />
void (*start)(SceSysconPacket *packet);<br />
/** Callback ran right after finishing running a packet, with a pointer to it passed as the first argument. */<br />
void (*end)(SceSysconPacket *packet);<br />
} SceSysconDebugHandlers;<br />
<br />
int sceSysconSetDebugHandlersForDriver(SceSysconDebugHandlers *debug_handlers);<br />
</source><br />
<br />
=== sceSysconGetBatteryCalibDataForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.36 || not present<br />
|-<br />
| 3.500.011-3.740.011 || 0x9ADC9936<br />
|}<br />
<br />
<source lang="C">int sceSysconGetBatteryCalibDataForDriver(int *piData1, int *piData2, int *piData3, int *piData4);</source><br />
<br />
=== sceSysconGetTouchpanelDeviceInfoForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xF492E69E<br />
|}<br />
<br />
<source lang="C"><br />
typedef struct SceKernelTouchpanelDeviceInfo { // size is 8 bytes<br />
uint16_t FrontVendorID;<br />
uint16_t FrontFirmwareRev;<br />
uint16_t RearVendorID;<br />
uint16_t RearFirmwareRev;<br />
} SceKernelTouchpanelDeviceInfo;<br />
<br />
int sceSysconGetTouchpanelDeviceInfoForDriver(SceKernelTouchpanelDeviceInfo *pInfo);<br />
</source><br />
<br />
=== sceSysconGetTouchpanelDeviceInfo2ForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.50 || not present<br />
|-<br />
| 1.690.011-3.740.011 || 0x030D447F<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Returns extended touchpanel info.<br />
<br />
<source lang="C"><br />
// this is a guessed name<br />
typedef struct SceKernelTouchpanelInfo { // size is 0xA bytes<br />
SceUInt16 vendorID;<br />
SceUInt16 firmwareRev;<br />
SceUInt16 configRev;<br />
SceUInt8 hwVersion;<br />
SceUInt8 vendorInfo;<br />
SceUInt16 reserved;<br />
} SceKernelTouchpanelInfo;<br />
<br />
// this is a guessed name<br />
typedef struct SceKernelTouchpanelDeviceInfo2 { // size is 0x14 bytes<br />
SceKernelTouchpanelInfo front;<br />
SceKernelTouchpanelInfo rear;<br />
} SceKernelTouchpanelDeviceInfo2;<br />
<br />
int sceSysconGetTouchpanelDeviceInfo2ForDriver(SceKernelTouchpanelDeviceInfo2 *pInfo);<br />
</source><br />
<br />
=== sceSysconMotionGetDeviceInfoForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xD01E64FC<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Returns motion sensor device info. See [[SceMotionDev#sceMotionDevGetDeviceInfoForDriver]] to reverse the pInfo structure.<br />
<br />
<source lang="C">int sceSysconMotionGetDeviceInfoForDriver(void *pInfo);</source><br />
<br />
=== sceSysconGetHardwareInfoForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xCBD6D8BC<br />
|}<br />
<br />
Returns [[KBL Param#Hardware Info|Hardware Info]] obtained from Syscon command 0x5.<br />
<br />
<source lang="C">int sceSysconGetHardwareInfoForDriver(void);</source><br />
<br />
=== sceSysconGetHardwareInfo2ForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0x965C68C3<br />
|}<br />
<br />
Returns [[KBL Param#Hardware Info 2|Hardware Info 2]] obtained from Syscon command 0x6.<br />
<br />
This function was certainly added for PS Vita Slim or PS TV support because [[KBL Param#Hardware Info|Hardware Info]] risked being fulfilled if too many hardware revisions were made.<br />
<br />
Used in [[SceAudio#SceAudioIn|SceAudioIn]] (maybe to check Conexant IC), [[SceCodec]] (maybe to check Conexant IC), and [[SceVshBridge#vshSysconGetHardwareInfo2|_vshSysconGetHardwareInfo2]].<br />
<br />
<source lang="C"><br />
typedef struct SceKernelHardwareInfo2 {<br />
SceUInt8 flags[0x10];<br />
} SceKernelHardwareInfo2;<br />
<br />
int sceSysconGetHardwareInfo2ForDriver(SceKernelHardwareInfo2 *pInfo);<br />
</source><br />
<br />
=== sceSysconGetErnieVersionForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-3.740.011 || 0xFF86F4C5<br />
|}<br />
<br />
This is a guessed name. Temp name was sceSysconGetBaryonVersionForDriver.<br />
<br />
<source lang="c">int sceSysconGetErnieVersionForDriver(void);</source><br />
<br />
=== SceSysconForDriver_EBE3262C ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0xEBE3262C<br />
|}<br />
<br />
In [[SceSblPostSsMgr]], used just after [[#sceSysconGetErnieVersionForDriver]].<br />
<br />
Returns 8 bits of some Syscon Mode information. Bit 6 (from right) is Syscon DownLoader Mode flag. Bit 3 (from right) is Power Online flag.<br />
<br />
<source lang="C">SceUInt8 SceSysconForDriver_EBE3262C(void);</source><br />
<br />
=== sceSysconIsDownLoaderModeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0x9ADD60D2<br />
|}<br />
<br />
<source lang="C">int sceSysconIsDownLoaderModeForDriver(void);</source><br />
<br />
=== sceSysconIsDealDownLoaderModeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xB7BCC638<br />
|}<br />
<br />
<source lang="C">int sceSysconIsDealDownLoaderModeForDriver(void);</source><br />
<br />
=== sceSysconNopForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x0D0B6D25<br />
|}<br />
<br />
Maybe exits Syscon Deal DownLoader mode.<br />
<br />
<source lang="C">int sceSysconNopForDriver(void);</source><br />
<br />
=== sceSysconIsPowerOnlineForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x9DA2A5AB<br />
|}<br />
<br />
Returns true iff Syscon information bit 3 (from right) is set. See also [[#SceSysconForDriver_EBE3262C]].<br />
<br />
Used in many [[ScePower]] functions for example before setting display brightness (to save battery).<br />
<br />
<source lang="C">SceBool sceSysconIsPowerOnlineForDriver(void);</source><br />
<br />
=== sceSysconGetErnieDLVersionForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xD2F456DC<br />
|}<br />
<br />
Calls Syscon command 0x1100.<br />
<br />
<source lang="C">void sceSysconGetErnieDLVersionForDriver(int *pVersion);</source><br />
<br />
=== sceSysconGetBatteryVersionForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x68E0031E<br />
|}<br />
<br />
Battery IC name: if HWinfo > 7 "Abby" else "Bert".<br />
<br />
<source lang="C">int sceSysconGetBatteryVersionForDriver(SceUInt16 *HWinfo, SceUInt16 *FWinfo, SceUInt16 *DFinfo);</source><br />
<br />
=== sceSysconAbbySyncForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.81 || not present<br />
|-<br />
| 2.000.081-3.740.011 || 0xDFB024C4<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">int sceSysconAbbySyncForDriver(SceUInt32 *puiStatus);</source><br />
<br />
=== sceSysconGetManufacturesStatusForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.692.000 || not present<br />
|-<br />
| 1.800.071-3.740.011 || 0x3E09A1F4<br />
|}<br />
<br />
In theory, this function should only be called when Product Mode is already set.<br />
<br />
<source lang="C">int sceSysconGetManufacturesStatusForDriver(int *piStatus);</source><br />
<br />
=== sceSysconReadScratchPadForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x299B1CE7<br />
|}<br />
<br />
Temp name was sceSysconReadCommandForDriver, sceSysconVsReadDataForDriver.<br />
<br />
Calls Syscon command 0x90.<br />
<br />
Used in [[SceRtc]].<br />
<br />
See also [[Ernie#Syscon_Scratch_Pad|Syscon Scratchpad structure]].<br />
<br />
<source lang="C"><br />
// size: On FW 3.60, must be between 0 and 0x18. On FW 0.931, must be 2, 4 or 8.<br />
// offset: Must be between 0 and 0xFF.<br />
// offset + size must not exceed 0x100<br />
int sceSysconReadScratchPadForDriver(SceUInt32 offset, void *buffer, SceSize size);<br />
</source><br />
<br />
=== sceSysconWriteScratchPadForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xE26488B9<br />
|}<br />
<br />
Temp name was sceSysconSendCommandForDriver, sceSysconVsWriteDataForDriver.<br />
<br />
Calls Syscon command 0x91.<br />
<br />
Used in [[SceRtc]] and [[ScePower]].<br />
<br />
See also [[Ernie#Syscon_Scratch_Pad|Syscon Scratchpad structure]].<br />
<br />
<source lang="C"><br />
// size: On FW 3.60, must be between 0 and 0x18. On FW 0.931, must be 2, 4 or 8.<br />
// offset: Must be between 0 and 0xFF.<br />
// offset + size must not exceed 0x100<br />
int sceSysconWriteScratchPadForDriver(SceUInt32 offset, void *buffer, SceSize size);<br />
</source><br />
<br />
=== sceSysconNvsSetRunModeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x81A6060D<br />
|}<br />
<br />
Used in [[SceSblSsMgr#sceSblNvsReadDataForKernel|sceSblNvsReadDataForKernel]] and [[SceSblSsMgr#sceSblNvsWriteDataForKernel|sceSblNvsWriteDataForKernel]].<br />
<br />
<source lang="C"><br />
// mode: 0 before NVS read/write<br />
int sceSysconNvsSetRunModeForDriver(int mode);<br />
</source><br />
<br />
=== sceSysconNvsSetUnkModeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x2EC6D55D<br />
|}<br />
<br />
<source lang="C"><br />
// mode: unk<br />
int sceSysconNvsSetUnkModeForDriver(int mode);<br />
</source><br />
<br />
=== sceSysconNvsReadDataForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xACAFA2B8<br />
|}<br />
<br />
Used in [[SceSblSsMgr#sceSblNvsReadDataForKernel|sceSblNvsReadDataForKernel]] and [[SceSblSsMgr#sceSblSsGetNvsDataForDriver|sceSblSsGetNvsDataForDriver]].<br />
<br />
<source lang="C">int sceSysconNvsReadDataForDriver(SceUInt32 offset, void *buffer, SceSize size);</source><br />
<br />
=== sceSysconNvsWriteDataForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x10C9657A<br />
|}<br />
<br />
Used in [[SceSblSsMgr#sceSblNvsWriteDataForKernel|sceSblNvsWriteDataForKernel]] and [[SceSblSsMgr#sceSblSsSetNvsDataForDriver|sceSblSsSetNvsDataForDriver]].<br />
<br />
<source lang="C">int sceSysconNvsWriteDataForDriver(SceUInt32 offset, void *buffer, SceSize size);</source><br />
<br />
=== sceSysconGetMultiCnInfoForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x1503D6A0<br />
|}<br />
<br />
Returns data obtained by Syscon command 0x103.<br />
<br />
Returns 0x4ff00 when nothing is connected.<br />
<br />
Returns 0x40080 when pin 11 is pulled to GND.<br />
<br />
Returns 0x40680 when pin 12 is pulled to GND.<br />
<br />
Returns 0x40380 when pin 12 is pulled to GND while pin 11 pulled to ground via 100K resistor.<br />
<br />
Returns 0x40000 on PSTV<br />
<br />
Bits 8 and 9 indicate that an audio-out dock is connected.<br />
<br />
Bits 8, 9, 11, 12, 13, 14 and 15 indicate that [[UDC]] pins are connected.<br />
<br />
Used in [[SceHpremote]], [[SceUsbServ]].<br />
<br />
<source lang="C">int sceSysconGetMultiCnInfoForDriver(SceUInt32 *pInfo);</source><br />
<br />
=== sceSysconSetMultiCnPortForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x8AAB6308<br />
|}<br />
<br />
Used in [[SceSblPostSsMgr]].<br />
<br />
<source lang="C"><br />
// port: 0: for JIG mode, 1 for UART0 logging mode, 0x10000: for normal mode<br />
int sceSysconSetMultiCnPortForDriver(int port);<br />
</source><br />
<br />
=== sceSysconConfigLEDForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.996.090-3.740.011 || 0x6F586D1A<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Used in [[ScePower]].<br />
<br />
<source lang="C"><br />
#define DEVICE_UNK 0x40 // maybe PS button or CP power LED or maybe color (blue)<br />
<br />
// unk: SceLedConfig.unk_4<br />
<br />
int sceSysconConfigLEDForDriver(int device, SceUInt32 unk);<br />
</source><br />
<br />
=== SceSysconForDriver_9CA6EB70 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 1.000.071-3.740.011 || 0x9CA6EB70<br />
|}<br />
<br />
On motherboards IRT-001 and older, it does nothing and returns 0, probably because missing hardware that could be a LED, else it sends 2 bytes using Syscon command 0x89E.<br />
<br />
Used in [[ScePower#ScePowerForDriver_38415146]]. Related to LED.<br />
<br />
<source lang="C">int SceSysconForDriver_9CA6EB70(SceBool state);</source><br />
<br />
=== sceSysconCtrlAccPowerForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x8D1D97E8<br />
|}<br />
<br />
<source lang="C">int sceSysconCtrlAccPowerForDriver(SceBool enable);</source><br />
<br />
=== sceSysconCtrlUsbStatusForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x59DC5938<br />
|}<br />
<br />
Sends 3 bytes to Syscon command 0x89A.<br />
<br />
Related to [[SceUdcd]] and [[ScePower]].<br />
<br />
<source lang="C">int sceSysconCtrlUsbStatusForDriver(SceUInt32 value);</source><br />
<br />
=== sceSysconCtrlRMRPowerForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0x710A7CF0<br />
|}<br />
<br />
Temp name was sceSysconCtrlMsPowerForDriver.<br />
<br />
<source lang="c">int sceSysconCtrlRMRPowerForDriver(int enable_power);</source><br />
<br />
=== sceSysconCtrlDevKitUsbPowerForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0xB1F88B11<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">int sceSysconCtrlDevKitUsbPowerForDriver(SceBool enable);</source><br />
<br />
=== SceSysconForDriver_3274A925 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.692.000 || not present<br />
|-<br />
| 1.800.071-3.740.011 || 0x3274A925<br />
|}<br />
<br />
Temp name was sceSysconCtrlDolceUsbPowerForDriver.<br />
<br />
This function enables/disables a USB bus related to either PS Vita IRS-1001 Wlan/Bt module USB or PS Vita 3G modem USB. This also affects PS TV USB host and maybe also PS TV ethernet.<br />
<br />
Used in [[SceUsbEtherSmsc]], [[SceUsbServ]].<br />
<br />
This function was maybe added to support IRS-1001 motherboard.<br />
<br />
<source lang="C">int SceSysconForDriver_3274A925(SceBool enable);</source><br />
<br />
=== sceSysconJigOpenPortForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x44A173F5<br />
|}<br />
<br />
<source lang="C">int sceSysconJigOpenPortForDriver(void);</source><br />
<br />
=== sceSysconJigClosePortForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x483FAE05<br />
|}<br />
<br />
<source lang="C">int sceSysconJigClosePortForDriver(void);</source><br />
<br />
=== sceSysconJigSetConfigForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xD24BF916<br />
|}<br />
<br />
<source lang="C">int sceSysconJigSetConfigForDriver(SceUInt8 a1, SceUInt8 a2);</source><br />
<br />
=== sceSysconOutputClockForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x058941D7<br />
|}<br />
<br />
Sends 2 bytes to Syscon using Syscon command 0xB0.<br />
<br />
=== sceSysconCtrlHostOutputViaDongleForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0xDECCB2B4<br />
|}<br />
<br />
Enables / disables Kermit UART0 output (logs) via Dongle (Jig).<br />
<br />
Sends 2 bytes to Syscon using Syscon command 0xB2.<br />
<br />
<source lang="C">int sceSysconCtrlHostOutputViaDongleForDriver(SceBool enable);</source><br />
<br />
=== SceSysconForDriver_33B5CDB3 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.996.090-3.740.011 || 0x33B5CDB3<br />
|}<br />
<br />
Reads from Syscon using Syscon command 0xB3.<br />
<br />
This function was probably added to support IRS-002 motherboard.<br />
<br />
=== SceSysconForDriver_F6D4DDC4 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.692.000 || not present<br />
|-<br />
| 1.800.071-3.740.011 || 0xF6D4DDC4<br />
|}<br />
<br />
Reads from Syscon using Syscon command 0xB4. It is probably the "get" equivalent of [[#SceSysconForDriver_00AE3AEB]].<br />
<br />
This function was added to support IRS-1001 motherboard.<br />
<br />
=== SceSysconForDriver_00AE3AEB ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.692.000 || not present<br />
|-<br />
| 1.800.071-3.740.011 || 0x00AE3AEB<br />
|}<br />
<br />
It is probably a "sceSysconCtrl...ForDriver" function.<br />
<br />
Sends 2 bytes to Syscon using Syscon command 0xB5. It is probably the "set" equivalent of [[#SceSysconForDriver_F6D4DDC4]].<br />
<br />
This function was added to support IRS-1001 motherboard.<br />
<br />
=== SceSysconForDriver_0D300158 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.100.081-3.740.011 || 0x0D300158<br />
|}<br />
<br />
It is probably a "sceSysconCtrl...ForDriver" function.<br />
<br />
Sends 2 bytes to Syscon using Syscon command 0xB6. It is probably the "set" equivalent of [[#SceSysconForDriver_91EF4EC3]].<br />
<br />
This function was added to support DOL-1002 motherboard.<br />
<br />
=== SceSysconForDriver_91EF4EC3 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.100.081-3.740.011 || 0x91EF4EC3<br />
|}<br />
<br />
Reads from Syscon using Syscon command 0xB7. It is probably the "get" equivalent of [[#SceSysconForDriver_0D300158]].<br />
<br />
This function was added to support DOL-1002 motherboard.<br />
<br />
=== receive_pm_sm_jig_msg_from_syscon ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x3C80B529<br />
|}<br />
<br />
<source lang="C">int receive_pm_sm_jig_msg_from_syscon(SceUInt32 offset, SceSize size, void *buf);</source><br />
<br />
=== send_pm_sm_jig_msg_to_syscon ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x7BFBA09E<br />
|}<br />
<br />
=== send_pm_sm_stop_to_syscon ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x933D813F<br />
|}<br />
<br />
Used just after send_pm_sm_jig_msg_to_syscon or when it fails before.<br />
<br />
<source lang="C">int send_pm_sm_stop_to_syscon(int a1, int a2, int a3);</source><br />
<br />
=== sceSysconIduModeSetForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.996.090 || not present<br />
|-<br />
| 1.030.071-3.740.011 || 0x956D07CB<br />
|}<br />
<br />
<source lang="C">int sceSysconIduModeSetForDriver(void);</source><br />
<br />
=== sceSysconIduModeClearForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.996.090 || not present<br />
|-<br />
| 1.030.071-3.740.011 || 0x34574496<br />
|}<br />
<br />
<source lang="C">int sceSysconIduModeClearForDriver(void);</source><br />
<br />
=== sceSysconShowModeSetForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.50 || not present<br />
|-<br />
| 1.600.061-3.740.011 || 0x6D65B70F<br />
|}<br />
<br />
<source lang="C">int sceSysconShowModeSetForDriver(void);</source><br />
<br />
=== sceSysconShowModeClearForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.50 || not present<br />
|-<br />
| 1.600.061-3.740.011 || 0x8D7724C0<br />
|}<br />
<br />
<source lang="C">int sceSysconShowModeClearForDriver(void);</source><br />
<br />
=== sceSysconSetWlanCallbackForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.996.090 || 0x4DEB8712<br />
|-<br />
| 1.03-3.740.011 || not present<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Registers a Wlan-related callback.<br />
<br />
index 5 on FWs 0.931.010-0.940.<br />
<br />
=== SceSysconForDriver_18A6F4D9 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x18A6F4D9<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
index 0 on FW 3.600.011.<br />
<br />
No use case seen.<br />
<br />
Related to [[#SceSysconForDriver_C0F215B7]].<br />
<br />
<source lang="C">int SceSysconForDriver_18A6F4D9(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_DE613081 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xDE613081<br />
|}<br />
<br />
A guessed name is sceSysconSetHeadphoneCallbackForDriver.<br />
<br />
Registers an headphone remote related callback.<br />
<br />
index 1 on FW 3.600.011.<br />
<br />
Used in [[SceHpremote]].<br />
<br />
Related to [[#SceSysconForDriver_C3504ADE]].<br />
<br />
<source lang="C">int SceSysconForDriver_DE613081(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_229A07C2 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x229A07C2<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
index 2 on FW 3.600.011.<br />
<br />
No use case seen.<br />
<br />
Related to [[#SceSysconForDriver_B832B72C]].<br />
<br />
<source lang="C">int SceSysconForDriver_229A07C2(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_8351526D ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x8351526D<br />
|}<br />
<br />
A guessed name is sceSysconSetAlarmTimerCallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
index 3 on FW 3.600.011.<br />
<br />
Used in [[SceRtc]].<br />
<br />
Related to [[#SceSysconForDriver_86BAAF7D]].<br />
<br />
<source lang="C">int SceSysconForDriver_8351526D(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_9F8340FF ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x9F8340FF<br />
|}<br />
<br />
A guessed name is sceSysconSetResumeRequestCallbackForDriver.<br />
<br />
Registers the "is resume requested" callback.<br />
<br />
Used in [[ScePower]] to register a callback that sets the [[ScePower]] global variable g_resume_requested to SCE_TRUE.<br />
<br />
index 4 on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_A57B5433]].<br />
<br />
<source lang="C">int SceSysconForDriver_9F8340FF(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_35E1689F ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x35E1689F<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
Used in [[SceHpremote]].<br />
<br />
index 5 on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_ACC7F71E]].<br />
<br />
<source lang="C">int SceSysconForDriver_35E1689F(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_474A9EA7 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x474A9EA7<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
index 0xC on FWs 0.931.010-0.940. index 6 on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_769F9AC4]].<br />
<br />
No use case seen.<br />
<br />
<source lang="C">int SceSysconForDriver_474A9EA7(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_4E88B4D9 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x4E88B4D9<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
index 8 on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_4BC63A40]].<br />
<br />
No use case seen. Maybe used in internal modules for Jig.<br />
<br />
<source lang="C">int SceSysconForDriver_4E88B4D9(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_376CCCB8 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x376CCCB8<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
index 9 on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_99A254A9]].<br />
<br />
No use case seen.<br />
<br />
<source lang="C">int SceSysconForDriver_376CCCB8(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_3BAAC8A9 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.995.000 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0x3BAAC8A9<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
index 0xA on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_9A4F4B7C]].<br />
<br />
No use case seen.<br />
<br />
<source lang="C">int SceSysconForDriver_3BAAC8A9(void *cb_0, void *cb_1);</source><br />
<br />
=== sceSysconSetAccCallbackForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.995.000-3.740.011 || 0x4A42712F<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Registers 2 callbacks (maybe constructor and destructor or callback and args) for accessory port.<br />
<br />
index 0xF on FW 3.600.011.<br />
<br />
Used in [[SceUsbServ]].<br />
<br />
<source lang="C">int sceSysconSetAccCallbackForDriver(void *cb_0, void *cb_1);</source><br />
<br />
=== sceSysconSetLowBatteryCallbackForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x3F0DB7C0<br />
|}<br />
<br />
Registers the low-battery callback.<br />
<br />
index 6 on FWs 0.931-0.940. index 0x10 on FW 3.600.011.<br />
<br />
<source lang="C">int sceSysconSetLowBatteryCallbackForDriver(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_80D6E061 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.000.071-3.740.011 || 0x80D6E061<br />
|}<br />
<br />
A guessed name is sceSysconSetBatteryOnlineCallbackForDriver.<br />
<br />
Registers a callback. Maybe related to Battery online status.<br />
<br />
index 0x11 on FW 3.600.011.<br />
<br />
<source lang="C">int SceSysconForDriver_80D6E061(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_7682FE69 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.000.071-3.740.011 || 0x7682FE69<br />
|}<br />
<br />
A guessed name is sceSysconSet...Battery...CallbackForDriver.<br />
<br />
Registers a battery-related callback.<br />
<br />
No use case seen.<br />
<br />
index 0x12 on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_4A184B7C]].<br />
<br />
<source lang="C">int SceSysconForDriver_7682FE69(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_E0D52DF0 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xE0D52DF0<br />
|}<br />
<br />
A guessed name is sceSysconSet...Battery...CallbackForDriver.<br />
<br />
Registers a battery-related callback.<br />
<br />
No use case seen.<br />
<br />
index 0x13 on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_ACEE1C70]].<br />
<br />
<source lang="C">int SceSysconForDriver_E0D52DF0(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_2D471528 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 1.000.071-3.740.011 || 0x2D471528<br />
|}<br />
<br />
A guessed name is sceSysconSet...Battery...CallbackForDriver.<br />
<br />
Registers a callback very similar to the low battery callback.<br />
<br />
Used in [[ScePower]].<br />
<br />
index 0x14 on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_03C50DC3]].<br />
<br />
<source lang="C">int SceSysconForDriver_2D471528(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_129EA022 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0x129EA022<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
Used in [[ScePower]].<br />
<br />
index 0x15 on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_BFDA5590]].<br />
<br />
<source lang="C">int SceSysconForDriver_129EA022(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_85E5DEBF ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.996.090 || not present<br />
|-<br />
| 1.000.071-3.740.011 || 0x85E5DEBF<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
index 0x16 on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_63B14156]].<br />
<br />
No use case seen.<br />
<br />
<source lang="C">int SceSysconForDriver_85E5DEBF(void *cb_0, void *cb_1);</source><br />
<br />
=== sceSysconSetThermalAlertCallbackForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.996.090 || not present<br />
|-<br />
| 1.000.071-3.740.011 || 0x773B8126<br />
|}<br />
<br />
Registers the thermal alert callback.<br />
<br />
index 0x17 on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_50CAE242]].<br />
<br />
<source lang="C">int sceSysconSetThermalAlertCallbackForDriver(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_2E4BA4B8 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x2E4BA4B8<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
index 0x19 on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_29CF4335]].<br />
<br />
No use case seen. Maybe used in internal modules for Jig.<br />
<br />
<source lang="C">int SceSysconForDriver_2E4BA4B8(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_C442D0BE ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.692.000 || not present<br />
|-<br />
| 1.800.071-3.740.011 || 0xC442D0BE<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
index 0x1A on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_9F4042F8]].<br />
<br />
No use case seen.<br />
<br />
<source lang="C">int SceSysconForDriver_C442D0BE(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_61AE3970 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.01 || not present<br />
|-<br />
| 3.100.081-3.740.011 || 0x61AE3970<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
index 0x1B on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_C50568E9]].<br />
<br />
No use case seen.<br />
<br />
<source lang="C">int SceSysconForDriver_61AE3970(void *cb_0, void *cb_1);</source><br />
<br />
=== sceSysconSetLowBatteryInhibitUpdateRebootCallbackForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.18 || not present<br />
|-<br />
| 3.300.041-3.740.011 || 0x94678881<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Registers the low-battery-inhibit-update-reboot callback.<br />
<br />
index 0x1C on FW 3.600.011.<br />
<br />
No use case seen.<br />
<br />
<source lang="C">int sceSysconSetLowBatteryInhibitUpdateRebootCallbackForDriver(void *cb_0, void *cb_1);</source><br />
<br />
=== sceSysconSetLowBatteryInhibitUpdateDownloadCallbackForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.18 || not present<br />
|-<br />
| 3.300.041-3.740.011 || 0x7AA00C01<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Registers the low-battery-inhibit-update-download callback.<br />
<br />
index 0x1D on FW 3.600.011.<br />
<br />
No use case seen.<br />
<br />
<source lang="C">int sceSysconSetLowBatteryInhibitUpdateDownloadCallbackForDriver(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_423D0C58 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x423D0C58<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
index 0x20 on FW 3.600.011.<br />
<br />
No use case seen.<br />
<br />
<source lang="C">int SceSysconForDriver_423D0C58(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_154676F1 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x154676F1<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
index 0x21 on FW 3.600.011.<br />
<br />
No use case seen.<br />
<br />
<source lang="C">int SceSysconForDriver_154676F1(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_63352A39 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x63352A39<br />
|}<br />
<br />
A guessed name is sceSysconSetMicrophoneCallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
index 0x22 on FW 3.600.011.<br />
<br />
Used in [[SceHpremote]].<br />
<br />
<source lang="C">int SceSysconForDriver_63352A39(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_14730196 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x14730196<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
index 0x23 on FW 3.600.011.<br />
<br />
No use case seen.<br />
<br />
<source lang="C">int SceSysconForDriver_14730196(void *cb_0, void *cb_1);</source><br />
<br />
=== sceSysconSetAlarmCallbackForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x32418370<br />
|}<br />
<br />
Registers the alarm callback.<br />
<br />
index 0 on FWs 0.931.010-0.940. index 0x24 on FW 3.600.011.<br />
<br />
<source lang="C">int sceSysconSetAlarmCallbackForDriver(void *cb_0, void *cb_1);</source><br />
<br />
=== sceSysconSetMultiCnOtgCallbackForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0xA26586B2<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Registers 2 callbacks (maybe constructor and destructor or callback and args) for multi-connector OTG on PS Vita Fat.<br />
<br />
index 0x25 on FW 3.600.011.<br />
<br />
Used in [[SceUsbServ]].<br />
<br />
<source lang="C">int sceSysconSetMultiCnOtgCallbackForDriver(void *cb_0, void *cb_1);</source><br />
<br />
=== sceSysconSetMiniUsbOtgCallbackForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0x67A4CB9F<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Registers 2 callbacks (maybe constructor and destructor or callback and args) for mini-USB OTG on PS Vita Slim.<br />
<br />
index 0x26 on FW 3.600.011.<br />
<br />
Used in [[SceUsbServ]].<br />
<br />
<source lang="C">int sceSysconSetMiniUsbOtgCallbackForDriver(void *cb_0, void *cb_1);</source><br />
<br />
=== sceSysconUpdaterSetSegmentForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x9B00BC7F<br />
|}<br />
<br />
<source lang="C"><br />
// segment_no: a 8bit value<br />
int sceSysconUpdaterSetSegmentForDriver(SceUInt32 segment_no);<br />
</source><br />
<br />
=== sceSysconUpdaterLoadSegmentForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x356B9696<br />
|}<br />
<br />
<source lang="C"><br />
// pSegment: the encrypted segment to load<br />
// unk: maybe segment_no<br />
// size: usually 0x400<br />
int sceSysconUpdaterLoadSegmentForDriver(void *segment, int unk, SceSize size);<br />
</source><br />
<br />
=== sceSysconUpdaterLoadSegment2ForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x734544E4<br />
|}<br />
<br />
<source lang="C"><br />
// pSegment: the encrypted segment to load<br />
// unk: maybe segment_no<br />
// size: usually 0x400<br />
int sceSysconUpdaterLoadSegment2ForDriver(void *segment, int unk, SceSize size);<br />
</source><br />
<br />
=== sceSysconUpdaterCalcChecksumForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xD27C3D80<br />
|}<br />
<br />
Computes checksum to use with [[#sceSysconUpdaterExecProgrammingForDriver]]. It does not call any Syscon command.<br />
<br />
<source lang="C">int sceSysconUpdaterCalcChecksumForDriver(void *data, SceSize size, int *checksum);</source><br />
<br />
=== sceSysconUpdaterExecProgrammingForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x69AD76E4<br />
|}<br />
<br />
Executes programming, i.e writes segments to Syscon Flash memory.<br />
<br />
<source lang="C"><br />
// checksum: value got from sceSysconUpdaterCalcChecksumForDriver<br />
int sceSysconUpdaterExecProgrammingForDriver(int checksum);<br />
</source><br />
<br />
=== sceSysconUpdaterSetRunModeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xB487C2FB<br />
|}<br />
<br />
On 3.60 Ernie firmware, only updater run mode 0x72BA seems to be actually useful. Modes 0x9A54 and 0x152E are recognized but just make the function return without doing anything. Mode 0xC5E7 is not recognized by Ernie firmware, although it is present on ARM side.<br />
<br />
<source lang="C"><br />
// mode: 0x72BA (0.931.010-3.740.011), 0x9A54 (0.931.010-3.740.011), 0x152E (3.600.011-3.740.011), 0x3665 (3.600.011-3.740.011), 0xC5E7 (3.600.011-3.740.011), <br />
int sceSysconUpdaterSetRunModeForDriver(int mode);<br />
</source><br />
<br />
=== sceSysconUpdaterExecFinalizeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xC7747A63<br />
|}<br />
<br />
<source lang="C"><br />
// digest: sha1 of decrypted concatenated segments, comes from Syscon Update package packet type 0x20<br />
// size: usually 0x14 (sha1 size)<br />
int sceSysconUpdaterExecFinalizeForDriver(void *digest, SceSize size);<br />
</source><br />
<br />
=== SceSysconForDriver_CBA836FF ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0xCBA836FF<br />
|}<br />
<br />
Sends a 0x18-byte buffer to Syscon command 0x1185. This Syscon command 0x1185 seems to be unimplemented in recent Syscon firmwares: it does not do anything.<br />
<br />
<source lang="C"><br />
// size: must be 0x18<br />
int SceSysconForDriver_CBA836FF(void *pBuf, SceSize size);<br />
</source><br />
<br />
=== snvs_read ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0xEBDF88B9<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Used in [[SceSblPostSsMgr]] to read data from SNVS with [[pm_sm]] command 8. Also used in [[SceSblUpdateMgr]] with [[update_service_sm]] commands 0xB0002 and 0xC0002.<br />
<br />
<source lang="C"><br />
// in_size: 0x10<br />
// out_size: 0x30<br />
int snvs_read(void *in_buf, SceSize in_size, void *out_buf, SceSize out_size);<br />
</source><br />
<br />
=== snvs_write ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0x63683B9B<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Used in [[SceSblPostSsMgr]] to write data to SNVS with [[pm_sm]] command 8. Also used in [[SceSblUpdateMgr]] with [[update_service_sm]] commands 0xB0002 and 0xC0002.<br />
<br />
<source lang="C"><br />
// in_size: 0x30<br />
// out_size: 0x10<br />
int snvs_write(void *in_buf, SceSize in_size, void *out_buf, SceSize out_size);<br />
</source><br />
<br />
=== syscon_update_command_0xD00002 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0x4D03754A<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Calls Syscon command 0xD0.<br />
<br />
Used in [[SceSblUpdateMgr]] with [[update_service_sm]] command 0xD0002.<br />
<br />
<source lang="C"><br />
// in_buf: buffer that embeds input data, usually 0xD0002 command request + 8<br />
// in_size: usually 0x28<br />
// out_buf: buffer to receive result, usually 0xD0002 command request + 0x30<br />
// out_size: usually 0x28<br />
int syscon_update_command_0xD00002(void *in_buf, SceSize in_size, void *out_buf, SceSize out_size);<br />
</source><br />
<br />
=== sceSysconSetAffirmativeRertryModeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x901D6CD4<br />
|}<br />
<br />
Typo is the name is intentional.<br />
<br />
Sets a flag used internally by [[SceSyscon]].<br />
<br />
Used in [[SceCtrl]], [[ScePower]].<br />
<br />
<source lang="C">int sceSysconSetAffirmativeRertryModeForDriver(int enable);</source><br />
<br />
=== sceSysconGetControlsInfoForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x145F59A4<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
See [[KBL Param#Boot Controls Info|Boot Controls Info]].<br />
<br />
Calls Syscon command 0x100.<br />
<br />
<source lang="C">int sceSysconGetControlsInfoForDriver(SceUInt32 *pCtrl);</source><br />
<br />
=== SceSysconForDriver_76272CB9 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.692.000 || not present<br />
|-<br />
| 1.800.071-3.740.011 || 0x76272CB9<br />
|}<br />
<br />
Gets a 4 byte value.<br />
<br />
Calls Syscon command 0x120.<br />
<br />
<source lang="C">int SceSysconForDriver_76272CB9(SceUInt32 *unk);</source><br />
<br />
=== sceSysconGetClockForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xD7BEFF8B<br />
|}<br />
<br />
Gets Syscon power-on time in ticks of 0.5 second. Each second the counter automatically increases by 2.<br />
<br />
Calls Syscon command 0x11.<br />
<br />
Used in [[SceRtc]] to calculate the current time and date.<br />
<br />
<source lang="C">int sceSysconGetClockForDriver(SceUInt32 *puiTime);</source><br />
<br />
=== SceSysconForDriver_3168F3AF ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x3168F3AF<br />
|}<br />
<br />
Calls Syscon command 0x12.<br />
<br />
It is an alarm timer. It must be initialized using Syscon command 0x82 via [[#SceSysconForDriver_51164951]].<br />
<br />
<source lang="C"><br />
// FW 0.931.010<br />
int SceSysconForDriver_3168F3AF(SceUInt32 *pResult);<br />
<br />
// FW 3.600.011-3.740.011<br />
int SceSysconForDriver_3168F3AF(SceUInt32 *pResult, SceUInt32 *pResult2);<br />
</source><br />
<br />
=== SceSysconForDriver_BA09F171 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0xBA09F171<br />
|}<br />
<br />
Calls Syscon command 0x13.<br />
<br />
It might be related to alarm/timer.<br />
<br />
<source lang="C">int SceSysconForDriver_BA09F171(SceUInt32 *pResult, SceUInt32 *pResult2);</source><br />
<br />
=== sceSysconSetClockForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x9B6A6F64<br />
|}<br />
<br />
Calls Syscon command 0x81.<br />
<br />
Sets current Syscon power on time in ticks of 0.5 second. The set value can be get with [[#sceSysconGetClockForDriver]].<br />
<br />
Used in [[SceRtc]]. Set to 0 just before setting Current Tick, to reset syscon power on time.<br />
<br />
<source lang="C">int sceSysconSetClockForDriver(SceUInt32 time);</source><br />
<br />
=== SceSysconForDriver_51164951 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x51164951<br />
|}<br />
<br />
Calls Syscon command 0x82. On Syscon version < 0x90907, 4 bytes are sent to Syscon, whilst on Syscon version >= 0x90907, 5 bytes are sent to Syscon.<br />
<br />
Used in [[SceRtc#sceRtcSetAlarmTickForDriver]].<br />
<br />
The set value can be get with [[#SceSysconForDriver_3168F3AF]].<br />
<br />
<source lang="C"><br />
// a1: seen value: 0xffffffff during Syscon Init<br />
// a2: some 8-bit flag, seen value: 0 during Syscon Init<br />
<br />
// FW 0.931.010<br />
int SceSysconForDriver_51164951(int a1);<br />
<br />
// FW 3.600.011-3.740.011<br />
int SceSysconForDriver_51164951(int a1, int a2);<br />
</source><br />
<br />
=== SceSysconForDriver_373ECF8A ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0x373ECF8A<br />
|}<br />
<br />
Calls Syscon command 0x83. Sends 3 bytes to Syscon. Used only if [[KBL Param#Hardware Info|Hardware Info]] indicates that the motherboard is not IRT-001 or IRT-002 or type 0x10 (maybe named IRS-001) and if console is not in manufacturing mode.<br />
<br />
<source lang="C">int SceSysconForDriver_373ECF8A(SceUInt32 unk);</source><br />
<br />
=== SceSysconForDriver_2659535C ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0x2659535C<br />
|}<br />
<br />
Calls Syscon command 0x84. Sends 1 byte to Syscon: 0.<br />
<br />
<source lang="C">int SceSysconForDriver_2659535C(void);</source><br />
<br />
=== SceSysconForDriver_4295D497 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0x4295D497<br />
|}<br />
<br />
Calls Syscon command 0x85. Sends 1 byte to Syscon: 0.<br />
<br />
<source lang="C">int SceSysconForDriver_4295D497(void);</source><br />
<br />
=== SceSysconForDriver_253CC522 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0x253CC522<br />
|}<br />
<br />
Calls Syscon command 0x807. Gets 2 bytes from Syscon.<br />
<br />
On DevKit, it returns 0x8025023F. Maybe limited by model: PS TV? PS Vita Slim?.<br />
<br />
<source lang="C">int SceSysconForDriver_253CC522(SceUInt16 *pResult);</source><br />
<br />
=== SceSysconForDriver_175CE5A1 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x175CE5A1<br />
|}<br />
<br />
Calls Syscon command 0x883. Gets 8 bytes from Syscon.<br />
<br />
<source lang="C"><br />
// pDst: pointer to a buffer of at least 8 bytes<br />
int SceSysconForDriver_175CE5A1(void *pDst);<br />
</source><br />
<br />
=== sceSysconCtrlDeviceResetForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x40FF3898<br />
|}<br />
<br />
Sends 2 bytes to Syscon command 0x88F.<br />
<br />
0xC/0 : Touch Front or Back device<br />
<br />
0xC/1 : Touch Front or Back device<br />
<br />
<source lang="C">int sceSysconCtrlDeviceResetForDriver(SceUInt8 a1, SceUInt8 a2);</source><br />
<br />
=== SceSysconForDriver_285594F8 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x285594F8<br />
|}<br />
<br />
Sends 2 bytes to Syscon command 0x890.<br />
<br />
<source lang="C">int SceSysconForDriver_285594F8(SceUInt16 value);</source><br />
<br />
=== sceSysconCtrlLEDForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x04EC7579<br />
|}<br />
<br />
<source lang="C"><br />
#define STATE_ON 1<br />
#define STATE_OFF 0<br />
<br />
#define DEVICE_UNK 0x40 // maybe PS button or CP power LED or maybe color (blue)<br />
<br />
int sceSysconCtrlLEDForDriver(SceUInt16 device, SceBool state);<br />
</source><br />
<br />
=== sceSysconCtrlChargeACForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x596B17B7<br />
|}<br />
<br />
Sends 2 bytes to Syscon command 0x892. Related to Battery. Maybe enables/disables battery charging.<br />
<br />
Used in [[ScePower]]'s module_start.<br />
<br />
<source lang="C">int sceSysconCtrlChargeACForDriver(SceBool enable);</source><br />
<br />
=== sceSysconCtrlChargeVBUSForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x2A4B0437<br />
|}<br />
<br />
Sends 3 bytes to Syscon command 0x893. Related to Battery. Maybe enables/disables battery charging.<br />
<br />
Used in [[ScePower]]'s module_start.<br />
<br />
<source lang="C"><br />
// a1: ex: 0, 1<br />
// a2: ex: 0, 1<br />
<br />
// FW 0.931.010<br />
int sceSysconCtrlChargeVBUSForDriver(SceUInt32 a1);<br />
<br />
// FW 3.600.011-3.740.011<br />
int sceSysconCtrlChargeVBUSForDriver(SceUInt32 a1, SceUInt32 a2);<br />
</source><br />
<br />
=== SceSysconForDriver_5CDDA14D ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x5CDDA14D<br />
|}<br />
<br />
A guessed name is sceSysconCtrlHpremoteForDriver.<br />
<br />
If Syscon version < 0x80001, it does nothing and returns 0, else it sends 2 bytes to Syscon command 0x899.<br />
<br />
Maybe enables/disables Jack power.<br />
<br />
Used in [[SceHpremote]].<br />
<br />
<source lang="C">int SceSysconForDriver_5CDDA14D(SceBool enable);</source><br />
<br />
=== SceSysconForDriver_A2FE9BF9 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xA2FE9BF9<br />
|}<br />
<br />
Gets information related to battery charge status, or USB power connection. See also [[Ernie#CMD_0x0800]].<br />
<br />
Used in [[ScePower]]'s module_start.<br />
<br />
<source lang="C">int SceSysconForDriver_A2FE9BF9(void *pResult);</source><br />
<br />
=== sceSysconGetBatteryTempForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x9070F139<br />
|}<br />
<br />
If Syscon version <= 0x70503, it calls Syscon command 0x8A0, else Syscon command 0x981.<br />
<br />
Used in [[ScePower]]'s module_start.<br />
<br />
<source lang="C">int sceSysconGetBatteryTempForDriver(int *pResult);</source><br />
<br />
=== sceSysconGetBatteryRemainCapacityForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xC562AF3A<br />
|}<br />
<br />
Only used in [[ScePower]].<br />
<br />
If Syscon version <= 0x70503, it calls Syscon command 0x802, else Syscon command 0x900.<br />
<br />
<source lang="C">int sceSysconGetBatteryRemainCapacityForDriver(SceUInt32 *pResult);</source><br />
<br />
=== sceSysconGetBatteryVoltForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x03F11220<br />
|}<br />
<br />
If Syscon version <= 0x70503, it calls Syscon command 0x803, else Syscon command 0x901.<br />
<br />
Used in [[ScePower]].<br />
<br />
<source lang="C">int sceSysconGetBatteryVoltForDriver(SceUInt32 *pResult);</source><br />
<br />
=== sceSysconGetBatteryLifePercentForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.06 || not present<br />
|-<br />
| 1.500.151-3.740.011 || 0xAD0A8275<br />
|}<br />
<br />
Used in [[ScePower]].<br />
<br />
<source lang="C">int sceSysconGetBatteryLifePercentForDriver(SceUInt32 *pResult);</source><br />
<br />
=== SceSysconForDriver_00A65FC1 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x00A65FC1<br />
|}<br />
<br />
If Syscon version <= 0x70503, it calls Syscon command 0x8A1, else Syscon command 0x982.<br />
<br />
Used in [[ScePower]].<br />
<br />
<source lang="C">int SceSysconForDriver_00A65FC1(int *pResult);</source><br />
<br />
=== sceSysconGetBatteryElecForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x0826BA07<br />
|}<br />
<br />
If Syscon version <= 0x70503, it calls Syscon command 0x8A2, else Syscon command 0x983.<br />
<br />
Used in [[ScePower]].<br />
<br />
<source lang="C">int sceSysconGetBatteryElecForDriver(SceUInt16 *pResult);</source><br />
<br />
=== sceSysconGetBatteryLifeTimeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xB841C141<br />
|}<br />
<br />
If Syscon version <= 0x70503, it calls Syscon command 0x8A3, else Syscon command 0x984.<br />
<br />
Used in [[ScePower]].<br />
<br />
<source lang="C">int sceSysconGetBatteryLifeTimeForDriver(SceUInt16 *pResult);</source><br />
<br />
=== sceSysconGetBatterySOHForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x91D3B7A3<br />
|}<br />
<br />
If Syscon version <= 0x70503, it calls Syscon command 0x8A4, else Syscon command 0x985.<br />
<br />
Used in [[ScePower]].<br />
<br />
<source lang="C">int sceSysconGetBatterySOHForDriver(void *pResult);</source><br />
<br />
=== SceSysconForDriver_FDB3AE9D ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xFDB3AE9D<br />
|}<br />
<br />
Gets 0x10 bytes from Syscon command 0x183.<br />
<br />
<source lang="C">int SceSysconForDriver_FDB3AE9D(int *pResult);</source><br />
<br />
=== SceSysconForDriver_C3504ADE ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xC3504ADE<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_DE613081]].<br />
<br />
Used in [[SceHpremote]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_C3504ADE(void);</source><br />
<br />
=== SceSysconForDriver_B832B72C ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xB832B72C<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_229A07C2]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_B832B72C(void);</source><br />
<br />
=== SceSysconForDriver_86BAAF7D ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x86BAAF7D<br />
|}<br />
<br />
A guessed name is sceSysconIsAlarmTimerExistForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_8351526D]].<br />
<br />
Used in [[SceRtc]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_86BAAF7D(void);</source><br />
<br />
=== SceSysconForDriver_A57B5433 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xA57B5433<br />
|}<br />
<br />
A guessed name is sceSysconIsResumeRequestedForDriver.<br />
<br />
Related to [[#SceSysconForDriver_9F8340FF]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_A57B5433(void);</source><br />
<br />
=== SceSysconForDriver_ACC7F71E ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xACC7F71E<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_35E1689F]].<br />
<br />
Used in [[SceHpremote]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_ACC7F71E(void);</source><br />
<br />
=== SceSysconForDriver_769F9AC4 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x769F9AC4<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_474A9EA7]].<br />
<br />
Returns always SCE_TRUE on PS TV. This function could be related to USB or ethernet availability.<br />
<br />
No use case seen.<br />
<br />
<source lang="C">SceBool SceSysconForDriver_769F9AC4(void);</source><br />
<br />
=== SceSysconForDriver_4BC63A40 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x4BC63A40<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_4E88B4D9]].<br />
<br />
Used in [[SceSblPostSsMgr]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_4BC63A40(void);</source><br />
<br />
=== SceSysconForDriver_99A254A9 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x99A254A9<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_376CCCB8]].<br />
<br />
No use case seen.<br />
<br />
<source lang="C">SceBool SceSysconForDriver_99A254A9(void);</source><br />
<br />
=== SceSysconForDriver_9A4F4B7C ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0x9A4F4B7C<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_3BAAC8A9]].<br />
<br />
No use case seen.<br />
<br />
<source lang="C">SceBool SceSysconForDriver_9A4F4B7C(void);</source><br />
<br />
=== SceSysconForDriver_92D2C6A4 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0x92D2C6A4<br />
|}<br />
<br />
<source lang="C">int SceSysconForDriver_92D2C6A4(void);</source><br />
<br />
=== SceSysconForDriver_B9EA2FA8 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.995.000-3.740.011 || 0xB9EA2FA8<br />
|}<br />
<br />
A guessed name is sceSysconIsAccExistForDriver.<br />
<br />
Only used in [[SceUsbServ]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_B9EA2FA8(void);</source><br />
<br />
=== SceSysconForDriver_29CF4335 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x29CF4335<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_2E4BA4B8]].<br />
<br />
It is related to Ernie DL Mode.<br />
<br />
Used in [[SceSblPostSsMgr]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_29CF4335(void);</source><br />
<br />
=== SceSysconForDriver_32B2DB3D ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x32B2DB3D<br />
|}<br />
<br />
<source lang="c">int SceSysconForDriver_32B2DB3D(void);</source><br />
<br />
=== sceSysconIsHeadphoneExistForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x142D5E82<br />
|}<br />
<br />
Used in [[SceHpremote#sceHprmIsHeadphoneExistForDriver]].<br />
<br />
<source lang="c">SceBool sceSysconIsHeadphoneExistForDriver(void);</source><br />
<br />
=== sceSysconIsMotionDevExistForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x490C5548<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Used in [[SceMotionDev]].<br />
<br />
<source lang="c">SceBool sceSysconIsMotionDevExistForDriver(void);</source><br />
<br />
=== SceSysconForDriver_012B57B3 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 0.940-3.740.011 || 0x012B57B3<br />
|}<br />
<br />
<source lang="c">int SceSysconForDriver_012B57B3(void);</source><br />
<br />
=== SceSysconForDriver_27758A64 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 1.000.071-3.740.011 || 0x27758A64<br />
|}<br />
<br />
A guessed name is sceSysconIsBatteryOnlineForDriver, deriving from [[#sceSysconIsPowerOnlineForDriver]].<br />
<br />
Used in [[ScePower#scePowerGetBatteryRemainLevelForDriver]], [[ScePower#scePowerIsLowBatteryForDriver]], [[ScePower]]'s module_start.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_80D6E061]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_27758A64(void);</source><br />
<br />
=== SceSysconForDriver_4A184B7C ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 1.000.071-3.740.011 || 0x4A184B7C<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns some information about battery.<br />
<br />
Used in [[ScePower#ScePowerForDriver_627A89C6]].<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_7682FE69]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_4A184B7C(void);</source><br />
<br />
=== SceSysconForDriver_ACEE1C70 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0xACEE1C70<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns information about battery. Only used when battery is working.<br />
<br />
Used in [[ScePower#ScePowerForDriver_0D56C601]].<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_E0D52DF0]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_ACEE1C70(void);</source><br />
<br />
=== SceSysconForDriver_03C50DC3 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 1.000.071-3.740.011 || 0x03C50DC3<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_2D471528]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_03C50DC3(void);</source><br />
<br />
=== SceSysconForDriver_BFDA5590 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0xBFDA5590<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_129EA022]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_BFDA5590(void);</source><br />
<br />
=== SceSysconForDriver_63B14156 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.996.090 || not present<br />
|-<br />
| 1.000.071-3.740.011 || 0x63B14156<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_85E5DEBF]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_63B14156(void);</source><br />
<br />
=== SceSysconForDriver_50CAE242 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 1.000.071-3.740.011 || 0x50CAE242<br />
|}<br />
<br />
A guessed name is sceSysconIsThermalAlertForDriver.<br />
<br />
Returns the global variable related to [[#sceSysconSetThermalAlertCallbackForDriver]].<br />
<br />
Used in [[ScePower]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_50CAE242(void);</source><br />
<br />
=== SceSysconForDriver_9F4042F8 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.692.000 || not present<br />
|-<br />
| 1.800.071-3.740.011 || 0x9F4042F8<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_C442D0BE]].<br />
<br />
No use case seen.<br />
<br />
<source lang="C">SceBool SceSysconForDriver_9F4042F8(void);</source><br />
<br />
=== SceSysconForDriver_C50568E9 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.01 || not present<br />
|-<br />
| 3.100.081-3.740.011 || 0xC50568E9<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_61AE3970]].<br />
<br />
This function was added to support DOL-1002 motherboard.<br />
<br />
No use case seen.<br />
<br />
<source lang="C">SceBool SceSysconForDriver_C50568E9(void);</source><br />
<br />
=== sceSysconIsLowBatteryForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xD7F5A797<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Only used in [[ScePower]].<br />
<br />
<source lang="C">SceBool sceSysconIsLowBatteryForDriver(void);</source><br />
<br />
=== sceSysconIsLowBatteryInhibitUpdateRebootForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.18 || not present<br />
|-<br />
| 3.300.041-3.740.011 || 0x1A0C140F<br />
|}<br />
<br />
This function was added along with [[ScePower#scePowerIsLowBatteryInhibitUpdateReboot]].<br />
<br />
Used in [[ScePower#scePowerIsLowBatteryInhibitUpdateReboot]].<br />
<br />
<source lang="c">SceBool sceSysconIsLowBatteryInhibitUpdateRebootForDriver(void);</source><br />
<br />
=== sceSysconIsLowBatteryInhibitUpdateDownloadForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.18 || not present<br />
|-<br />
| 3.300.041-3.740.011 || 0x1E3130EE<br />
|}<br />
<br />
This function was added along with [[ScePower#scePowerIsLowBatteryInhibitUpdateDownload]].<br />
<br />
Used in [[ScePower#scePowerIsLowBatteryInhibitUpdateDownload]].<br />
<br />
<source lang="c">SceBool sceSysconIsLowBatteryInhibitUpdateDownloadForDriver(void);</source><br />
<br />
=== sceSysconGetBatteryRemainLevelForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.18 || not present<br />
|-<br />
| 3.300.041-3.740.011 || 0x26F9D729<br />
|}<br />
<br />
Only used if Syscon version >= 0x1040105.<br />
<br />
This function was added along with [[ScePower#scePowerGetBatteryRemainLevelForDriver]].<br />
<br />
Used in [[ScePower#scePowerGetBatteryRemainLevelForDriver]].<br />
<br />
<source lang="C">int sceSysconGetBatteryRemainLevelForDriver(SceUInt8 *pResult1, SceUInt8 *pResult2);</source><br />
<br />
=== SceSysconForDriver_C0F215B7 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.990.000 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0xC0F215B7<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_18A6F4D9]].<br />
<br />
The global variable is updated by [[#sceSysconCmdSyncForDriver]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_C0F215B7(void);</source><br />
<br />
=== SceSysconForDriver_D6F6D472 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0xD6F6D472<br />
|}<br />
<br />
Gets electric information (maybe intensity) of the device connected to USB OTG on PS Vita Slim. It should be studied if PS TV supports this function and if this function was initially targetting PS TV.<br />
<br />
Returns a global variable updated by [[#sceSysconCmdSyncForDriver]], obtained using Syscon command 0x130.<br />
<br />
<source lang="C">int SceSysconForDriver_D6F6D472(int *pInfo);</source><br />
<br />
=== SceSysconForDriver_F99BC858 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.01 || not present<br />
|-<br />
| 3.100.081-3.740.011 || 0xF99BC858<br />
|}<br />
<br />
Detects microSD swap.<br />
<br />
Calls syscon command 0x131.<br />
<br />
This function was maybe added to support a prototype motherboard that has a microSD port.<br />
<br />
<source lang="C">int SceSysconForDriver_F99BC858(SceBool *isSwapped);</source><br />
<br />
=== SceSysconForDriver_E7893732 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0xE7893732<br />
|}<br />
<br />
Calls Syscon command 0x1B0. Related to UART or JIG on PS Vita Slim or PS TV.<br />
<br />
<source lang="C"><br />
// value holds 3 useful bytes and 1 byte not sent to syscon<br />
int SceSysconForDriver_E7893732(int value);<br />
</source><br />
<br />
=== sceSysconGetElmoFwVersionForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xA039B563<br />
|}<br />
<br />
Calls Syscon command 0x880.<br />
<br />
<source lang="C">int sceSysconGetElmoFwVersionForDriver(SceUInt32 *pResult);</source><br />
<br />
=== sceSysconGetCookieFwVersionForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x9BF78047<br />
|}<br />
<br />
Calls Syscon command 0x881.<br />
<br />
<source lang="C">int sceSysconGetCookieFwVersionForDriver(SceUInt32 *pResult);</source><br />
<br />
=== sceSysconReadElmoRegForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x5BF765BB<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Calls Syscon command 0x895.<br />
<br />
=== sceSysconWriteElmoRegForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xCCC71C28<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Calls Syscon command 0x896.<br />
<br />
=== sceSysconReadCookieRegForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x95975DD1<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Calls Syscon command 0x897. Probably reads data from Cookie.<br />
<br />
=== sceSysconWriteCookieRegForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xF39300D3<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Calls Syscon command 0x898. Probably writes data to Cookie.<br />
<br />
Returns error 0x80250001 if offset is greater than 0xFF.<br />
<br />
<source lang="C"><br />
// offset: 0-0xFF<br />
int sceSysconWriteCookieRegForDriver(SceUInt32 offset, SceUInt16 data);<br />
</source><br />
<br />
== Commands ==<br />
<br />
It seems like the command format is as follows: <code>(direction << 8) | cmd_id</code>, where <code>direction = 1</code> means write to syscon, and <code>direction = 0</code> means read from syscon.<br />
<br />
{| class="wikitable"<br />
! Command<br />
! Return size (without considering the 2 bytes rx.size and rx.error_code)<br />
! Functions NIDs<br />
! Description<br />
|-<br />
| 0x0<br />
| 0x0<br />
| 0x0D0B6D25<br />
| <br />
|-<br />
| 0x1<br />
| 0x4<br />
| module_start<br />
| sceSysconGetErnieVersionForDriver. Used during SysconInit.<br />
|-<br />
| 0x2<br />
| 0xC<br />
| module_start<br />
| sceSysconGetTimeStampForDriver. Returns 12-byte string followed by at least 2-byte memory leak. Used during SysconInit.<br />
|-<br />
| 0x3<br />
| 0x4<br />
| module_start<br />
| sceSysconGetSleepFactor. Used during SysconInit.<br />
|-<br />
| 0x4<br />
| 0x4<br />
| <br />
| <br />
|-<br />
| 0x5<br />
| 0x4<br />
| 0xCBD6D8BC, module_start<br />
| sceSysconGetHardwareInfoForDriver<br />
|-<br />
| 0x6<br />
| 0x10<br />
| 0x965C68C3, module_start<br />
| sceSysconGetHardwareInfo2ForDriver. Get Hardware Info 2. See [[KBL_Param#Hardware_Info_2]].<br />
|-<br />
| 0x10<br />
| 0x2<br />
| 0xCF5B2F2F<br />
| sceSysconGetWakeupFactorForDriver<br />
|-<br />
| 0x11<br />
| 0x4<br />
| 0xD7BEFF8B<br />
| sceSysconGetClockForDriver<br />
|-<br />
| 0x12<br />
| 0x5 or 0x6<br />
| 0x3168F3AF<br />
| ??<br />
|-<br />
| 0x13<br />
| 0x2<br />
| 0xBA09F171<br />
| ??<br />
|-<br />
| 0x14<br />
| 0x1<br />
| 0x93075DD1<br />
| ??<br />
|-<br />
| 0x15<br />
| 0x4<br />
| 0x3E09A1F4<br />
| sceSysconGetManufacturesStatusForDriver<br />
|-<br />
| 0x80<br />
| 0x0<br />
| module_start<br />
| ?? Used during SysconInit.<br />
|-<br />
| 0x81<br />
| ?<br />
| 0x9B6A6F64<br />
| sceSysconSetClockForDriver<br />
|-<br />
| 0x82<br />
| ?<br />
| 0x51164951<br />
| <br />
|-<br />
| 0x83<br />
| ?<br />
| 0x373ECF8A<br />
| Sends 3 bytes to Syscon.<br />
|-<br />
| 0x84<br />
| ?<br />
| 0x2659535C<br />
| Sends 1 byte to Syscon.<br />
|-<br />
| 0x85<br />
| ?<br />
| 0x4295D497<br />
| <br />
|-<br />
| 0x86<br />
| 8<br />
| 0x701535FC<br />
| sceSysconGetLogInfoForDriver<br />
|-<br />
| 0x87<br />
| 0<br />
| 0x4E55CF5E<br />
| sceSysconLogStartForDriver. Sends 1 byte to Syscon: 0.<br />
|-<br />
| 0x88<br />
| 0x18<br />
| 0x487D97F3<br />
| sceSysconLogReadDataForDriver. Sends 2 bytes to Syscon: offset.<br />
|-<br />
| 0x89<br />
| 0<br />
| 0x9C0B1E61<br />
| sceSysconLogStartWaitingForDriver. Sends 1 byte to Syscon: 0.<br />
|-<br />
| 0x90<br />
| ?0x3B?<br />
| 0x299B1CE7<br />
| sceSysconReadScratchPadForDriver<br />
|-<br />
| 0x91<br />
| ?0x3B?<br />
| 0xE26488B9<br />
| sceSysconWriteScratchPadForDriver<br />
|-<br />
| 0xA0<br />
| ?0x10 or 0x28?<br />
| second_loader<br />
| See [[Ernie Secure]].<br />
|-<br />
| 0xB0<br />
| 0<br />
| 0x058941D7<br />
| Probably a control command. Sends 2 bytes to Syscon.<br />
|-<br />
| 0xB1<br />
| 0<br />
| 0xDF8C6D2D<br />
| sceSysconCtrlWirelessPowerDownForDriver<br />
|-<br />
| 0xB2<br />
| 0<br />
| 0xDECCB2B4<br />
| sceSysconCtrlHostOutputViaDongleForDriver. Sends 2 bytes to Syscon.<br />
|-<br />
| 0xB3<br />
| at least 1<br />
| 0x33B5CDB3<br />
| ??<br />
|-<br />
| 0xB4<br />
| at least 1<br />
| 0xF6D4DDC4<br />
| ??<br />
|-<br />
| 0xB5<br />
| 0<br />
| 0x00AE3AEB<br />
| Probably a control command. Sends 2 bytes to Syscon.<br />
|-<br />
| 0xB6<br />
| 0<br />
| 0x0D300158<br />
| Probably a control command. Sends 2 bytes to Syscon.<br />
|-<br />
| 0xB7<br />
| at least 1<br />
| 0x91EF4EC3<br />
| ??<br />
|-<br />
| 0xC0<br />
| ?0x3E?<br />
| <br />
| <br />
|-<br />
| 0xC1<br />
| 0<br />
| 0x94AB13CC<br />
| sceSysconErnieShutdownForDriver. Sends 2 bytes to Syscon.<br />
|-<br />
| 0xD0<br />
| ?0x2A or 0x28?<br />
| <br />
| <br />
|-<br />
| 0xD1<br />
| ?0x2?<br />
| <br />
| <br />
|-<br />
| 0xD2<br />
| ?0x30?<br />
| second_loader, SNVS functions<br />
| See [[Ernie Secure]]. SNVS RW.<br />
|-<br />
| 0xD3<br />
| ?0x12?<br />
| <br />
| <br />
|-<br />
| 0x100<br />
| 0x4<br />
| 0x145F59A4<br />
| sceSysconGetControlsInfoForDriver. Used in SceCtrlVblankHandler in [[SceCtrl]].<br />
|-<br />
| 0x101<br />
| 0x8<br />
| <br />
| sceSysconGetControlsInfo2ForDriver. Used in SceCtrlVblankHandler in [[SceCtrl]]. Uses Ernie version and Ernie DL version.<br />
|-<br />
| 0x102<br />
| 0xC<br />
| <br />
| <br />
|-<br />
| 0x103<br />
| 0x4<br />
| 0x1503D6A0<br />
| sceSysconGetMultiCnInfoForDriver<br />
|-<br />
| 0x104<br />
| 0xC<br />
| <br />
| sceSysconGetControlsInfo3ForDriver. Used in SceCtrlVblankHandler in [[SceCtrl]].<br />
|-<br />
| 0x105<br />
| ?<br />
| <br />
| Uses string "PS" then "TUV".<br />
|-<br />
| 0x106<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x107<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x108<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x109<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x110<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x120<br />
| ?<br />
| 0x76272CB9<br />
| ??<br />
|-<br />
| 0x121<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x130<br />
| 0x4<br />
| module_start, 0xD6F6D472<br />
| Get USB OTG device electric info (maybe intensity). Used during SysconInit.<br />
|-<br />
| 0x131<br />
| ?0x1? (read)<br />
| 0xF99BC858<br />
| ?? Added on a FW > 2.50 and <= 3.100.081.<br />
|-<br />
| 0x140<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x141<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x142<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x143<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x144<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x145<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x146<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x147<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x148<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x150<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x151<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x152<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x153<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x154<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x155<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x156<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x157<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x160<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x161<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x162<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x163<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x168<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x170<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x171<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x172<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x180<br />
| ?<br />
| <br />
| Set analog sampling. Sends 2 bytes to Syscon: 0 to disable, 1 to enable on Syscon version is < 0x90202, 3 to enable on Syscon version is >= 0x90202. Used in SceCtrlVblankHandler in [[SceCtrl]].<br />
|-<br />
| 0x181<br />
| 0<br />
| 0xCFCEE733<br />
| Sends 2 bytes to Syscon.<br />
|-<br />
| 0x182<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x183<br />
| 0x10<br />
| 0xFDB3AE9D<br />
| Gets some info.<br />
|-<br />
| 0x184<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x185<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x186<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x187<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x188<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x189<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x18A<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x18B<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x18C<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x18D<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x18E<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x18F<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x190<br />
| 0<br />
| 0x8AAB6308<br />
| sceSysconSetMultiCnPortForDriver. Sends 3 bytes to Syscon.<br />
|-<br />
| 0x191<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x192<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1A0<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1A1<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1B0<br />
| 0<br />
| 0xE7893732<br />
| Sends 3 bytes to Syscon.<br />
|-<br />
| 0x1B2<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1C0<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1C1<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1C2<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1C3<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1C4<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1D0<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1D1<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1D2<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1D3<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1D4<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1D5<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1E0<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1E1<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1E2<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1E3<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x300<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x301<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x303<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x380<br />
| at least 1<br />
| 0xF492E69E<br />
| sceSysconGetTouchpanelDeviceInfoForDriver<br />
|-<br />
| 0x38A<br />
| at least 1<br />
| 0xA1F1B973<br />
| ??<br />
|-<br />
| 0x390<br />
| at least 1<br />
| 0x030D447F<br />
| sceSysconGetTouchpanelDeviceInfo2ForDriver<br />
|-<br />
| 0x392<br />
| ?<br />
| 0x48ED8981, 060E55C1<br />
| <br />
|-<br />
| 0x393<br />
| ?<br />
| 0x9A28BEEF, 0x8874EF45<br />
| Used in [[SceSblUpdateMgr]]<br />
|-<br />
| 0x3A9<br />
| 0<br />
| 0x010F95D9<br />
| Sends 1 byte to Syscon.<br />
|-<br />
| 0x3AB<br />
| ?<br />
| 0x357CC9D9<br />
| <br />
|-<br />
| 0x3AC<br />
| ?<br />
| 0x3664E2C0<br />
| ??<br />
|-<br />
| 0x3AF<br />
| ?<br />
| 0xB8F4F4E3<br />
| <br />
|-<br />
| 0x3B9<br />
| ?<br />
| 0x42E599AC<br />
| <br />
|-<br />
| 0x3BB<br />
| ?<br />
| 0xCCA56A16<br />
| <br />
|-<br />
| 0x3BC<br />
| ?<br />
| 0x2E6D97CD<br />
| ??<br />
|-<br />
| 0x3BF<br />
| ?<br />
| 0x240A604E<br />
| <br />
|-<br />
| 0x3C2<br />
| ?<br />
| 0x5946B29B, 0x10327C64<br />
| Used in [[SceSblUpdateMgr]]<br />
|-<br />
| 0x480<br />
| ?<br />
| 0xD01E64FC<br />
| ??<br />
|-<br />
| 0x481<br />
| ?<br />
| 0x9A7858B6<br />
| ??<br />
|-<br />
| 0x800<br />
| ?0x4?<br />
| 0xA2FE9BF9<br />
| SceSysconForDriver_A2FE9BF9. [[ScePower]] related.<br />
|-<br />
| 0x801<br />
| 0x0<br />
| <br />
| ??<br />
|-<br />
| 0x802<br />
| ?0x4?<br />
| 0xC562AF3A<br />
| sceSysconGetBatteryRemainCapacityForDriver. Replaced by Syscon command 0x900 on Syscon version > 0x70503.<br />
|-<br />
| 0x803<br />
| 0x4<br />
| 0x03F11220<br />
| sceSysconGetBatteryVoltForDriver. Replaced by Syscon command 0x901 on Syscon version > 0x70503.<br />
|-<br />
| 0x804<br />
| ?<br />
| <br />
| ??<br />
|-<br />
| 0x805<br />
| ?0x0?<br />
| 0xEF810687<br />
| sceSysconGetUsbDetStatusForDriver<br />
|-<br />
| 0x806<br />
| ?0x1?<br />
| 0xE7F5D3DC<br />
| Reboots PS Vita?<br />
|-<br />
| 0x807<br />
| 0x2<br />
| 0x253CC522<br />
| ??<br />
|-<br />
| 0x820<br />
| 0x0<br />
| 0x727F985A<br />
| sceSysconCtrlDolceLEDForDriver. PSTV LED on<br />
|-<br />
| 0x821<br />
| 0x0<br />
| 0x727F985A<br />
| sceSysconCtrlDolceLEDForDriver. PSTV LED blink slow<br />
|-<br />
| 0x822<br />
| 0x0<br />
| 0x727F985A<br />
| sceSysconCtrlDolceLEDForDriver. PSTV LED blink fast<br />
|-<br />
| 0x840<br />
| ?0x1?<br />
| 0x4FEC564C<br />
| sceSysconGetManualChargeModeForDriver<br />
|-<br />
| 0x841<br />
| ?0x1?<br />
| 0x3C3B949C<br />
| ??<br />
|-<br />
| 0x842<br />
| ?0x1?<br />
| 0x1C29C00E<br />
| ??<br />
|-<br />
| 0x843<br />
| ?0x1?<br />
| 0x730E4725<br />
| ??<br />
|-<br />
| 0x880<br />
| 0x4<br />
| 0xA039B563<br />
| sceSysconGetElmoFwVersionForDriver<br />
|-<br />
| 0x881<br />
| ?<br />
| 0x9BF78047<br />
| sceSysconGetCookieFwVersionForDriver<br />
|-<br />
| 0x882<br />
| 0x6<br />
| 0x68E0031E<br />
| sceSysconGetBatteryVersionForDriver. Replaced by Syscon command 0x980 on Syscon version > 0x70503.<br />
|-<br />
| 0x883<br />
| 0x8<br />
| 0x175CE5A1<br />
| ??<br />
|-<br />
| 0x884<br />
| ?<br />
| 0x3FDD29D6<br />
| ??<br />
|-<br />
| 0x885<br />
| ?<br />
| 0x79E6DD8B<br />
| ??<br />
|-<br />
| 0x886<br />
| ?0x2?<br />
| 0x62155962<br />
| sceSysconCtrlHdmiCecPowerForDriver<br />
|-<br />
| 0x887<br />
| ?<br />
| 0x063425AE<br />
| sceSysconCtrlMotionSensorPowerForDriver<br />
|-<br />
| 0x888<br />
| ?0x2?<br />
| 0xBE1ADE4F<br />
| sceSysconCtrlSdPowerForDriver<br />
|-<br />
| 0x889<br />
| ?0x2?<br />
| 0x8D1D97E8<br />
| sceSysconCtrlAccPowerForDriver<br />
|-<br />
| 0x88A<br />
| ?<br />
| 0x4FBDA504, 0xA2E85DB9<br />
| sceSysconCtrlWirelessPowerForDriver, sceSysconCtrlWirelessPower2ForDriver<br />
|-<br />
| 0x88B<br />
| ?<br />
| 0x5A614349<br />
| ??<br />
|-<br />
| 0x88C<br />
| ?<br />
| 0xB872E904<br />
| ??<br />
|-<br />
| 0x88D<br />
| ?<br />
| 0xDD16ABD9<br />
| ??<br />
|-<br />
| 0x88E<br />
| ?0x2?<br />
| 0x7F198FA2<br />
| sceSysconCtrlVoltageForDriver. See [[Ernie#CMD_0x088E_-_CtrlVoltage]].<br />
|-<br />
| 0x88F<br />
| ?0x2?<br />
| 0x40FF3898<br />
| sceSysconCtrlDeviceResetForDriver. ?UsbEtherSmsc and WlanBt related?<br />
|-<br />
| 0x890<br />
| ?<br />
| 0x285594F8<br />
| ??<br />
|-<br />
| 0x891<br />
| ?0x2?<br />
| 0x04EC7579<br />
| sceSysconCtrlLEDForDriver<br />
|-<br />
| 0x892<br />
| ?0?<br />
| 0x596B17B7<br />
| SceSysconForDriver_596B17B7. [[ScePower]] related.<br />
|-<br />
| 0x893<br />
| ?0?<br />
| 0x2A4B0437<br />
| SceSysconForDriver_2A4B0437. [[ScePower]] related.<br />
|-<br />
| 0x895<br />
| ?<br />
| 0x5BF765BB<br />
| sceSysconReadElmoRegForDriver<br />
|-<br />
| 0x896<br />
| ?<br />
| 0xCCC71C28<br />
| sceSysconWriteElmoRegForDriver<br />
|-<br />
| 0x897<br />
| ?<br />
| 0x95975DD1<br />
| sceSysconReadCookieRegForDriver<br />
|-<br />
| 0x898<br />
| ?<br />
| 0xF39300D3<br />
| sceSysconWriteCookieRegForDriver<br />
|-<br />
| 0x899<br />
| ?0?<br />
| 0x5CDDA14D<br />
| ?Guessed name: sceSysconCtrlHpremoteForDriver? [[SceHpremote]] related.<br />
|-<br />
| 0x89A<br />
| ?0?<br />
| 0x59DC5938<br />
| sceSysconCtrlUsbStatusForDriver<br />
|-<br />
| 0x89B<br />
| ?0x2?<br />
| 0x710A7CF0<br />
| sceSysconCtrlRMRPowerForDriver<br />
|-<br />
| 0x89C<br />
| ?0x2?<br />
| 0xB1F88B11<br />
| sceSysconCtrlDevKitUsbPowerForDriver. [[SceUsbServ]] related.<br />
|-<br />
| 0x89D<br />
| ?<br />
| 0x6F586D1A<br />
| sceSysconConfigLEDForDriver<br />
|-<br />
| 0x89E<br />
| ?<br />
| 0x9CA6EB70<br />
| [[ScePower]] related<br />
|-<br />
| 0x89F<br />
| ?<br />
| 0xCB41B531<br />
| ??<br />
|-<br />
| 0x8A0<br />
| ?0x4?<br />
| 0x9070F139<br />
| sceSysconGetBatteryTempForDriver. Replaced by Syscon command 0x981 on Syscon version > 0x70503.<br />
|-<br />
| 0x8A1<br />
| ?0x3B or 0x4?<br />
| 0x00A65FC1<br />
| Replaced by Syscon command 0x982 on Syscon version > 0x70503. [[ScePower]] related.<br />
|-<br />
| 0x8A2<br />
| 0x2<br />
| 0x0826BA07<br />
| sceSysconGetBatteryElecForDriver. Replaced by Syscon command 0x983 on Syscon version > 0x70503.<br />
|-<br />
| 0x8A3<br />
| ?0x4?<br />
| 0xB841C141<br />
| sceSysconGetBatteryLifeTimeForDriver. Replaced by Syscon command 0x984 on Syscon version > 0x70503.<br />
|-<br />
| 0x8A4<br />
| ?0x4?<br />
| 0x91D3B7A3<br />
| sceSysconGetBatterySOHForDriver. Replaced by Syscon command 0x985 on Syscon version > 0x70503.<br />
|-<br />
| 0x8B0<br />
| ?<br />
| 0x2CEF078E / 0x4946538A<br />
| sceSysconBatteryStartBLModeForDriver. Replaced by Syscon command 0x9B0 on Syscon version > 0x70503. Since FW 0.940, it is also sceSysconEnableHibernateIOForDriver independently of Syscon version.<br />
|-<br />
| 0x8B1<br />
| ?<br />
| 0xE4AE7852<br />
| sceSysconBatteryStopBLModeForDriver. Replaced by Syscon command 0x9B1 on Syscon version > 0x70503.<br />
|-<br />
| 0x8B2<br />
| ?<br />
| 0xE4F29744<br />
| sceSysconBatterySetBLCommandForDriver. Replaced by Syscon command 0x9B2 on Syscon version > 0x70503.<br />
|-<br />
| 0x8B3<br />
| ?<br />
| 0x74B2AB55<br />
| sceSysconBatteryExecBLCommandForDriver. Replaced by Syscon command 0x9B3 on Syscon version > 0x70503.<br />
|-<br />
| 0x8B4<br />
| ?<br />
| 0x448DAFF1<br />
| sceSysconBatteryReadBLCommandForDriver. Replaced by Syscon command 0x9B4 on Syscon version > 0x70503.<br />
|-<br />
| 0x8C0<br />
| ?<br />
| 0xC6A2C9EF<br />
| sceSysconCtrlManualChargeModeForDriver<br />
|-<br />
| 0x8C5<br />
| ?0x2 or 0?<br />
| 0x3274A925<br />
| ??. [[SceUsbServ]] and [[SceUsbEtherSmsc]] related.<br />
|-<br />
| 0x8C6<br />
| ?<br />
| 0xDFB024C4<br />
| sceSysconAbbySyncForDriver. [[SceSblUpdateMgr]] related<br />
|-<br />
| 0x8C7<br />
| ?<br />
| 0x87FF8041<br />
| ??<br />
|-<br />
| 0x8C8<br />
| ?<br />
| 0x7BFA95DA<br />
| ??<br />
|-<br />
| 0x8C9<br />
| ?<br />
| 0x451C1662<br />
| ??<br />
|-<br />
| 0x8CA<br />
| ?<br />
| 0x79074DE4<br />
| ??<br />
|-<br />
| 0x8CB<br />
| ?<br />
| 0x7D25F6D2<br />
| ??<br />
|-<br />
| 0x8CC<br />
| ?<br />
| 0xD2ADABCA<br />
| ??<br />
|-<br />
| 0x8CE<br />
| 0x10<br />
| 0x3B354824<br />
| sceSysconGetTemperatureLog<br />
|-<br />
| 0x8CF<br />
| 0<br />
| 0x3843D657<br />
| sceSysconClearTemperatureLog. Sends 2 bytes to syscon.<br />
|-<br />
| 0x8D0<br />
| ?<br />
| 0xF87679EE<br />
| ??<br />
|-<br />
| 0x900<br />
| ?0x4?<br />
| 0xC562AF3A<br />
| sceSysconGetBatteryRemainCapacityForDriver. Replaces Syscon command 0x802 on Syscon version > 0x70503.<br />
|-<br />
| 0x901<br />
| 0x4<br />
| 0x03F11220<br />
| sceSysconGetBatteryVoltForDriver. Replaces Syscon command 0x803 on Syscon version > 0x70503.<br />
|-<br />
| 0x902<br />
| ?0x4?<br />
| 0xAD0A8275<br />
| sceSysconGetBatteryLifePercentForDriver<br />
|-<br />
| 0x903<br />
| 0x2<br />
| 0x26F9D729<br />
| sceSysconGetBatteryRemainLevelForDriver. Added on a FW higher than 2.50 and Syscon version >= 0x1040105.<br />
|-<br />
| 0x904<br />
| ?<br />
| 0x9ADC9936<br />
| sceSysconGetBatteryCalibDataForDriver<br />
|-<br />
| 0x910<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x911<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x912<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x913<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x914<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x915<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x916<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x917<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x932<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x944<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x945<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x952<br />
| ?<br />
| <br />
| Uses string "PC" then "TUV".<br />
|-<br />
| 0x953<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x954<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x961<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x962<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x963<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x964<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x965<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x966<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x967<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x968<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x969<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x980<br />
| 0x6<br />
| 0x68E0031E<br />
| sceSysconGetBatteryVersionForDriver. Replaces Syscon command 0x882 on Syscon version > 0x70503.<br />
|-<br />
| 0x981<br />
| ?0x4?<br />
| 0x9070F139<br />
| sceSysconGetBatteryTempForDriver. Replaces Syscon command 0x8A0 on Syscon version > 0x70503.<br />
|-<br />
| 0x982<br />
| ?0x4?<br />
| 0x00A65FC1<br />
| Replaces Syscon command 0x8A1 on Syscon version > 0x70503. [[ScePower]] related.<br />
|-<br />
| 0x983<br />
| 0x2<br />
| 0x0826BA07<br />
| sceSysconGetBatteryElecForDriver. Replaces Syscon command 0x8A2 on Syscon version > 0x70503.<br />
|-<br />
| 0x984<br />
| ?0x4?<br />
| 0xB841C141<br />
| sceSysconGetBatteryLifeTimeForDriver. Replaces Syscon command 0x8A3 on Syscon version > 0x70503.<br />
|-<br />
| 0x985<br />
| ?0x4?<br />
| 0x91D3B7A3<br />
| sceSysconGetBatterySOHForDriver. Replaces Syscon command 0x8A4 on Syscon version > 0x70503.<br />
|-<br />
| 0x989<br />
| ?<br />
| 0x87DA378D<br />
| sceSysconBatterySWResetForDriver<br />
|-<br />
| 0x98A<br />
| ?0x4?<br />
| 0xF93CF833<br />
| sceSysconGetBatteryFullCapacityForDriver<br />
|-<br />
| 0x98B<br />
| ?<br />
| 0xE1885F68<br />
| ??<br />
|-<br />
| 0x98C<br />
| ?0x4?<br />
| 0xCD73079D<br />
| sceSysconGetBatteryCycleCountForDriver<br />
|-<br />
| 0x9B0<br />
| ?<br />
| 0x2CEF078E<br />
| sceSysconBatteryStartBLModeForDriver. Replaces Syscon command 0x8B0 on Syscon version > 0x70503.<br />
|-<br />
| 0x9B1<br />
| ?<br />
| 0xE4AE7852<br />
| sceSysconBatteryStopBLModeForDriver. Replaces Syscon command 0x8B1 on Syscon version > 0x70503.<br />
|-<br />
| 0x9B2<br />
| ?<br />
| 0xE4F29744<br />
| sceSysconBatterySetBLCommandForDriver. Replaces Syscon command 0x8B2 on Syscon version > 0x70503.<br />
|-<br />
| 0x9B3<br />
| ?<br />
| 0x74B2AB55<br />
| sceSysconBatteryExecBLCommandForDriver. Replaces Syscon command 0x8B3 on Syscon version > 0x70503.<br />
|-<br />
| 0x9B4<br />
| ?<br />
| 0x448DAFF1<br />
| sceSysconBatteryReadBLCommandForDriver. Replaces Syscon command 0x8B4 on Syscon version > 0x70503.<br />
|-<br />
| 0xA00<br />
| 0x0<br />
| <br />
| ??<br />
|-<br />
| 0xA82<br />
| ?<br />
| 0x7BAFE083<br />
| ??<br />
|-<br />
| 0x1080<br />
| ?0x0 or 0x2?<br />
| 0x81A6060D<br />
| sceSysconNvsSetRunModeForDriver<br />
|-<br />
| 0x1081<br />
| ?0x0 or 0x2?<br />
| 0x2EC6D55D<br />
| sceSysconNvsSetUnkModeForDriver<br />
|-<br />
| 0x1082<br />
| ?<br />
| 0xACAFA2B8<br />
| sceSysconNvsReadDataForDriver<br />
|-<br />
| 0x1083<br />
| ?0x2?<br />
| 0x10C9657A<br />
| sceSysconNvsWriteDataForDriver<br />
|-<br />
| 0x1100<br />
| 0x4<br />
| 0xD2F456DC<br />
| sceSysconGetErnieDLVersionForDriver<br />
|-<br />
| 0x1101<br />
| 0x4<br />
| <br />
| <br />
|-<br />
| 0x1180<br />
| ?<br />
| 0x9B00BC7F<br />
| sceSysconUpdaterSetSegmentForDriver<br />
|-<br />
| 0x1181<br />
| ?<br />
| 0x356B9696, 0x734544E4<br />
| sceSysconUpdaterLoadSegmentForDriver, sceSysconUpdaterLoadSegment2ForDriver<br />
|-<br />
| 0x1182<br />
| ?<br />
| 0x69AD76E4<br />
| sceSysconUpdaterExecProgrammingForDriver<br />
|-<br />
| 0x1183<br />
| ?<br />
| 0xB487C2FB<br />
| sceSysconUpdaterSetRunModeForDriver<br />
|-<br />
| 0x1184<br />
| ?<br />
| 0xC7747A63<br />
| sceSysconUpdaterExecFinalizeForDriver<br />
|-<br />
| 0x1185<br />
| ?<br />
| 0xCBA836FF<br />
| SceSysconForDriver_CBA836FF<br />
|-<br />
| 0x1300<br />
| 0x8<br />
| <br />
| ??<br />
|-<br />
| 0x1310<br />
| 0x1<br />
| 0x351946B0<br />
| ??<br />
|-<br />
| 0x1382<br />
| ?<br />
| 0xA4968B8C<br />
| sceSysconBeginConfigstorageTransactionForDriver<br />
|-<br />
| 0x1383<br />
| ?<br />
| 0xFCC3E8EE<br />
| sceSysconEndConfigstorageTransactionForDriver<br />
|-<br />
| 0x1384<br />
| ?<br />
| 0x7B9B3617<br />
| sceSysconCommitConfigstorageTransactionForDriver<br />
|-<br />
| 0x1385<br />
| ?<br />
| 0x89C5CFD6<br />
| sceSysconLoadConfigstorageScriptForDriver<br />
|-<br />
| 0x1386 (called from ARM Kernel but not implemented in Syscon FW)<br />
| ?<br />
| 0xCC6F90A8<br />
| sceSysconVerifyConfigstorageScriptForDriver<br />
|-<br />
| 0x1392<br />
| ?<br />
| 0xFD65FFCB<br />
| ??<br />
|-<br />
| 0x1393<br />
| ?<br />
| 0x02350352<br />
| ??<br />
|-<br />
| 0x1394<br />
| ?<br />
| 0x7DE84CE3<br />
| ??<br />
|-<br />
| 0x2080<br />
| ?<br />
| 0x44A173F5<br />
| sceSysconJigOpenPortForDriver<br />
|-<br />
| 0x2081<br />
| ?<br />
| 0x483FAE05<br />
| sceSysconJigClosePortForDriver<br />
|-<br />
| 0x2082<br />
| ?<br />
| 0xD24BF916<br />
| sceSysconJigSetConfigForDriver<br />
|-<br />
| 0x2083<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x2084<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x2085<br />
| ?<br />
| <br />
| <br />
|}<br />
<br />
== Callbacks ==<br />
<br />
All the following exported functions have this function prototype: <code>int sceSysconSet...Callback(void (*func)(int enable, void *argp), void *argp);</code>.<br />
<br />
{| class="wikitable"<br />
! Callback name !! Callback setter function !! State getter function !! Callback setter caller !! Comments<br />
|-<br />
| SYSCON_CB_ACC || [[#sceSysconSetAccCallbackForDriver]] || [[#SceSysconForDriver_B9EA2FA8]] || [[SceUsbServ]] ||<br />
|-<br />
| SYSCON_CB_MULTI_CN_OTG || [[#sceSysconSetMultiCnOtgCallbackForDriver]] || NA || [[SceUsbServ]] ||<br />
|-<br />
| SYSCON_CB_MINI_USB_OTG || [[#sceSysconSetMiniUsbOtgCallbackForDriver]] || NA || [[SceUsbServ]] ||<br />
|-<br />
| SYSCON_CB_ALARM || [[#sceSysconSetAlarmCallbackForDriver]] || NA || [[ScePower]] ||<br />
|-<br />
| ? || [[#SceSysconForDriver_18A6F4D9]] || [[#SceSysconForDriver_C0F215B7]] || No use case seen. ||<br />
|-<br />
| ?SYSCON_CB_HEADPHONE? || [[#SceSysconForDriver_DE613081]] || [[#SceSysconForDriver_C3504ADE]] || [[SceHpremote]] ||<br />
|-<br />
| ?SYSCON_CB_MICROPHONE? || [[#SceSysconForDriver_63352A39]] || NA || [[SceHpremote]] ||<br />
|-<br />
| ?SYSCON_CB_REMOTE? || [[#SceSysconForDriver_35E1689F]] || [[#SceSysconForDriver_ACC7F71E]] || [[SceHpremote]] ||<br />
|-<br />
| SYSCON_CB_LOW_BATTERY || [[#sceSysconSetLowBatteryCallbackForDriver]] || [[#sceSysconIsLowBatteryForDriver]] || [[ScePower]] ||<br />
|-<br />
| SYSCON_CB_THERMAL_ALERT || [[#sceSysconSetThermalAlertCallbackForDriver]] || [[#SceSysconForDriver_50CAE242]] || [[ScePower]] ||<br />
|-<br />
| SYSCON_CB_LOW_BATTERY_INIHIBIT_UPDATE_REBOOT || [[#sceSysconSetLowBatteryInhibitUpdateRebootCallbackForDriver]] || [[#sceSysconIsLowBatteryInhibitUpdateRebootForDriver]] || [[ScePower]] ||<br />
|-<br />
| SYSCON_CB_LOW_BATTERY_INIHIBIT_UPDATE_DOWNLOAD || [[#sceSysconSetLowBatteryInhibitUpdateDownloadCallbackForDriver]] || [[#sceSysconIsLowBatteryInhibitUpdateDownloadForDriver]] || [[ScePower]] ||<br />
|-<br />
| SYSCON_CB_BATTERY_ONLINE || [[#SceSysconForDriver_80D6E061]] || [[#SceSysconForDriver_27758A64]] || [[ScePower]] ||<br />
|-<br />
| SYSCON_CB_RESUME_REQUEST || [[#SceSysconForDriver_9F8340FF]] || [[#SceSysconForDriver_A57B5433]] || [[ScePower]] ||<br />
|-<br />
| ? || [[#SceSysconForDriver_2D471528]] || [[#SceSysconForDriver_03C50DC3]] || [[ScePower]] || Very similar to SYSCON_CB_LOW_BATTERY.<br />
|-<br />
| ? || [[#SceSysconForDriver_7682FE69]] || [[#SceSysconForDriver_4A184B7C]] || No use case seen. || Related to battery.<br />
|-<br />
| ? || [[#SceSysconForDriver_E0D52DF0]] || [[#SceSysconForDriver_ACEE1C70]] || No use case seen. || Related to battery.<br />
|-<br />
| ? || [[#SceSysconForDriver_229A07C2]] || [[#SceSysconForDriver_B832B72C]] || No use case seen. ||<br />
|-<br />
| ? || [[#SceSysconForDriver_474A9EA7]] || [[#SceSysconForDriver_769F9AC4]] || No use case seen. ||<br />
|-<br />
| ? || [[#SceSysconForDriver_129EA022]] || [[#SceSysconForDriver_BFDA5590]] || [[ScePower]] ||<br />
|-<br />
| SYSCON_CB_ALARM_TIMER || [[#SceSysconForDriver_8351526D]] || [[#SceSysconForDriver_86BAAF7D]] || [[SceRtc]] ||<br />
|-<br />
| ? || [[#SceSysconForDriver_2E4BA4B8]] || [[#SceSysconForDriver_29CF4335]] || No use case seen. || Used in [[SceSblPostSsMgr]].<br />
|-<br />
| ? || [[#SceSysconForDriver_4E88B4D9]] || [[#SceSysconForDriver_4BC63A40]] || No use case seen. || Used in [[SceSblPostSsMgr]].<br />
|-<br />
| ? || [[#SceSysconForDriver_376CCCB8]] || [[#SceSysconForDriver_99A254A9]] || No use case seen. ||<br />
|-<br />
| ? || [[#SceSysconForDriver_3BAAC8A9]] || [[#SceSysconForDriver_9A4F4B7C]] || No use case seen. ||<br />
|-<br />
| ? || [[#SceSysconForDriver_85E5DEBF]] || [[#SceSysconForDriver_63B14156]] || No use case seen. ||<br />
|-<br />
| ? || [[#SceSysconForDriver_14730196]] || NA || No use case seen. ||<br />
|-<br />
| ? || [[#SceSysconForDriver_C442D0BE]] || [[#SceSysconForDriver_9F4042F8]] || No use case seen. ||<br />
|-<br />
| ? || [[#SceSysconForDriver_61AE3970]] || [[#SceSysconForDriver_C50568E9]] || No use case seen. ||<br />
|-<br />
| ? || [[#SceSysconForDriver_423D0C58]] || NA || No use case seen. ||<br />
|-<br />
| ? || [[#SceSysconForDriver_154676F1]] || NA || No use case seen. ||<br />
|}<br />
<br />
See also [http://uofw.github.io/upspd/docs/SilverSpring_Blog/my.malloc.us/silverspring/2007/12/03g-model-psp/index.html SilverSpring's PSP Syscon callbacks enum] and [https://github.com/pspdev/pspsdk/blob/master/src/power/psppower.h PSPSDK power callbacks enum].<br />
<br />
[[Category:ARM]]<br />
[[Category:Kernel]]<br />
[[Category:Modules]]<br />
[[Category:Library]]</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=SceSyscon&diff=20875
SceSyscon
2023-12-26T22:43:11Z
<p>CreepNT: /* SceSysconForDriver_901D6CD4 */ Add official name from 0.945 scePdMotion</p>
<hr />
<div>System Controller.<br />
<br />
== Module ==<br />
<br />
{| class="wikitable"<br />
|-<br />
! Version !! World !! Privilege<br />
|-<br />
| 0.931.010-3.740.011 || Non-secure || Kernel<br />
|}<br />
<br />
== Libraries ==<br />
<br />
=== Known NIDs ===<br />
<br />
{| class="wikitable"<br />
|-<br />
! Version !! Name !! World !! Visibility !! NID<br />
|-<br />
| 0.931.010-3.740.011 || [[SceSyscon#SceSysconForDriver|SceSysconForDriver]] || Non-secure || Kernel || 0x60A35F64<br />
|}<br />
<br />
== Types ==<br />
<br />
<source lang="c"><br />
#define SCE_KERNEL_ERROR_SYSCON_ERROR 0x80250000<br />
#define SCE_SYSCON_ERROR_INVALID_SIZE 0x80250001<br />
#define SCE_SYSCON_ERROR_INVALID_ARGUMENT 0x80250002<br />
#define SCE_SYSCON_ERROR_INVALID_POINTER 0x80250003<br />
#define SCE_SYSCON_ERROR_INVALID_STATUS 0x80250004<br />
#define SCE_SYSCON_ERROR_NOT_INTR_ALLOWED 0x80250005<br />
#define SCE_SYSCON_ERROR_TX_SIZE_TOO_LONG 0x80250006<br />
<br />
#define SCE_SYSCON_ERROR_ILLEGAL_SIZE 0x80250100<br />
#define SCE_SYSCON_ERROR_ILLEGAL_STATUS 0x80250101<br />
#define SCE_SYSCON_ERROR_NOEXEC 0x80250102<br />
#define SCE_SYSCON_ERROR_INVALID_FLAGS 0x80250105<br />
<br />
// Syscon error codes are gotten with 0x80250200 | rx[3], where rx is the data returned by Syscon<br />
<br />
typedef struct SceSysconPacket { // size is 0x80<br />
struct SceSysconPacket *next;<br />
SceUInt32 status; // Lower 16 bits contain flags<br />
SceUID semaId;<br />
SceUInt32 index; // Out: returns to which packet list the packet was inserted into<br />
SceUInt8 tx[32]; // tx[0..1] = cmd, tx[2] = size i.e. sizeof(actual_data)+1, rx[3..31] = actual_data<br />
SceUInt8 rx[32]; // rx[0..1] = cmd, rx[2] = size i.e. sizeof(actual_data)+2, rx[3] = error_code, rx[4..31] = actual_data<br />
void *tx_extra;<br />
void *rx_extra;<br />
SceSize rx_extra_size;<br />
SceUInt32 rx_offset;<br />
int (*callback)(SceSysconPacket *packet, void *argp);<br />
void *argp;<br />
SceUInt32 time;<br />
SceUInt32 unk[5];<br />
} SceSysconPacket;<br />
<br />
typedef enum SceSysconControl {<br />
SCE_SYSCON_CTRL_UP = 0x1,<br />
SCE_SYSCON_CTRL_RIGHT = 0x2,<br />
SCE_SYSCON_CTRL_DOWN = 0x4,<br />
SCE_SYSCON_CTRL_LEFT = 0x8,<br />
SCE_SYSCON_CTRL_TRIANGLE = 0x10,<br />
SCE_SYSCON_CTRL_CIRCLE = 0x20,<br />
SCE_SYSCON_CTRL_CROSS = 0x40,<br />
SCE_SYSCON_CTRL_SQUARE = 0x80,<br />
SCE_SYSCON_CTRL_SELECT = 0x100,<br />
SCE_SYSCON_CTRL_LTRIGGER = 0x200,<br />
SCE_SYSCON_CTRL_RTRIGGER = 0x400,<br />
SCE_SYSCON_CTRL_START = 0x800,<br />
SCE_SYSCON_CTRL_PSBUTTON = 0x1000,<br />
SCE_SYSCON_CTRL_POWER = 0x4000,<br />
SCE_SYSCON_CTRL_VOLUP = 0x10000,<br />
SCE_SYSCON_CTRL_VOLDOWN = 0x20000,<br />
SCE_SYSCON_CTRL_HEADPHONE = 0x8000000<br />
} SceSysconControl;<br />
</source><br />
<br />
Flags (passed to <code>sceSysconCmdExecForDriver</code>, etc), also lower bits of <code>status</code>:<br />
{| class="wikitable"<br />
! Flags !! Meaning<br />
|-<br />
| 0x1 || Some kind of priority that helps to select to which packet list the packet is inserted into.<br />
|-<br />
| 0x100 || Do not insert packet checksum (at <code>tx_buf[2 + len]</code>), where <code>len = tx_buf[2]</code>. And don't memset the rest of the buffer to -1 (<code>memset(tx_buf + len + 3, -1, 29 - len)</code>) if len < 29.<br />
|-<br />
| 0x400 || When set, use rx_extra to receive the data. rx_extra_size must be greater than 32.<br />
|-<br />
| 0x800 || When set, use tx_extra instead of tx for sending data. The size is contained in tx_extra[2] and must be smaller or equal to 253. When cleared: use tx and the size is contained in tx[2], which has to be smaller or equal 29.<br />
|}<br />
<br />
== SceSysconForDriver ==<br />
<br />
=== sceSysconErnieShutdownForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x94AB13CC<br />
|}<br />
<br />
<source lang="C"><br />
#define ERNIE_SHUTDOWN_SHUTDOWN 0<br />
#define ERNIE_SHUTDOWN_REBOOT 1<br />
<br />
int sceSysconErnieShutdownForDriver(int mode);<br />
</source><br />
<br />
=== sceSysconPowerCtrlKermitResetForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x14B99945<br />
|}<br />
<br />
Executes [[SMC]] 0x11A: <code>return sceSysconSetPowerMode(2, 0);</code><br />
<br />
<source lang="C">int sceSysconPowerCtrlKermitResetForDriver(void);</source><br />
<br />
=== sceSysconBatterySWResetForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x87DA378D<br />
|}<br />
<br />
If Syscon version <= 0x70503, it does nothing and returns error 0x8025023F.<br />
<br />
<source lang="C">int sceSysconBatterySWResetForDriver(void);</source><br />
<br />
=== sceSysconGetBatteryFullCapacityForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0xF93CF833<br />
|}<br />
<br />
Used in [[ScePower]]'s module_start.<br />
<br />
<source lang="C">int sceSysconGetBatteryFullCapacityForDriver(void *pResult);</source><br />
<br />
=== sceSysconGetBatteryCycleCountForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0xCD73079D<br />
|}<br />
<br />
Used in [[ScePower]].<br />
<br />
<source lang="C">int sceSysconGetBatteryCycleCountForDriver(void *pRedsult);</source><br />
<br />
=== sceSysconBatteryStartBLModeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x2CEF078E<br />
|}<br />
<br />
<source lang="C">int sceSysconBatteryStartBLModeForDriver(void);</source><br />
<br />
=== sceSysconBatteryStopBLModeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xE4AE7852<br />
|}<br />
<br />
<source lang="C">int sceSysconBatteryStopBLModeForDriver(void);</source><br />
<br />
=== sceSysconBatterySetBLCommandForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xE4F29744<br />
|}<br />
<br />
BL command (1 byte at most) must be contained in either unk_byte or pSrc.<br />
<br />
<source lang="C">int sceSysconBatterySetBLCommandForDriver(SceUInt16 ctx, SceUInt8 unk_byte, void *pSrc, SceUInt8 size);</source><br />
<br />
=== sceSysconBatteryExecBLCommandForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x74B2AB55<br />
|}<br />
<br />
<source lang="C">int sceSysconBatteryExecBLCommandForDriver(SceUInt16 ctx);</source><br />
<br />
=== sceSysconBatteryReadBLCommandForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x448DAFF1<br />
|}<br />
<br />
<source lang="C"><br />
// size must be between 0 and 0x10<br />
int sceSysconBatteryReadBLCommandForDriver(SceUInt16 ctx, SceUInt8 unk1, SceUInt8 unk2, void *pDst, SceUInt8 size);<br />
</source><br />
<br />
=== sceSysconReadBatteryRegForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xC2FB5565<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
=== sceSysconGetManualChargeModeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0x4FEC564C<br />
|}<br />
<br />
<source lang="C">int sceSysconGetManualChargeModeForDriver(int *piMode);</source><br />
<br />
=== sceSysconCtrlManualChargeModeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0xC6A2C9EF<br />
|}<br />
<br />
<source lang="C">int sceSysconCtrlManualChargeModeForDriver(int mode);</source><br />
<br />
=== sceSysconGetLogInfoForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0x701535FC<br />
|}<br />
<br />
<source lang="C"><br />
typedef struct SceSysconLogInfo { // size is 8 on FW 3.600.011<br />
uint8_t unk_0[8];<br />
} SceSysconLogInfo;<br />
<br />
int sceSysconGetLogInfoForDriver(SceSysconLogInfo *pInfo);<br />
</source><br />
<br />
=== sceSysconLogStartForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0x4E55CF5E<br />
|}<br />
<br />
<source lang="C">int sceSysconLogStartForDriver(void);</source><br />
<br />
=== sceSysconLogStartWaitingForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.12 || not present<br />
|-<br />
| 2.500.071-3.740.011 || 0x9C0B1E61<br />
|}<br />
<br />
<source lang="C">int sceSysconLogStartWaitingForDriver(void);</source><br />
<br />
=== sceSysconLogReadDataForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0x487D97F3<br />
|}<br />
<br />
<source lang="C">int sceSysconLogReadDataForDriver(SceUInt32 offset, void *buffer, SceSize size);</source><br />
<br />
=== sceSysconGetTemperatureLogForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.12 || not present<br />
|-<br />
| 2.500.071-3.740.011 || 0x3B354824<br />
|}<br />
<br />
=== sceSysconClearTemperatureLogForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.12 || not present<br />
|-<br />
| 2.500.071-3.740.011 || 0x3843D657<br />
|}<br />
<br />
=== sceSysconGetUsbDetStatusForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0xEF810687<br />
|}<br />
<br />
=== sceSysconCtrlDolceLEDForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0x727F985A<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C"><br />
#define STATE_ON 0<br />
#define STATE_BLINK_SLOW 1<br />
#define STATE_BLINK_FAST 2<br />
<br />
int sceSysconCtrlDolceLEDForDriver(SceUInt32 state);<br />
</source><br />
<br />
=== sceSysconGetTimeStampForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x4D588A0A<br />
|}<br />
<br />
This is a guessed named, derived from PSP. Temp name was sceSysconGetBaryonTimestampForDriver.<br />
<br />
Returns the timestamp of latest installed Syscon firmware patch, formatted as <code>YYYYMMDDhhmm</code>. This comes from a string stored in Syscon firmware under another format: <code>$Date:: YYYY-MM-DD hh:mm:ss +0900#$</code><br />
<br />
Example: <code>$Date:: 2013-12-13 15:52:05 +0900#$</code> in Syscon firmware becomes <code>201312131552</code> in Syscon command 2.<br />
<br />
<source lang="c"><br />
// pTimestamp will point to a buffer of size 0x10 bytes, containing a string of size 13 (12: length + 1: terminal character)<br />
int sceSysconGetTimeStampForDriver(char *pTimestamp);<br />
</source><br />
<br />
=== sceSysconGetWakeupFactorForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xCF5B2F2F<br />
|}<br />
<br />
Result is 2 bytes wakeup factor coming from Syscon command 0x10.<br />
<br />
<source lang="C">int sceSysconGetWakeupFactorForDriver(SceUInt32 *pWakeupFactor);</source><br />
<br />
=== sceSysconCtrlHdmiCecPowerForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x62155962<br />
|}<br />
<br />
If Syscon version is strictly lower than 0x40000, it does nothing and returns 0.<br />
<br />
Sets the pin CDC Hot Plug Detect (HPD) state of the HDMI bridge (AD80244 / ADV7533).<br />
<br />
<source lang="c">int sceSysconCtrlHdmiCecPowerForDriver(SceBool enable_HDMI_CDC_HPD_pin);</source><br />
<br />
=== sceSysconCtrlMotionSensorPowerForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x063425AE<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
If Syscon version is strictly lower than 0x40000, it does nothing and returns 0.<br />
<br />
<source lang="C">int sceSysconCtrlMotionSensorPowerForDriver(SceBool enable);</source><br />
<br />
=== SceSysconForDriver_3FDD29D6 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x3FDD29D6<br />
|}<br />
<br />
<source lang="C">int SceSysconForDriver_3FDD29D6(int a1, SceBool use_flag);</source><br />
<br />
=== sceSysconCtrlVoltageForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.920.050-3.740.011 || 0x7F198FA2<br />
|}<br />
<br />
Temp name was sceSysconSetVoltageForDriver.<br />
<br />
Used in [[ScePower]].<br />
<br />
<source lang="C"><br />
/*<br />
type:<br />
0: Reserved<br />
1: DD1 (VDD - IFTU, DMAC, Internal bus, SPM 32KiB/128KiB) SetSysClockFrequency, SetDmac5ClockFrequency, SetBusClockFrequency, SetCameraBusClockFrequency<br />
2: DD2 (VDDA - ARM core, L2 cache) SetArmClockFrequency<br />
3: DD3 (VDDC - Codec Engine, AVC Decoder) SetVipClockFrequency, SetVeneziaClockFrequency<br />
4: DD4 (VDDG - GPU core) SetGpuClockFrequencyInternal, SetGpuXbarClockFrequency, SetCompatClockFrequency<br />
<br />
vid:<br />
0x22 (0.34V)<br />
0x8A (1.38V) - (something got from ScePervasiveForDriver)<br />
*/<br />
<br />
#define SCE_SYSCON_VOLTAGE_DD1 (1)<br />
#define SCE_SYSCON_VOLTAGE_DD2 (2)<br />
#define SCE_SYSCON_VOLTAGE_DD3 (3)<br />
#define SCE_SYSCON_VOLTAGE_DD4 (4)<br />
<br />
int sceSysconCtrlVoltageForDriver(SceUInt32 type, SceUInt32 vid);</source><br />
<br />
=== sceSysconSetPowerModeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x8A95D35C<br />
|}<br />
<br />
Temp name was sceSysconResetDeviceForDriver.<br />
<br />
<source lang="c">int sceSysconSetPowerModeForDriver(int type, int mode);</source><br />
<br />
It issues <code>SMC #0</code> with <code>r12 = 0x11A</code>.<br />
<br />
The <code>mode</code> argument is usually set to <code>0x2</code> or sometimes <code>0x8002</code> (which seems to correspond to some request by the UDC and BT drivers).<br />
<br />
The <code>type</code> argument determines what to do.<br />
<br />
Real definition names are like: "SCE_SYSCON_POWERMODE_MODE_STANDBY".<br />
<br />
{| class="wikitable"<br />
! Type !! Description !! Syscon command<br />
|-<br />
| 0 || Power off || <code>{0xC0, 0, 5, type, (~mode) & 0xFF, (~mode >> 8) & 0xFF, (mode >> 16) & 0xFF}</code><br />
|-<br />
| 1 || Suspend (low-power state) || <code>{0xC0, 0, 5, type, (~mode) & 0xFF, (~mode >> 8) & 0xFF, (mode >> 16) & 0xFF}</code><br />
|-<br />
| 2 || Cold reset || <code>{0x01, 8, 1, 0}</code><br />
|-<br />
| 3 || ?Reset to update mode? || <code>{0xC1, 0, 2, 0}</code><br />
|-<br />
| 4 || ?Reset to update mode? || <code>{0xC1, 0, 2, 1}</code><br />
|-<br />
| 5 || Hibernate || <code>{0xC2, 0, 2, 0x5A}</code><br />
|-<br />
| 16 || ?? || <code>{0xC0, 0, 5, type, (~mode) & 0xFF, (~mode >> 8) & 0xFF, (mode >> 16) & 0xFF}</code><br />
|-<br />
| 17 || Resume (soft reset: suspend and immediately resume) || <code>{0xC0, 0, 5, type, (~mode) & 0xFF, (~mode >> 8) & 0xFF, (mode >> 16) & 0xFF}</code><br />
|}<br />
<br />
=== sceSysconEnableHibernateIOForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0x4946538A<br />
|}<br />
<br />
<source lang="C">int sceSysconEnableHibernateIOForDriver(int a1);</source><br />
<br />
=== sceSysconWaitReadyForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0x55DF1C9B<br />
|}<br />
<br />
Temp name was sceSysconWaitInitializedForDriver.<br />
<br />
<source lang="c">int sceSysconWaitReadyForDriver(void);</source><br />
<br />
=== sceSysconCmdSyncForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x6E517D22<br />
|}<br />
<br />
<source lang="c">int sceSysconCmdSyncForDriver(SceSysconPacket *packet, int noWait);</source><br />
<br />
=== sceSysconCmdExecForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x9ADDCA4A<br />
|}<br />
<br />
<source lang="c">int sceSysconCmdExecForDriver(SceSysconPacket *packet, unsigned int flags);</source><br />
<br />
=== sceSysconCmdExecAsyncForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xC2224E82<br />
|}<br />
<source lang="c">int sceSysconCmdExecAsyncForDriver(SceSysconPacket *packet, u32 flags, int (*callback)(SceSysconPacket *, void *), void *argp);</source><br />
<br />
=== sceSysconCtrlSdPowerForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xBE1ADE4F<br />
|}<br />
<br />
If Syscon version is strictly lower than 0x40000, it does nothing and returns 0. Calls Syscon command 0x888.<br />
<br />
Enables/disables GameCard reader.<br />
<br />
Used in [[SceSdstor]].<br />
<br />
<source lang="c"><br />
// param: 1 = enable SD (GameCard reader) power, 0 = disable SD (GameCard reader) power<br />
int sceSysconCtrlSdPowerForDriver(SceUInt16 param);<br />
</source><br />
<br />
=== sceSysconCtrlWirelessPowerForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.995.000 || 0x4FBDA504<br />
|-<br />
| 0.996.090-3.740.011 || not present<br />
|}<br />
<br />
If Syscon version is strictly lower than 0x40000, it does nothing and returns 0. Calls Syscon command 0x88A.<br />
<br />
Replaced by function [[#sceSysconCtrlWirelessPower2ForDriver]].<br />
<br />
<source lang="C">int sceSysconCtrlWirelessPowerForDriver(SceUInt16 param);</source><br />
<br />
=== sceSysconCtrlWirelessPower2ForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0xA2E85DB9<br />
|}<br />
<br />
Replacement function for [[#sceSysconCtrlWirelessPowerForDriver]]. Calls Syscon command 0x88A.<br />
<br />
<source lang="C">int sceSysconCtrlWirelessPower2ForDriver(SceUInt16 param);</source><br />
<br />
=== sceSysconCtrlWirelessPowerDownForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.995.000 || 0xDF8C6D2D<br />
|-<br />
| 0.996.090-3.740.011 || not present<br />
|}<br />
<br />
If motherboard is not "hardware info third byte 0x10" (probably IRS-001), it does nothing and returns 0, probably because missing hardware. Calls Syscon command 0xB1. Wireless power down might be a button to enable/disable Wireless, like on PSP.<br />
<br />
<source lang="C">int sceSysconCtrlWirelessPowerDownForDriver(SceUInt16 param);</source><br />
<br />
=== sceSysconVerifyConfigstorageScriptForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.990.000 || not present<br />
|-<br />
| 0.995.000-3.740.011 || 0xCC6F90A8<br />
|}<br />
<br />
This function is not used in the OS and anyway it would always return error because it calls a command that is not implemented in Syscon FW.<br />
<br />
<source lang="C">int sceSysconVerifyConfigstorageScriptForDriver(int a1, void *pScript, SceSize size);</source><br />
<br />
=== sceSysconLoadConfigstorageScriptForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.990.000 || not present<br />
|-<br />
| 0.995.000-3.740.011 || 0x89C5CFD6<br />
|}<br />
<br />
The OS uses this function to change between modes: IDU mode, Show Mode, no mode. This works by spoofing or rewriting [[KBL Param#Hardware Info|Hardware Info]]. This is reboot persistent.<br />
<br />
<source lang="C">int sceSysconLoadConfigstorageScriptForDriver(int a1, void *pScript, SceSize size);</source><br />
<br />
=== sceSysconBeginConfigstorageTransactionForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0xA4968B8C<br />
|}<br />
<br />
<source lang="C">int sceSysconBeginConfigstorageTransactionForDriver(void);</source><br />
<br />
=== sceSysconCommitConfigstorageTransactionForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0x7B9B3617<br />
|}<br />
<br />
<source lang="C">int sceSysconCommitConfigstorageTransactionForDriver(void);</source><br />
<br />
=== sceSysconEndConfigstorageTransactionForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0xFCC3E8EE<br />
|}<br />
<br />
<source lang="C">int sceSysconEndConfigstorageTransactionForDriver(void);</source><br />
<br />
=== sceSysconSetDebugHandlersForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xF245CD6F<br />
|}<br />
<br />
<source lang="c"><br />
/** A set of debug handlers for syscon, that you can set in sceSysconSetDebugHandlersForDriver(). */<br />
typedef struct SceSysconDebugHandlers {<br />
/** Structure size (probably, unused). */<br />
s32 size;<br />
/** Callback ran right before running a packet, with a pointer to it passed as the first argument. */<br />
void (*start)(SceSysconPacket *packet);<br />
/** Callback ran right after finishing running a packet, with a pointer to it passed as the first argument. */<br />
void (*end)(SceSysconPacket *packet);<br />
} SceSysconDebugHandlers;<br />
<br />
int sceSysconSetDebugHandlersForDriver(SceSysconDebugHandlers *debug_handlers);<br />
</source><br />
<br />
=== sceSysconGetBatteryCalibDataForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.36 || not present<br />
|-<br />
| 3.500.011-3.740.011 || 0x9ADC9936<br />
|}<br />
<br />
<source lang="C">int sceSysconGetBatteryCalibDataForDriver(int *piData1, int *piData2, int *piData3, int *piData4);</source><br />
<br />
=== sceSysconGetTouchpanelDeviceInfoForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xF492E69E<br />
|}<br />
<br />
<source lang="C"><br />
typedef struct SceKernelTouchpanelDeviceInfo { // size is 8 bytes<br />
uint16_t FrontVendorID;<br />
uint16_t FrontFirmwareRev;<br />
uint16_t RearVendorID;<br />
uint16_t RearFirmwareRev;<br />
} SceKernelTouchpanelDeviceInfo;<br />
<br />
int sceSysconGetTouchpanelDeviceInfoForDriver(SceKernelTouchpanelDeviceInfo *pInfo);<br />
</source><br />
<br />
=== sceSysconGetTouchpanelDeviceInfo2ForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.50 || not present<br />
|-<br />
| 1.690.011-3.740.011 || 0x030D447F<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Returns extended touchpanel info.<br />
<br />
<source lang="C"><br />
// this is a guessed name<br />
typedef struct SceKernelTouchpanelInfo { // size is 0xA bytes<br />
SceUInt16 vendorID;<br />
SceUInt16 firmwareRev;<br />
SceUInt16 configRev;<br />
SceUInt8 hwVersion;<br />
SceUInt8 vendorInfo;<br />
SceUInt16 reserved;<br />
} SceKernelTouchpanelInfo;<br />
<br />
// this is a guessed name<br />
typedef struct SceKernelTouchpanelDeviceInfo2 { // size is 0x14 bytes<br />
SceKernelTouchpanelInfo front;<br />
SceKernelTouchpanelInfo rear;<br />
} SceKernelTouchpanelDeviceInfo2;<br />
<br />
int sceSysconGetTouchpanelDeviceInfo2ForDriver(SceKernelTouchpanelDeviceInfo2 *pInfo);<br />
</source><br />
<br />
=== sceSysconMotionGetDeviceInfoForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xD01E64FC<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Returns motion sensor device info. See [[SceMotionDev#sceMotionDevGetDeviceInfoForDriver]] to reverse the pInfo structure.<br />
<br />
<source lang="C">int sceSysconMotionGetDeviceInfoForDriver(void *pInfo);</source><br />
<br />
=== sceSysconGetHardwareInfoForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xCBD6D8BC<br />
|}<br />
<br />
Returns [[KBL Param#Hardware Info|Hardware Info]] obtained from Syscon command 0x5.<br />
<br />
<source lang="C">int sceSysconGetHardwareInfoForDriver(void);</source><br />
<br />
=== sceSysconGetHardwareInfo2ForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0x965C68C3<br />
|}<br />
<br />
Returns [[KBL Param#Hardware Info 2|Hardware Info 2]] obtained from Syscon command 0x6.<br />
<br />
This function was certainly added for PS Vita Slim or PS TV support because [[KBL Param#Hardware Info|Hardware Info]] risked being fulfilled if too many hardware revisions were made.<br />
<br />
Used in [[SceAudio#SceAudioIn|SceAudioIn]] (maybe to check Conexant IC), [[SceCodec]] (maybe to check Conexant IC), and [[SceVshBridge#vshSysconGetHardwareInfo2|_vshSysconGetHardwareInfo2]].<br />
<br />
<source lang="C"><br />
typedef struct SceKernelHardwareInfo2 {<br />
SceUInt8 flags[0x10];<br />
} SceKernelHardwareInfo2;<br />
<br />
int sceSysconGetHardwareInfo2ForDriver(SceKernelHardwareInfo2 *pInfo);<br />
</source><br />
<br />
=== sceSysconGetErnieVersionForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-3.740.011 || 0xFF86F4C5<br />
|}<br />
<br />
This is a guessed name. Temp name was sceSysconGetBaryonVersionForDriver.<br />
<br />
<source lang="c">int sceSysconGetErnieVersionForDriver(void);</source><br />
<br />
=== SceSysconForDriver_EBE3262C ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0xEBE3262C<br />
|}<br />
<br />
In [[SceSblPostSsMgr]], used just after [[#sceSysconGetErnieVersionForDriver]].<br />
<br />
Returns 8 bits of some Syscon Mode information. Bit 6 (from right) is Syscon DownLoader Mode flag. Bit 3 (from right) is Power Online flag.<br />
<br />
<source lang="C">SceUInt8 SceSysconForDriver_EBE3262C(void);</source><br />
<br />
=== sceSysconIsDownLoaderModeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0x9ADD60D2<br />
|}<br />
<br />
<source lang="C">int sceSysconIsDownLoaderModeForDriver(void);</source><br />
<br />
=== sceSysconIsDealDownLoaderModeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xB7BCC638<br />
|}<br />
<br />
<source lang="C">int sceSysconIsDealDownLoaderModeForDriver(void);</source><br />
<br />
=== sceSysconNopForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x0D0B6D25<br />
|}<br />
<br />
Maybe exits Syscon Deal DownLoader mode.<br />
<br />
<source lang="C">int sceSysconNopForDriver(void);</source><br />
<br />
=== sceSysconIsPowerOnlineForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x9DA2A5AB<br />
|}<br />
<br />
Returns true iff Syscon information bit 3 (from right) is set. See also [[#SceSysconForDriver_EBE3262C]].<br />
<br />
Used in many [[ScePower]] functions for example before setting display brightness (to save battery).<br />
<br />
<source lang="C">SceBool sceSysconIsPowerOnlineForDriver(void);</source><br />
<br />
=== sceSysconGetErnieDLVersionForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xD2F456DC<br />
|}<br />
<br />
Calls Syscon command 0x1100.<br />
<br />
<source lang="C">void sceSysconGetErnieDLVersionForDriver(int *pVersion);</source><br />
<br />
=== sceSysconGetBatteryVersionForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x68E0031E<br />
|}<br />
<br />
Battery IC name: if HWinfo > 7 "Abby" else "Bert".<br />
<br />
<source lang="C">int sceSysconGetBatteryVersionForDriver(SceUInt16 *HWinfo, SceUInt16 *FWinfo, SceUInt16 *DFinfo);</source><br />
<br />
=== sceSysconAbbySyncForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.81 || not present<br />
|-<br />
| 2.000.081-3.740.011 || 0xDFB024C4<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">int sceSysconAbbySyncForDriver(SceUInt32 *puiStatus);</source><br />
<br />
=== sceSysconGetManufacturesStatusForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.692.000 || not present<br />
|-<br />
| 1.800.071-3.740.011 || 0x3E09A1F4<br />
|}<br />
<br />
In theory, this function should only be called when Product Mode is already set.<br />
<br />
<source lang="C">int sceSysconGetManufacturesStatusForDriver(int *piStatus);</source><br />
<br />
=== sceSysconReadScratchPadForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x299B1CE7<br />
|}<br />
<br />
Temp name was sceSysconReadCommandForDriver, sceSysconVsReadDataForDriver.<br />
<br />
Calls Syscon command 0x90.<br />
<br />
Used in [[SceRtc]].<br />
<br />
See also [[Ernie#Syscon_Scratch_Pad|Syscon Scratchpad structure]].<br />
<br />
<source lang="C"><br />
// size: On FW 3.60, must be between 0 and 0x18. On FW 0.931, must be 2, 4 or 8.<br />
// offset: Must be between 0 and 0xFF.<br />
// offset + size must not exceed 0x100<br />
int sceSysconReadScratchPadForDriver(SceUInt32 offset, void *buffer, SceSize size);<br />
</source><br />
<br />
=== sceSysconWriteScratchPadForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xE26488B9<br />
|}<br />
<br />
Temp name was sceSysconSendCommandForDriver, sceSysconVsWriteDataForDriver.<br />
<br />
Calls Syscon command 0x91.<br />
<br />
Used in [[SceRtc]] and [[ScePower]].<br />
<br />
See also [[Ernie#Syscon_Scratch_Pad|Syscon Scratchpad structure]].<br />
<br />
<source lang="C"><br />
// size: On FW 3.60, must be between 0 and 0x18. On FW 0.931, must be 2, 4 or 8.<br />
// offset: Must be between 0 and 0xFF.<br />
// offset + size must not exceed 0x100<br />
int sceSysconWriteScratchPadForDriver(SceUInt32 offset, void *buffer, SceSize size);<br />
</source><br />
<br />
=== sceSysconNvsSetRunModeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x81A6060D<br />
|}<br />
<br />
Used in [[SceSblSsMgr#sceSblNvsReadDataForKernel|sceSblNvsReadDataForKernel]] and [[SceSblSsMgr#sceSblNvsWriteDataForKernel|sceSblNvsWriteDataForKernel]].<br />
<br />
<source lang="C"><br />
// mode: 0 before NVS read/write<br />
int sceSysconNvsSetRunModeForDriver(int mode);<br />
</source><br />
<br />
=== sceSysconNvsSetUnkModeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x2EC6D55D<br />
|}<br />
<br />
<source lang="C"><br />
// mode: unk<br />
int sceSysconNvsSetUnkModeForDriver(int mode);<br />
</source><br />
<br />
=== sceSysconNvsReadDataForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xACAFA2B8<br />
|}<br />
<br />
Used in [[SceSblSsMgr#sceSblNvsReadDataForKernel|sceSblNvsReadDataForKernel]] and [[SceSblSsMgr#sceSblSsGetNvsDataForDriver|sceSblSsGetNvsDataForDriver]].<br />
<br />
<source lang="C">int sceSysconNvsReadDataForDriver(SceUInt32 offset, void *buffer, SceSize size);</source><br />
<br />
=== sceSysconNvsWriteDataForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x10C9657A<br />
|}<br />
<br />
Used in [[SceSblSsMgr#sceSblNvsWriteDataForKernel|sceSblNvsWriteDataForKernel]] and [[SceSblSsMgr#sceSblSsSetNvsDataForDriver|sceSblSsSetNvsDataForDriver]].<br />
<br />
<source lang="C">int sceSysconNvsWriteDataForDriver(SceUInt32 offset, void *buffer, SceSize size);</source><br />
<br />
=== sceSysconGetMultiCnInfoForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x1503D6A0<br />
|}<br />
<br />
Returns data obtained by Syscon command 0x103.<br />
<br />
Returns 0x4ff00 when nothing is connected.<br />
<br />
Returns 0x40080 when pin 11 is pulled to GND.<br />
<br />
Returns 0x40680 when pin 12 is pulled to GND.<br />
<br />
Returns 0x40380 when pin 12 is pulled to GND while pin 11 pulled to ground via 100K resistor.<br />
<br />
Returns 0x40000 on PSTV<br />
<br />
Bits 8 and 9 indicate that an audio-out dock is connected.<br />
<br />
Bits 8, 9, 11, 12, 13, 14 and 15 indicate that [[UDC]] pins are connected.<br />
<br />
Used in [[SceHpremote]], [[SceUsbServ]].<br />
<br />
<source lang="C">int sceSysconGetMultiCnInfoForDriver(SceUInt32 *pInfo);</source><br />
<br />
=== sceSysconSetMultiCnPortForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x8AAB6308<br />
|}<br />
<br />
Used in [[SceSblPostSsMgr]].<br />
<br />
<source lang="C"><br />
// port: 0: for JIG mode, 1 for UART0 logging mode, 0x10000: for normal mode<br />
int sceSysconSetMultiCnPortForDriver(int port);<br />
</source><br />
<br />
=== sceSysconConfigLEDForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.996.090-3.740.011 || 0x6F586D1A<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Used in [[ScePower]].<br />
<br />
<source lang="C"><br />
#define DEVICE_UNK 0x40 // maybe PS button or CP power LED or maybe color (blue)<br />
<br />
// unk: SceLedConfig.unk_4<br />
<br />
int sceSysconConfigLEDForDriver(int device, SceUInt32 unk);<br />
</source><br />
<br />
=== SceSysconForDriver_9CA6EB70 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 1.000.071-3.740.011 || 0x9CA6EB70<br />
|}<br />
<br />
On motherboards IRT-001 and older, it does nothing and returns 0, probably because missing hardware that could be a LED, else it sends 2 bytes using Syscon command 0x89E.<br />
<br />
Used in [[ScePower#ScePowerForDriver_38415146]]. Related to LED.<br />
<br />
<source lang="C">int SceSysconForDriver_9CA6EB70(SceBool state);</source><br />
<br />
=== sceSysconCtrlAccPowerForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x8D1D97E8<br />
|}<br />
<br />
<source lang="C">int sceSysconCtrlAccPowerForDriver(SceBool enable);</source><br />
<br />
=== sceSysconCtrlUsbStatusForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x59DC5938<br />
|}<br />
<br />
Sends 3 bytes to Syscon command 0x89A.<br />
<br />
Related to [[SceUdcd]] and [[ScePower]].<br />
<br />
<source lang="C">int sceSysconCtrlUsbStatusForDriver(SceUInt32 value);</source><br />
<br />
=== sceSysconCtrlRMRPowerForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0x710A7CF0<br />
|}<br />
<br />
Temp name was sceSysconCtrlMsPowerForDriver.<br />
<br />
<source lang="c">int sceSysconCtrlRMRPowerForDriver(int enable_power);</source><br />
<br />
=== sceSysconCtrlDevKitUsbPowerForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0xB1F88B11<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">int sceSysconCtrlDevKitUsbPowerForDriver(SceBool enable);</source><br />
<br />
=== SceSysconForDriver_3274A925 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.692.000 || not present<br />
|-<br />
| 1.800.071-3.740.011 || 0x3274A925<br />
|}<br />
<br />
Temp name was sceSysconCtrlDolceUsbPowerForDriver.<br />
<br />
This function enables/disables a USB bus related to either PS Vita IRS-1001 Wlan/Bt module USB or PS Vita 3G modem USB. This also affects PS TV USB host and maybe also PS TV ethernet.<br />
<br />
Used in [[SceUsbEtherSmsc]], [[SceUsbServ]].<br />
<br />
This function was maybe added to support IRS-1001 motherboard.<br />
<br />
<source lang="C">int SceSysconForDriver_3274A925(SceBool enable);</source><br />
<br />
=== sceSysconJigOpenPortForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x44A173F5<br />
|}<br />
<br />
<source lang="C">int sceSysconJigOpenPortForDriver(void);</source><br />
<br />
=== sceSysconJigClosePortForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x483FAE05<br />
|}<br />
<br />
<source lang="C">int sceSysconJigClosePortForDriver(void);</source><br />
<br />
=== sceSysconJigSetConfigForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xD24BF916<br />
|}<br />
<br />
<source lang="C">int sceSysconJigSetConfigForDriver(SceUInt8 a1, SceUInt8 a2);</source><br />
<br />
=== SceSysconForDriver_058941D7 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x058941D7<br />
|}<br />
<br />
It is probably a "sceSysconCtrl...ForDriver" function.<br />
<br />
Sends 2 bytes to Syscon using Syscon command 0xB0.<br />
<br />
=== sceSysconCtrlHostOutputViaDongleForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0xDECCB2B4<br />
|}<br />
<br />
Enables / disables Kermit UART0 output (logs) via Dongle (Jig).<br />
<br />
Sends 2 bytes to Syscon using Syscon command 0xB2.<br />
<br />
<source lang="C">int sceSysconCtrlHostOutputViaDongleForDriver(SceBool enable);</source><br />
<br />
=== SceSysconForDriver_33B5CDB3 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.996.090-3.740.011 || 0x33B5CDB3<br />
|}<br />
<br />
Reads from Syscon using Syscon command 0xB3.<br />
<br />
This function was probably added to support IRS-002 motherboard.<br />
<br />
=== SceSysconForDriver_F6D4DDC4 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.692.000 || not present<br />
|-<br />
| 1.800.071-3.740.011 || 0xF6D4DDC4<br />
|}<br />
<br />
Reads from Syscon using Syscon command 0xB4. It is probably the "get" equivalent of [[#SceSysconForDriver_00AE3AEB]].<br />
<br />
This function was added to support IRS-1001 motherboard.<br />
<br />
=== SceSysconForDriver_00AE3AEB ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.692.000 || not present<br />
|-<br />
| 1.800.071-3.740.011 || 0x00AE3AEB<br />
|}<br />
<br />
It is probably a "sceSysconCtrl...ForDriver" function.<br />
<br />
Sends 2 bytes to Syscon using Syscon command 0xB5. It is probably the "set" equivalent of [[#SceSysconForDriver_F6D4DDC4]].<br />
<br />
This function was added to support IRS-1001 motherboard.<br />
<br />
=== SceSysconForDriver_0D300158 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.100.081-3.740.011 || 0x0D300158<br />
|}<br />
<br />
It is probably a "sceSysconCtrl...ForDriver" function.<br />
<br />
Sends 2 bytes to Syscon using Syscon command 0xB6. It is probably the "set" equivalent of [[#SceSysconForDriver_91EF4EC3]].<br />
<br />
This function was added to support DOL-1002 motherboard.<br />
<br />
=== SceSysconForDriver_91EF4EC3 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.100.081-3.740.011 || 0x91EF4EC3<br />
|}<br />
<br />
Reads from Syscon using Syscon command 0xB7. It is probably the "get" equivalent of [[#SceSysconForDriver_0D300158]].<br />
<br />
This function was added to support DOL-1002 motherboard.<br />
<br />
=== receive_pm_sm_jig_msg_from_syscon ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x3C80B529<br />
|}<br />
<br />
<source lang="C">int receive_pm_sm_jig_msg_from_syscon(SceUInt32 offset, SceSize size, void *buf);</source><br />
<br />
=== send_pm_sm_jig_msg_to_syscon ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x7BFBA09E<br />
|}<br />
<br />
=== send_pm_sm_stop_to_syscon ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x933D813F<br />
|}<br />
<br />
Used just after send_pm_sm_jig_msg_to_syscon or when it fails before.<br />
<br />
<source lang="C">int send_pm_sm_stop_to_syscon(int a1, int a2, int a3);</source><br />
<br />
=== sceSysconIduModeSetForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.996.090 || not present<br />
|-<br />
| 1.030.071-3.740.011 || 0x956D07CB<br />
|}<br />
<br />
<source lang="C">int sceSysconIduModeSetForDriver(void);</source><br />
<br />
=== sceSysconIduModeClearForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.996.090 || not present<br />
|-<br />
| 1.030.071-3.740.011 || 0x34574496<br />
|}<br />
<br />
<source lang="C">int sceSysconIduModeClearForDriver(void);</source><br />
<br />
=== sceSysconShowModeSetForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.50 || not present<br />
|-<br />
| 1.600.061-3.740.011 || 0x6D65B70F<br />
|}<br />
<br />
<source lang="C">int sceSysconShowModeSetForDriver(void);</source><br />
<br />
=== sceSysconShowModeClearForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.50 || not present<br />
|-<br />
| 1.600.061-3.740.011 || 0x8D7724C0<br />
|}<br />
<br />
<source lang="C">int sceSysconShowModeClearForDriver(void);</source><br />
<br />
=== sceSysconSetWlanCallbackForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.996.090 || 0x4DEB8712<br />
|-<br />
| 1.03-3.740.011 || not present<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Registers a Wlan-related callback.<br />
<br />
index 5 on FWs 0.931.010-0.940.<br />
<br />
=== SceSysconForDriver_18A6F4D9 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x18A6F4D9<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
index 0 on FW 3.600.011.<br />
<br />
No use case seen.<br />
<br />
Related to [[#SceSysconForDriver_C0F215B7]].<br />
<br />
<source lang="C">int SceSysconForDriver_18A6F4D9(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_DE613081 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xDE613081<br />
|}<br />
<br />
A guessed name is sceSysconSetHeadphoneCallbackForDriver.<br />
<br />
Registers an headphone remote related callback.<br />
<br />
index 1 on FW 3.600.011.<br />
<br />
Used in [[SceHpremote]].<br />
<br />
Related to [[#SceSysconForDriver_C3504ADE]].<br />
<br />
<source lang="C">int SceSysconForDriver_DE613081(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_229A07C2 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x229A07C2<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
index 2 on FW 3.600.011.<br />
<br />
No use case seen.<br />
<br />
Related to [[#SceSysconForDriver_B832B72C]].<br />
<br />
<source lang="C">int SceSysconForDriver_229A07C2(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_8351526D ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x8351526D<br />
|}<br />
<br />
A guessed name is sceSysconSetAlarmTimerCallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
index 3 on FW 3.600.011.<br />
<br />
Used in [[SceRtc]].<br />
<br />
Related to [[#SceSysconForDriver_86BAAF7D]].<br />
<br />
<source lang="C">int SceSysconForDriver_8351526D(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_9F8340FF ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x9F8340FF<br />
|}<br />
<br />
A guessed name is sceSysconSetResumeRequestCallbackForDriver.<br />
<br />
Registers the "is resume requested" callback.<br />
<br />
Used in [[ScePower]] to register a callback that sets the [[ScePower]] global variable g_resume_requested to SCE_TRUE.<br />
<br />
index 4 on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_A57B5433]].<br />
<br />
<source lang="C">int SceSysconForDriver_9F8340FF(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_35E1689F ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x35E1689F<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
Used in [[SceHpremote]].<br />
<br />
index 5 on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_ACC7F71E]].<br />
<br />
<source lang="C">int SceSysconForDriver_35E1689F(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_474A9EA7 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x474A9EA7<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
index 0xC on FWs 0.931.010-0.940. index 6 on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_769F9AC4]].<br />
<br />
No use case seen.<br />
<br />
<source lang="C">int SceSysconForDriver_474A9EA7(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_4E88B4D9 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x4E88B4D9<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
index 8 on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_4BC63A40]].<br />
<br />
No use case seen. Maybe used in internal modules for Jig.<br />
<br />
<source lang="C">int SceSysconForDriver_4E88B4D9(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_376CCCB8 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x376CCCB8<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
index 9 on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_99A254A9]].<br />
<br />
No use case seen.<br />
<br />
<source lang="C">int SceSysconForDriver_376CCCB8(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_3BAAC8A9 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.995.000 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0x3BAAC8A9<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
index 0xA on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_9A4F4B7C]].<br />
<br />
No use case seen.<br />
<br />
<source lang="C">int SceSysconForDriver_3BAAC8A9(void *cb_0, void *cb_1);</source><br />
<br />
=== sceSysconSetAccCallbackForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.995.000-3.740.011 || 0x4A42712F<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Registers 2 callbacks (maybe constructor and destructor or callback and args) for accessory port.<br />
<br />
index 0xF on FW 3.600.011.<br />
<br />
Used in [[SceUsbServ]].<br />
<br />
<source lang="C">int sceSysconSetAccCallbackForDriver(void *cb_0, void *cb_1);</source><br />
<br />
=== sceSysconSetLowBatteryCallbackForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x3F0DB7C0<br />
|}<br />
<br />
Registers the low-battery callback.<br />
<br />
index 6 on FWs 0.931-0.940. index 0x10 on FW 3.600.011.<br />
<br />
<source lang="C">int sceSysconSetLowBatteryCallbackForDriver(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_80D6E061 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.000.071-3.740.011 || 0x80D6E061<br />
|}<br />
<br />
A guessed name is sceSysconSetBatteryOnlineCallbackForDriver.<br />
<br />
Registers a callback. Maybe related to Battery online status.<br />
<br />
index 0x11 on FW 3.600.011.<br />
<br />
<source lang="C">int SceSysconForDriver_80D6E061(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_7682FE69 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.000.071-3.740.011 || 0x7682FE69<br />
|}<br />
<br />
A guessed name is sceSysconSet...Battery...CallbackForDriver.<br />
<br />
Registers a battery-related callback.<br />
<br />
No use case seen.<br />
<br />
index 0x12 on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_4A184B7C]].<br />
<br />
<source lang="C">int SceSysconForDriver_7682FE69(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_E0D52DF0 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xE0D52DF0<br />
|}<br />
<br />
A guessed name is sceSysconSet...Battery...CallbackForDriver.<br />
<br />
Registers a battery-related callback.<br />
<br />
No use case seen.<br />
<br />
index 0x13 on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_ACEE1C70]].<br />
<br />
<source lang="C">int SceSysconForDriver_E0D52DF0(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_2D471528 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 1.000.071-3.740.011 || 0x2D471528<br />
|}<br />
<br />
A guessed name is sceSysconSet...Battery...CallbackForDriver.<br />
<br />
Registers a callback very similar to the low battery callback.<br />
<br />
Used in [[ScePower]].<br />
<br />
index 0x14 on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_03C50DC3]].<br />
<br />
<source lang="C">int SceSysconForDriver_2D471528(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_129EA022 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0x129EA022<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
Used in [[ScePower]].<br />
<br />
index 0x15 on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_BFDA5590]].<br />
<br />
<source lang="C">int SceSysconForDriver_129EA022(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_85E5DEBF ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.996.090 || not present<br />
|-<br />
| 1.000.071-3.740.011 || 0x85E5DEBF<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
index 0x16 on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_63B14156]].<br />
<br />
No use case seen.<br />
<br />
<source lang="C">int SceSysconForDriver_85E5DEBF(void *cb_0, void *cb_1);</source><br />
<br />
=== sceSysconSetThermalAlertCallbackForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.996.090 || not present<br />
|-<br />
| 1.000.071-3.740.011 || 0x773B8126<br />
|}<br />
<br />
Registers the thermal alert callback.<br />
<br />
index 0x17 on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_50CAE242]].<br />
<br />
<source lang="C">int sceSysconSetThermalAlertCallbackForDriver(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_2E4BA4B8 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x2E4BA4B8<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
index 0x19 on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_29CF4335]].<br />
<br />
No use case seen. Maybe used in internal modules for Jig.<br />
<br />
<source lang="C">int SceSysconForDriver_2E4BA4B8(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_C442D0BE ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.692.000 || not present<br />
|-<br />
| 1.800.071-3.740.011 || 0xC442D0BE<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
index 0x1A on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_9F4042F8]].<br />
<br />
No use case seen.<br />
<br />
<source lang="C">int SceSysconForDriver_C442D0BE(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_61AE3970 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.01 || not present<br />
|-<br />
| 3.100.081-3.740.011 || 0x61AE3970<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
index 0x1B on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_C50568E9]].<br />
<br />
No use case seen.<br />
<br />
<source lang="C">int SceSysconForDriver_61AE3970(void *cb_0, void *cb_1);</source><br />
<br />
=== sceSysconSetLowBatteryInhibitUpdateRebootCallbackForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.18 || not present<br />
|-<br />
| 3.300.041-3.740.011 || 0x94678881<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Registers the low-battery-inhibit-update-reboot callback.<br />
<br />
index 0x1C on FW 3.600.011.<br />
<br />
No use case seen.<br />
<br />
<source lang="C">int sceSysconSetLowBatteryInhibitUpdateRebootCallbackForDriver(void *cb_0, void *cb_1);</source><br />
<br />
=== sceSysconSetLowBatteryInhibitUpdateDownloadCallbackForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.18 || not present<br />
|-<br />
| 3.300.041-3.740.011 || 0x7AA00C01<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Registers the low-battery-inhibit-update-download callback.<br />
<br />
index 0x1D on FW 3.600.011.<br />
<br />
No use case seen.<br />
<br />
<source lang="C">int sceSysconSetLowBatteryInhibitUpdateDownloadCallbackForDriver(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_423D0C58 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x423D0C58<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
index 0x20 on FW 3.600.011.<br />
<br />
No use case seen.<br />
<br />
<source lang="C">int SceSysconForDriver_423D0C58(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_154676F1 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x154676F1<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
index 0x21 on FW 3.600.011.<br />
<br />
No use case seen.<br />
<br />
<source lang="C">int SceSysconForDriver_154676F1(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_63352A39 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x63352A39<br />
|}<br />
<br />
A guessed name is sceSysconSetMicrophoneCallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
index 0x22 on FW 3.600.011.<br />
<br />
Used in [[SceHpremote]].<br />
<br />
<source lang="C">int SceSysconForDriver_63352A39(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_14730196 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x14730196<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
index 0x23 on FW 3.600.011.<br />
<br />
No use case seen.<br />
<br />
<source lang="C">int SceSysconForDriver_14730196(void *cb_0, void *cb_1);</source><br />
<br />
=== sceSysconSetAlarmCallbackForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x32418370<br />
|}<br />
<br />
Registers the alarm callback.<br />
<br />
index 0 on FWs 0.931.010-0.940. index 0x24 on FW 3.600.011.<br />
<br />
<source lang="C">int sceSysconSetAlarmCallbackForDriver(void *cb_0, void *cb_1);</source><br />
<br />
=== sceSysconSetMultiCnOtgCallbackForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0xA26586B2<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Registers 2 callbacks (maybe constructor and destructor or callback and args) for multi-connector OTG on PS Vita Fat.<br />
<br />
index 0x25 on FW 3.600.011.<br />
<br />
Used in [[SceUsbServ]].<br />
<br />
<source lang="C">int sceSysconSetMultiCnOtgCallbackForDriver(void *cb_0, void *cb_1);</source><br />
<br />
=== sceSysconSetMiniUsbOtgCallbackForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0x67A4CB9F<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Registers 2 callbacks (maybe constructor and destructor or callback and args) for mini-USB OTG on PS Vita Slim.<br />
<br />
index 0x26 on FW 3.600.011.<br />
<br />
Used in [[SceUsbServ]].<br />
<br />
<source lang="C">int sceSysconSetMiniUsbOtgCallbackForDriver(void *cb_0, void *cb_1);</source><br />
<br />
=== sceSysconUpdaterSetSegmentForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x9B00BC7F<br />
|}<br />
<br />
<source lang="C"><br />
// segment_no: a 8bit value<br />
int sceSysconUpdaterSetSegmentForDriver(SceUInt32 segment_no);<br />
</source><br />
<br />
=== sceSysconUpdaterLoadSegmentForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x356B9696<br />
|}<br />
<br />
<source lang="C"><br />
// pSegment: the encrypted segment to load<br />
// unk: maybe segment_no<br />
// size: usually 0x400<br />
int sceSysconUpdaterLoadSegmentForDriver(void *segment, int unk, SceSize size);<br />
</source><br />
<br />
=== sceSysconUpdaterLoadSegment2ForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x734544E4<br />
|}<br />
<br />
<source lang="C"><br />
// pSegment: the encrypted segment to load<br />
// unk: maybe segment_no<br />
// size: usually 0x400<br />
int sceSysconUpdaterLoadSegment2ForDriver(void *segment, int unk, SceSize size);<br />
</source><br />
<br />
=== sceSysconUpdaterCalcChecksumForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xD27C3D80<br />
|}<br />
<br />
Computes checksum to use with [[#sceSysconUpdaterExecProgrammingForDriver]]. It does not call any Syscon command.<br />
<br />
<source lang="C">int sceSysconUpdaterCalcChecksumForDriver(void *data, SceSize size, int *checksum);</source><br />
<br />
=== sceSysconUpdaterExecProgrammingForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x69AD76E4<br />
|}<br />
<br />
Executes programming, i.e writes segments to Syscon Flash memory.<br />
<br />
<source lang="C"><br />
// checksum: value got from sceSysconUpdaterCalcChecksumForDriver<br />
int sceSysconUpdaterExecProgrammingForDriver(int checksum);<br />
</source><br />
<br />
=== sceSysconUpdaterSetRunModeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xB487C2FB<br />
|}<br />
<br />
On 3.60 Ernie firmware, only updater run mode 0x72BA seems to be actually useful. Modes 0x9A54 and 0x152E are recognized but just make the function return without doing anything. Mode 0xC5E7 is not recognized by Ernie firmware, although it is present on ARM side.<br />
<br />
<source lang="C"><br />
// mode: 0x72BA (0.931.010-3.740.011), 0x9A54 (0.931.010-3.740.011), 0x152E (3.600.011-3.740.011), 0x3665 (3.600.011-3.740.011), 0xC5E7 (3.600.011-3.740.011), <br />
int sceSysconUpdaterSetRunModeForDriver(int mode);<br />
</source><br />
<br />
=== sceSysconUpdaterExecFinalizeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xC7747A63<br />
|}<br />
<br />
<source lang="C"><br />
// digest: sha1 of decrypted concatenated segments, comes from Syscon Update package packet type 0x20<br />
// size: usually 0x14 (sha1 size)<br />
int sceSysconUpdaterExecFinalizeForDriver(void *digest, SceSize size);<br />
</source><br />
<br />
=== SceSysconForDriver_CBA836FF ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0xCBA836FF<br />
|}<br />
<br />
Sends a 0x18-byte buffer to Syscon command 0x1185. This Syscon command 0x1185 seems to be unimplemented in recent Syscon firmwares: it does not do anything.<br />
<br />
<source lang="C"><br />
// size: must be 0x18<br />
int SceSysconForDriver_CBA836FF(void *pBuf, SceSize size);<br />
</source><br />
<br />
=== snvs_read ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0xEBDF88B9<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Used in [[SceSblPostSsMgr]] to read data from SNVS with [[pm_sm]] command 8. Also used in [[SceSblUpdateMgr]] with [[update_service_sm]] commands 0xB0002 and 0xC0002.<br />
<br />
<source lang="C"><br />
// in_size: 0x10<br />
// out_size: 0x30<br />
int snvs_read(void *in_buf, SceSize in_size, void *out_buf, SceSize out_size);<br />
</source><br />
<br />
=== snvs_write ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0x63683B9B<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Used in [[SceSblPostSsMgr]] to write data to SNVS with [[pm_sm]] command 8. Also used in [[SceSblUpdateMgr]] with [[update_service_sm]] commands 0xB0002 and 0xC0002.<br />
<br />
<source lang="C"><br />
// in_size: 0x30<br />
// out_size: 0x10<br />
int snvs_write(void *in_buf, SceSize in_size, void *out_buf, SceSize out_size);<br />
</source><br />
<br />
=== syscon_update_command_0xD00002 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0x4D03754A<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Calls Syscon command 0xD0.<br />
<br />
Used in [[SceSblUpdateMgr]] with [[update_service_sm]] command 0xD0002.<br />
<br />
<source lang="C"><br />
// in_buf: buffer that embeds input data, usually 0xD0002 command request + 8<br />
// in_size: usually 0x28<br />
// out_buf: buffer to receive result, usually 0xD0002 command request + 0x30<br />
// out_size: usually 0x28<br />
int syscon_update_command_0xD00002(void *in_buf, SceSize in_size, void *out_buf, SceSize out_size);<br />
</source><br />
<br />
=== sceSysconSetAffirmativeRertryModeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x901D6CD4<br />
|}<br />
<br />
Typo is the name is intentional.<br />
<br />
Sets a flag used internally by [[SceSyscon]].<br />
<br />
Used in [[SceCtrl]], [[ScePower]].<br />
<br />
<source lang="C">int sceSysconSetAffirmativeRertryModeForDriver(int enable);</source><br />
<br />
=== sceSysconGetControlsInfoForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x145F59A4<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
See [[KBL Param#Boot Controls Info|Boot Controls Info]].<br />
<br />
Calls Syscon command 0x100.<br />
<br />
<source lang="C">int sceSysconGetControlsInfoForDriver(SceUInt32 *pCtrl);</source><br />
<br />
=== SceSysconForDriver_76272CB9 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.692.000 || not present<br />
|-<br />
| 1.800.071-3.740.011 || 0x76272CB9<br />
|}<br />
<br />
Gets a 4 byte value.<br />
<br />
Calls Syscon command 0x120.<br />
<br />
<source lang="C">int SceSysconForDriver_76272CB9(SceUInt32 *unk);</source><br />
<br />
=== sceSysconGetClockForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xD7BEFF8B<br />
|}<br />
<br />
Gets Syscon power-on time in ticks of 0.5 second. Each second the counter automatically increases by 2.<br />
<br />
Calls Syscon command 0x11.<br />
<br />
Used in [[SceRtc]] to calculate the current time and date.<br />
<br />
<source lang="C">int sceSysconGetClockForDriver(SceUInt32 *puiTime);</source><br />
<br />
=== SceSysconForDriver_3168F3AF ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x3168F3AF<br />
|}<br />
<br />
Calls Syscon command 0x12.<br />
<br />
It is an alarm timer. It must be initialized using Syscon command 0x82 via [[#SceSysconForDriver_51164951]].<br />
<br />
<source lang="C"><br />
// FW 0.931.010<br />
int SceSysconForDriver_3168F3AF(SceUInt32 *pResult);<br />
<br />
// FW 3.600.011-3.740.011<br />
int SceSysconForDriver_3168F3AF(SceUInt32 *pResult, SceUInt32 *pResult2);<br />
</source><br />
<br />
=== SceSysconForDriver_BA09F171 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0xBA09F171<br />
|}<br />
<br />
Calls Syscon command 0x13.<br />
<br />
It might be related to alarm/timer.<br />
<br />
<source lang="C">int SceSysconForDriver_BA09F171(SceUInt32 *pResult, SceUInt32 *pResult2);</source><br />
<br />
=== sceSysconSetClockForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x9B6A6F64<br />
|}<br />
<br />
Calls Syscon command 0x81.<br />
<br />
Sets current Syscon power on time in ticks of 0.5 second. The set value can be get with [[#sceSysconGetClockForDriver]].<br />
<br />
Used in [[SceRtc]]. Set to 0 just before setting Current Tick, to reset syscon power on time.<br />
<br />
<source lang="C">int sceSysconSetClockForDriver(SceUInt32 time);</source><br />
<br />
=== SceSysconForDriver_51164951 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x51164951<br />
|}<br />
<br />
Calls Syscon command 0x82. On Syscon version < 0x90907, 4 bytes are sent to Syscon, whilst on Syscon version >= 0x90907, 5 bytes are sent to Syscon.<br />
<br />
Used in [[SceRtc#sceRtcSetAlarmTickForDriver]].<br />
<br />
The set value can be get with [[#SceSysconForDriver_3168F3AF]].<br />
<br />
<source lang="C"><br />
// a1: seen value: 0xffffffff during Syscon Init<br />
// a2: some 8-bit flag, seen value: 0 during Syscon Init<br />
<br />
// FW 0.931.010<br />
int SceSysconForDriver_51164951(int a1);<br />
<br />
// FW 3.600.011-3.740.011<br />
int SceSysconForDriver_51164951(int a1, int a2);<br />
</source><br />
<br />
=== SceSysconForDriver_373ECF8A ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0x373ECF8A<br />
|}<br />
<br />
Calls Syscon command 0x83. Sends 3 bytes to Syscon. Used only if [[KBL Param#Hardware Info|Hardware Info]] indicates that the motherboard is not IRT-001 or IRT-002 or type 0x10 (maybe named IRS-001) and if console is not in manufacturing mode.<br />
<br />
<source lang="C">int SceSysconForDriver_373ECF8A(SceUInt32 unk);</source><br />
<br />
=== SceSysconForDriver_2659535C ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0x2659535C<br />
|}<br />
<br />
Calls Syscon command 0x84. Sends 1 byte to Syscon: 0.<br />
<br />
<source lang="C">int SceSysconForDriver_2659535C(void);</source><br />
<br />
=== SceSysconForDriver_4295D497 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0x4295D497<br />
|}<br />
<br />
Calls Syscon command 0x85. Sends 1 byte to Syscon: 0.<br />
<br />
<source lang="C">int SceSysconForDriver_4295D497(void);</source><br />
<br />
=== SceSysconForDriver_253CC522 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0x253CC522<br />
|}<br />
<br />
Calls Syscon command 0x807. Gets 2 bytes from Syscon.<br />
<br />
On DevKit, it returns 0x8025023F. Maybe limited by model: PS TV? PS Vita Slim?.<br />
<br />
<source lang="C">int SceSysconForDriver_253CC522(SceUInt16 *pResult);</source><br />
<br />
=== SceSysconForDriver_175CE5A1 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x175CE5A1<br />
|}<br />
<br />
Calls Syscon command 0x883. Gets 8 bytes from Syscon.<br />
<br />
<source lang="C"><br />
// pDst: pointer to a buffer of at least 8 bytes<br />
int SceSysconForDriver_175CE5A1(void *pDst);<br />
</source><br />
<br />
=== sceSysconCtrlDeviceResetForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x40FF3898<br />
|}<br />
<br />
Sends 2 bytes to Syscon command 0x88F.<br />
<br />
0xC/0 : Touch Front or Back device<br />
<br />
0xC/1 : Touch Front or Back device<br />
<br />
<source lang="C">int sceSysconCtrlDeviceResetForDriver(SceUInt8 a1, SceUInt8 a2);</source><br />
<br />
=== SceSysconForDriver_285594F8 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x285594F8<br />
|}<br />
<br />
Sends 2 bytes to Syscon command 0x890.<br />
<br />
<source lang="C">int SceSysconForDriver_285594F8(SceUInt16 value);</source><br />
<br />
=== sceSysconCtrlLEDForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x04EC7579<br />
|}<br />
<br />
<source lang="C"><br />
#define STATE_ON 1<br />
#define STATE_OFF 0<br />
<br />
#define DEVICE_UNK 0x40 // maybe PS button or CP power LED or maybe color (blue)<br />
<br />
int sceSysconCtrlLEDForDriver(SceUInt16 device, SceBool state);<br />
</source><br />
<br />
=== sceSysconCtrlChargeACForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x596B17B7<br />
|}<br />
<br />
Sends 2 bytes to Syscon command 0x892. Related to Battery. Maybe enables/disables battery charging.<br />
<br />
Used in [[ScePower]]'s module_start.<br />
<br />
<source lang="C">int sceSysconCtrlChargeACForDriver(SceBool enable);</source><br />
<br />
=== sceSysconCtrlChargeVBUSForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x2A4B0437<br />
|}<br />
<br />
Sends 3 bytes to Syscon command 0x893. Related to Battery. Maybe enables/disables battery charging.<br />
<br />
Used in [[ScePower]]'s module_start.<br />
<br />
<source lang="C"><br />
// a1: ex: 0, 1<br />
// a2: ex: 0, 1<br />
<br />
// FW 0.931.010<br />
int sceSysconCtrlChargeVBUSForDriver(SceUInt32 a1);<br />
<br />
// FW 3.600.011-3.740.011<br />
int sceSysconCtrlChargeVBUSForDriver(SceUInt32 a1, SceUInt32 a2);<br />
</source><br />
<br />
=== SceSysconForDriver_5CDDA14D ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x5CDDA14D<br />
|}<br />
<br />
A guessed name is sceSysconCtrlHpremoteForDriver.<br />
<br />
If Syscon version < 0x80001, it does nothing and returns 0, else it sends 2 bytes to Syscon command 0x899.<br />
<br />
Maybe enables/disables Jack power.<br />
<br />
Used in [[SceHpremote]].<br />
<br />
<source lang="C">int SceSysconForDriver_5CDDA14D(SceBool enable);</source><br />
<br />
=== SceSysconForDriver_A2FE9BF9 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xA2FE9BF9<br />
|}<br />
<br />
Gets information related to battery charge status, or USB power connection. See also [[Ernie#CMD_0x0800]].<br />
<br />
Used in [[ScePower]]'s module_start.<br />
<br />
<source lang="C">int SceSysconForDriver_A2FE9BF9(void *pResult);</source><br />
<br />
=== sceSysconGetBatteryTempForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x9070F139<br />
|}<br />
<br />
If Syscon version <= 0x70503, it calls Syscon command 0x8A0, else Syscon command 0x981.<br />
<br />
Used in [[ScePower]]'s module_start.<br />
<br />
<source lang="C">int sceSysconGetBatteryTempForDriver(int *pResult);</source><br />
<br />
=== sceSysconGetBatteryRemainCapacityForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xC562AF3A<br />
|}<br />
<br />
Only used in [[ScePower]].<br />
<br />
If Syscon version <= 0x70503, it calls Syscon command 0x802, else Syscon command 0x900.<br />
<br />
<source lang="C">int sceSysconGetBatteryRemainCapacityForDriver(SceUInt32 *pResult);</source><br />
<br />
=== sceSysconGetBatteryVoltForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x03F11220<br />
|}<br />
<br />
If Syscon version <= 0x70503, it calls Syscon command 0x803, else Syscon command 0x901.<br />
<br />
Used in [[ScePower]].<br />
<br />
<source lang="C">int sceSysconGetBatteryVoltForDriver(SceUInt32 *pResult);</source><br />
<br />
=== sceSysconGetBatteryLifePercentForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.06 || not present<br />
|-<br />
| 1.500.151-3.740.011 || 0xAD0A8275<br />
|}<br />
<br />
Used in [[ScePower]].<br />
<br />
<source lang="C">int sceSysconGetBatteryLifePercentForDriver(SceUInt32 *pResult);</source><br />
<br />
=== SceSysconForDriver_00A65FC1 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x00A65FC1<br />
|}<br />
<br />
If Syscon version <= 0x70503, it calls Syscon command 0x8A1, else Syscon command 0x982.<br />
<br />
Used in [[ScePower]].<br />
<br />
<source lang="C">int SceSysconForDriver_00A65FC1(int *pResult);</source><br />
<br />
=== sceSysconGetBatteryElecForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x0826BA07<br />
|}<br />
<br />
If Syscon version <= 0x70503, it calls Syscon command 0x8A2, else Syscon command 0x983.<br />
<br />
Used in [[ScePower]].<br />
<br />
<source lang="C">int sceSysconGetBatteryElecForDriver(SceUInt16 *pResult);</source><br />
<br />
=== sceSysconGetBatteryLifeTimeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xB841C141<br />
|}<br />
<br />
If Syscon version <= 0x70503, it calls Syscon command 0x8A3, else Syscon command 0x984.<br />
<br />
Used in [[ScePower]].<br />
<br />
<source lang="C">int sceSysconGetBatteryLifeTimeForDriver(SceUInt16 *pResult);</source><br />
<br />
=== sceSysconGetBatterySOHForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x91D3B7A3<br />
|}<br />
<br />
If Syscon version <= 0x70503, it calls Syscon command 0x8A4, else Syscon command 0x985.<br />
<br />
Used in [[ScePower]].<br />
<br />
<source lang="C">int sceSysconGetBatterySOHForDriver(void *pResult);</source><br />
<br />
=== SceSysconForDriver_FDB3AE9D ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xFDB3AE9D<br />
|}<br />
<br />
Gets 0x10 bytes from Syscon command 0x183.<br />
<br />
<source lang="C">int SceSysconForDriver_FDB3AE9D(int *pResult);</source><br />
<br />
=== SceSysconForDriver_C3504ADE ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xC3504ADE<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_DE613081]].<br />
<br />
Used in [[SceHpremote]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_C3504ADE(void);</source><br />
<br />
=== SceSysconForDriver_B832B72C ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xB832B72C<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_229A07C2]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_B832B72C(void);</source><br />
<br />
=== SceSysconForDriver_86BAAF7D ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x86BAAF7D<br />
|}<br />
<br />
A guessed name is sceSysconIsAlarmTimerExistForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_8351526D]].<br />
<br />
Used in [[SceRtc]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_86BAAF7D(void);</source><br />
<br />
=== SceSysconForDriver_A57B5433 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xA57B5433<br />
|}<br />
<br />
A guessed name is sceSysconIsResumeRequestedForDriver.<br />
<br />
Related to [[#SceSysconForDriver_9F8340FF]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_A57B5433(void);</source><br />
<br />
=== SceSysconForDriver_ACC7F71E ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xACC7F71E<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_35E1689F]].<br />
<br />
Used in [[SceHpremote]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_ACC7F71E(void);</source><br />
<br />
=== SceSysconForDriver_769F9AC4 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x769F9AC4<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_474A9EA7]].<br />
<br />
Returns always SCE_TRUE on PS TV. This function could be related to USB or ethernet availability.<br />
<br />
No use case seen.<br />
<br />
<source lang="C">SceBool SceSysconForDriver_769F9AC4(void);</source><br />
<br />
=== SceSysconForDriver_4BC63A40 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x4BC63A40<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_4E88B4D9]].<br />
<br />
Used in [[SceSblPostSsMgr]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_4BC63A40(void);</source><br />
<br />
=== SceSysconForDriver_99A254A9 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x99A254A9<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_376CCCB8]].<br />
<br />
No use case seen.<br />
<br />
<source lang="C">SceBool SceSysconForDriver_99A254A9(void);</source><br />
<br />
=== SceSysconForDriver_9A4F4B7C ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0x9A4F4B7C<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_3BAAC8A9]].<br />
<br />
No use case seen.<br />
<br />
<source lang="C">SceBool SceSysconForDriver_9A4F4B7C(void);</source><br />
<br />
=== SceSysconForDriver_92D2C6A4 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0x92D2C6A4<br />
|}<br />
<br />
<source lang="C">int SceSysconForDriver_92D2C6A4(void);</source><br />
<br />
=== SceSysconForDriver_B9EA2FA8 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.995.000-3.740.011 || 0xB9EA2FA8<br />
|}<br />
<br />
A guessed name is sceSysconIsAccExistForDriver.<br />
<br />
Only used in [[SceUsbServ]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_B9EA2FA8(void);</source><br />
<br />
=== SceSysconForDriver_29CF4335 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x29CF4335<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_2E4BA4B8]].<br />
<br />
It is related to Ernie DL Mode.<br />
<br />
Used in [[SceSblPostSsMgr]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_29CF4335(void);</source><br />
<br />
=== SceSysconForDriver_32B2DB3D ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x32B2DB3D<br />
|}<br />
<br />
<source lang="c">int SceSysconForDriver_32B2DB3D(void);</source><br />
<br />
=== sceSysconIsHeadphoneExistForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x142D5E82<br />
|}<br />
<br />
Used in [[SceHpremote#sceHprmIsHeadphoneExistForDriver]].<br />
<br />
<source lang="c">SceBool sceSysconIsHeadphoneExistForDriver(void);</source><br />
<br />
=== sceSysconIsMotionDevExistForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x490C5548<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Used in [[SceMotionDev]].<br />
<br />
<source lang="c">SceBool sceSysconIsMotionDevExistForDriver(void);</source><br />
<br />
=== SceSysconForDriver_012B57B3 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 0.940-3.740.011 || 0x012B57B3<br />
|}<br />
<br />
<source lang="c">int SceSysconForDriver_012B57B3(void);</source><br />
<br />
=== SceSysconForDriver_27758A64 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 1.000.071-3.740.011 || 0x27758A64<br />
|}<br />
<br />
A guessed name is sceSysconIsBatteryOnlineForDriver, deriving from [[#sceSysconIsPowerOnlineForDriver]].<br />
<br />
Used in [[ScePower#scePowerGetBatteryRemainLevelForDriver]], [[ScePower#scePowerIsLowBatteryForDriver]], [[ScePower]]'s module_start.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_80D6E061]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_27758A64(void);</source><br />
<br />
=== SceSysconForDriver_4A184B7C ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 1.000.071-3.740.011 || 0x4A184B7C<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns some information about battery.<br />
<br />
Used in [[ScePower#ScePowerForDriver_627A89C6]].<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_7682FE69]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_4A184B7C(void);</source><br />
<br />
=== SceSysconForDriver_ACEE1C70 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0xACEE1C70<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns information about battery. Only used when battery is working.<br />
<br />
Used in [[ScePower#ScePowerForDriver_0D56C601]].<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_E0D52DF0]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_ACEE1C70(void);</source><br />
<br />
=== SceSysconForDriver_03C50DC3 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 1.000.071-3.740.011 || 0x03C50DC3<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_2D471528]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_03C50DC3(void);</source><br />
<br />
=== SceSysconForDriver_BFDA5590 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0xBFDA5590<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_129EA022]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_BFDA5590(void);</source><br />
<br />
=== SceSysconForDriver_63B14156 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.996.090 || not present<br />
|-<br />
| 1.000.071-3.740.011 || 0x63B14156<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_85E5DEBF]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_63B14156(void);</source><br />
<br />
=== SceSysconForDriver_50CAE242 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 1.000.071-3.740.011 || 0x50CAE242<br />
|}<br />
<br />
A guessed name is sceSysconIsThermalAlertForDriver.<br />
<br />
Returns the global variable related to [[#sceSysconSetThermalAlertCallbackForDriver]].<br />
<br />
Used in [[ScePower]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_50CAE242(void);</source><br />
<br />
=== SceSysconForDriver_9F4042F8 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.692.000 || not present<br />
|-<br />
| 1.800.071-3.740.011 || 0x9F4042F8<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_C442D0BE]].<br />
<br />
No use case seen.<br />
<br />
<source lang="C">SceBool SceSysconForDriver_9F4042F8(void);</source><br />
<br />
=== SceSysconForDriver_C50568E9 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.01 || not present<br />
|-<br />
| 3.100.081-3.740.011 || 0xC50568E9<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_61AE3970]].<br />
<br />
This function was added to support DOL-1002 motherboard.<br />
<br />
No use case seen.<br />
<br />
<source lang="C">SceBool SceSysconForDriver_C50568E9(void);</source><br />
<br />
=== sceSysconIsLowBatteryForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xD7F5A797<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Only used in [[ScePower]].<br />
<br />
<source lang="C">SceBool sceSysconIsLowBatteryForDriver(void);</source><br />
<br />
=== sceSysconIsLowBatteryInhibitUpdateRebootForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.18 || not present<br />
|-<br />
| 3.300.041-3.740.011 || 0x1A0C140F<br />
|}<br />
<br />
This function was added along with [[ScePower#scePowerIsLowBatteryInhibitUpdateReboot]].<br />
<br />
Used in [[ScePower#scePowerIsLowBatteryInhibitUpdateReboot]].<br />
<br />
<source lang="c">SceBool sceSysconIsLowBatteryInhibitUpdateRebootForDriver(void);</source><br />
<br />
=== sceSysconIsLowBatteryInhibitUpdateDownloadForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.18 || not present<br />
|-<br />
| 3.300.041-3.740.011 || 0x1E3130EE<br />
|}<br />
<br />
This function was added along with [[ScePower#scePowerIsLowBatteryInhibitUpdateDownload]].<br />
<br />
Used in [[ScePower#scePowerIsLowBatteryInhibitUpdateDownload]].<br />
<br />
<source lang="c">SceBool sceSysconIsLowBatteryInhibitUpdateDownloadForDriver(void);</source><br />
<br />
=== sceSysconGetBatteryRemainLevelForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.18 || not present<br />
|-<br />
| 3.300.041-3.740.011 || 0x26F9D729<br />
|}<br />
<br />
Only used if Syscon version >= 0x1040105.<br />
<br />
This function was added along with [[ScePower#scePowerGetBatteryRemainLevelForDriver]].<br />
<br />
Used in [[ScePower#scePowerGetBatteryRemainLevelForDriver]].<br />
<br />
<source lang="C">int sceSysconGetBatteryRemainLevelForDriver(SceUInt8 *pResult1, SceUInt8 *pResult2);</source><br />
<br />
=== SceSysconForDriver_C0F215B7 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.990.000 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0xC0F215B7<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_18A6F4D9]].<br />
<br />
The global variable is updated by [[#sceSysconCmdSyncForDriver]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_C0F215B7(void);</source><br />
<br />
=== SceSysconForDriver_D6F6D472 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0xD6F6D472<br />
|}<br />
<br />
Gets electric information (maybe intensity) of the device connected to USB OTG on PS Vita Slim. It should be studied if PS TV supports this function and if this function was initially targetting PS TV.<br />
<br />
Returns a global variable updated by [[#sceSysconCmdSyncForDriver]], obtained using Syscon command 0x130.<br />
<br />
<source lang="C">int SceSysconForDriver_D6F6D472(int *pInfo);</source><br />
<br />
=== SceSysconForDriver_F99BC858 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.01 || not present<br />
|-<br />
| 3.100.081-3.740.011 || 0xF99BC858<br />
|}<br />
<br />
Detects microSD swap.<br />
<br />
Calls syscon command 0x131.<br />
<br />
This function was maybe added to support a prototype motherboard that has a microSD port.<br />
<br />
<source lang="C">int SceSysconForDriver_F99BC858(SceBool *isSwapped);</source><br />
<br />
=== SceSysconForDriver_E7893732 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0xE7893732<br />
|}<br />
<br />
Calls Syscon command 0x1B0. Related to UART or JIG on PS Vita Slim or PS TV.<br />
<br />
<source lang="C"><br />
// value holds 3 useful bytes and 1 byte not sent to syscon<br />
int SceSysconForDriver_E7893732(int value);<br />
</source><br />
<br />
=== sceSysconGetElmoFwVersionForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xA039B563<br />
|}<br />
<br />
Calls Syscon command 0x880.<br />
<br />
<source lang="C">int sceSysconGetElmoFwVersionForDriver(SceUInt32 *pResult);</source><br />
<br />
=== sceSysconGetCookieFwVersionForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x9BF78047<br />
|}<br />
<br />
Calls Syscon command 0x881.<br />
<br />
<source lang="C">int sceSysconGetCookieFwVersionForDriver(SceUInt32 *pResult);</source><br />
<br />
=== sceSysconReadElmoRegForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x5BF765BB<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Calls Syscon command 0x895.<br />
<br />
=== sceSysconWriteElmoRegForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xCCC71C28<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Calls Syscon command 0x896.<br />
<br />
=== sceSysconReadCookieRegForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x95975DD1<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Calls Syscon command 0x897. Probably reads data from Cookie.<br />
<br />
=== sceSysconWriteCookieRegForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xF39300D3<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Calls Syscon command 0x898. Probably writes data to Cookie.<br />
<br />
Returns error 0x80250001 if offset is greater than 0xFF.<br />
<br />
<source lang="C"><br />
// offset: 0-0xFF<br />
int sceSysconWriteCookieRegForDriver(SceUInt32 offset, SceUInt16 data);<br />
</source><br />
<br />
== Commands ==<br />
<br />
It seems like the command format is as follows: <code>(direction << 8) | cmd_id</code>, where <code>direction = 1</code> means write to syscon, and <code>direction = 0</code> means read from syscon.<br />
<br />
{| class="wikitable"<br />
! Command<br />
! Return size (without considering the 2 bytes rx.size and rx.error_code)<br />
! Functions NIDs<br />
! Description<br />
|-<br />
| 0x0<br />
| 0x0<br />
| 0x0D0B6D25<br />
| <br />
|-<br />
| 0x1<br />
| 0x4<br />
| module_start<br />
| sceSysconGetErnieVersionForDriver. Used during SysconInit.<br />
|-<br />
| 0x2<br />
| 0xC<br />
| module_start<br />
| sceSysconGetTimeStampForDriver. Returns 12-byte string followed by at least 2-byte memory leak. Used during SysconInit.<br />
|-<br />
| 0x3<br />
| 0x4<br />
| module_start<br />
| sceSysconGetSleepFactor. Used during SysconInit.<br />
|-<br />
| 0x4<br />
| 0x4<br />
| <br />
| <br />
|-<br />
| 0x5<br />
| 0x4<br />
| 0xCBD6D8BC, module_start<br />
| sceSysconGetHardwareInfoForDriver<br />
|-<br />
| 0x6<br />
| 0x10<br />
| 0x965C68C3, module_start<br />
| sceSysconGetHardwareInfo2ForDriver. Get Hardware Info 2. See [[KBL_Param#Hardware_Info_2]].<br />
|-<br />
| 0x10<br />
| 0x2<br />
| 0xCF5B2F2F<br />
| sceSysconGetWakeupFactorForDriver<br />
|-<br />
| 0x11<br />
| 0x4<br />
| 0xD7BEFF8B<br />
| sceSysconGetClockForDriver<br />
|-<br />
| 0x12<br />
| 0x5 or 0x6<br />
| 0x3168F3AF<br />
| ??<br />
|-<br />
| 0x13<br />
| 0x2<br />
| 0xBA09F171<br />
| ??<br />
|-<br />
| 0x14<br />
| 0x1<br />
| 0x93075DD1<br />
| ??<br />
|-<br />
| 0x15<br />
| 0x4<br />
| 0x3E09A1F4<br />
| sceSysconGetManufacturesStatusForDriver<br />
|-<br />
| 0x80<br />
| 0x0<br />
| module_start<br />
| ?? Used during SysconInit.<br />
|-<br />
| 0x81<br />
| ?<br />
| 0x9B6A6F64<br />
| sceSysconSetClockForDriver<br />
|-<br />
| 0x82<br />
| ?<br />
| 0x51164951<br />
| <br />
|-<br />
| 0x83<br />
| ?<br />
| 0x373ECF8A<br />
| Sends 3 bytes to Syscon.<br />
|-<br />
| 0x84<br />
| ?<br />
| 0x2659535C<br />
| Sends 1 byte to Syscon.<br />
|-<br />
| 0x85<br />
| ?<br />
| 0x4295D497<br />
| <br />
|-<br />
| 0x86<br />
| 8<br />
| 0x701535FC<br />
| sceSysconGetLogInfoForDriver<br />
|-<br />
| 0x87<br />
| 0<br />
| 0x4E55CF5E<br />
| sceSysconLogStartForDriver. Sends 1 byte to Syscon: 0.<br />
|-<br />
| 0x88<br />
| 0x18<br />
| 0x487D97F3<br />
| sceSysconLogReadDataForDriver. Sends 2 bytes to Syscon: offset.<br />
|-<br />
| 0x89<br />
| 0<br />
| 0x9C0B1E61<br />
| sceSysconLogStartWaitingForDriver. Sends 1 byte to Syscon: 0.<br />
|-<br />
| 0x90<br />
| ?0x3B?<br />
| 0x299B1CE7<br />
| sceSysconReadScratchPadForDriver<br />
|-<br />
| 0x91<br />
| ?0x3B?<br />
| 0xE26488B9<br />
| sceSysconWriteScratchPadForDriver<br />
|-<br />
| 0xA0<br />
| ?0x10 or 0x28?<br />
| second_loader<br />
| See [[Ernie Secure]].<br />
|-<br />
| 0xB0<br />
| 0<br />
| 0x058941D7<br />
| Probably a control command. Sends 2 bytes to Syscon.<br />
|-<br />
| 0xB1<br />
| 0<br />
| 0xDF8C6D2D<br />
| sceSysconCtrlWirelessPowerDownForDriver<br />
|-<br />
| 0xB2<br />
| 0<br />
| 0xDECCB2B4<br />
| sceSysconCtrlHostOutputViaDongleForDriver. Sends 2 bytes to Syscon.<br />
|-<br />
| 0xB3<br />
| at least 1<br />
| 0x33B5CDB3<br />
| ??<br />
|-<br />
| 0xB4<br />
| at least 1<br />
| 0xF6D4DDC4<br />
| ??<br />
|-<br />
| 0xB5<br />
| 0<br />
| 0x00AE3AEB<br />
| Probably a control command. Sends 2 bytes to Syscon.<br />
|-<br />
| 0xB6<br />
| 0<br />
| 0x0D300158<br />
| Probably a control command. Sends 2 bytes to Syscon.<br />
|-<br />
| 0xB7<br />
| at least 1<br />
| 0x91EF4EC3<br />
| ??<br />
|-<br />
| 0xC0<br />
| ?0x3E?<br />
| <br />
| <br />
|-<br />
| 0xC1<br />
| 0<br />
| 0x94AB13CC<br />
| sceSysconErnieShutdownForDriver. Sends 2 bytes to Syscon.<br />
|-<br />
| 0xD0<br />
| ?0x2A or 0x28?<br />
| <br />
| <br />
|-<br />
| 0xD1<br />
| ?0x2?<br />
| <br />
| <br />
|-<br />
| 0xD2<br />
| ?0x30?<br />
| second_loader, SNVS functions<br />
| See [[Ernie Secure]]. SNVS RW.<br />
|-<br />
| 0xD3<br />
| ?0x12?<br />
| <br />
| <br />
|-<br />
| 0x100<br />
| 0x4<br />
| 0x145F59A4<br />
| sceSysconGetControlsInfoForDriver. Used in SceCtrlVblankHandler in [[SceCtrl]].<br />
|-<br />
| 0x101<br />
| 0x8<br />
| <br />
| sceSysconGetControlsInfo2ForDriver. Used in SceCtrlVblankHandler in [[SceCtrl]]. Uses Ernie version and Ernie DL version.<br />
|-<br />
| 0x102<br />
| 0xC<br />
| <br />
| <br />
|-<br />
| 0x103<br />
| 0x4<br />
| 0x1503D6A0<br />
| sceSysconGetMultiCnInfoForDriver<br />
|-<br />
| 0x104<br />
| 0xC<br />
| <br />
| sceSysconGetControlsInfo3ForDriver. Used in SceCtrlVblankHandler in [[SceCtrl]].<br />
|-<br />
| 0x105<br />
| ?<br />
| <br />
| Uses string "PS" then "TUV".<br />
|-<br />
| 0x106<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x107<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x108<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x109<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x110<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x120<br />
| ?<br />
| 0x76272CB9<br />
| ??<br />
|-<br />
| 0x121<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x130<br />
| 0x4<br />
| module_start, 0xD6F6D472<br />
| Get USB OTG device electric info (maybe intensity). Used during SysconInit.<br />
|-<br />
| 0x131<br />
| ?0x1? (read)<br />
| 0xF99BC858<br />
| ?? Added on a FW > 2.50 and <= 3.100.081.<br />
|-<br />
| 0x140<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x141<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x142<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x143<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x144<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x145<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x146<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x147<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x148<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x150<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x151<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x152<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x153<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x154<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x155<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x156<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x157<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x160<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x161<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x162<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x163<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x168<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x170<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x171<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x172<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x180<br />
| ?<br />
| <br />
| Set analog sampling. Sends 2 bytes to Syscon: 0 to disable, 1 to enable on Syscon version is < 0x90202, 3 to enable on Syscon version is >= 0x90202. Used in SceCtrlVblankHandler in [[SceCtrl]].<br />
|-<br />
| 0x181<br />
| 0<br />
| 0xCFCEE733<br />
| Sends 2 bytes to Syscon.<br />
|-<br />
| 0x182<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x183<br />
| 0x10<br />
| 0xFDB3AE9D<br />
| Gets some info.<br />
|-<br />
| 0x184<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x185<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x186<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x187<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x188<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x189<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x18A<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x18B<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x18C<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x18D<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x18E<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x18F<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x190<br />
| 0<br />
| 0x8AAB6308<br />
| sceSysconSetMultiCnPortForDriver. Sends 3 bytes to Syscon.<br />
|-<br />
| 0x191<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x192<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1A0<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1A1<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1B0<br />
| 0<br />
| 0xE7893732<br />
| Sends 3 bytes to Syscon.<br />
|-<br />
| 0x1B2<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1C0<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1C1<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1C2<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1C3<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1C4<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1D0<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1D1<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1D2<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1D3<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1D4<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1D5<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1E0<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1E1<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1E2<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1E3<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x300<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x301<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x303<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x380<br />
| at least 1<br />
| 0xF492E69E<br />
| sceSysconGetTouchpanelDeviceInfoForDriver<br />
|-<br />
| 0x38A<br />
| at least 1<br />
| 0xA1F1B973<br />
| ??<br />
|-<br />
| 0x390<br />
| at least 1<br />
| 0x030D447F<br />
| sceSysconGetTouchpanelDeviceInfo2ForDriver<br />
|-<br />
| 0x392<br />
| ?<br />
| 0x48ED8981, 060E55C1<br />
| <br />
|-<br />
| 0x393<br />
| ?<br />
| 0x9A28BEEF, 0x8874EF45<br />
| Used in [[SceSblUpdateMgr]]<br />
|-<br />
| 0x3A9<br />
| 0<br />
| 0x010F95D9<br />
| Sends 1 byte to Syscon.<br />
|-<br />
| 0x3AB<br />
| ?<br />
| 0x357CC9D9<br />
| <br />
|-<br />
| 0x3AC<br />
| ?<br />
| 0x3664E2C0<br />
| ??<br />
|-<br />
| 0x3AF<br />
| ?<br />
| 0xB8F4F4E3<br />
| <br />
|-<br />
| 0x3B9<br />
| ?<br />
| 0x42E599AC<br />
| <br />
|-<br />
| 0x3BB<br />
| ?<br />
| 0xCCA56A16<br />
| <br />
|-<br />
| 0x3BC<br />
| ?<br />
| 0x2E6D97CD<br />
| ??<br />
|-<br />
| 0x3BF<br />
| ?<br />
| 0x240A604E<br />
| <br />
|-<br />
| 0x3C2<br />
| ?<br />
| 0x5946B29B, 0x10327C64<br />
| Used in [[SceSblUpdateMgr]]<br />
|-<br />
| 0x480<br />
| ?<br />
| 0xD01E64FC<br />
| ??<br />
|-<br />
| 0x481<br />
| ?<br />
| 0x9A7858B6<br />
| ??<br />
|-<br />
| 0x800<br />
| ?0x4?<br />
| 0xA2FE9BF9<br />
| SceSysconForDriver_A2FE9BF9. [[ScePower]] related.<br />
|-<br />
| 0x801<br />
| 0x0<br />
| <br />
| ??<br />
|-<br />
| 0x802<br />
| ?0x4?<br />
| 0xC562AF3A<br />
| sceSysconGetBatteryRemainCapacityForDriver. Replaced by Syscon command 0x900 on Syscon version > 0x70503.<br />
|-<br />
| 0x803<br />
| 0x4<br />
| 0x03F11220<br />
| sceSysconGetBatteryVoltForDriver. Replaced by Syscon command 0x901 on Syscon version > 0x70503.<br />
|-<br />
| 0x804<br />
| ?<br />
| <br />
| ??<br />
|-<br />
| 0x805<br />
| ?0x0?<br />
| 0xEF810687<br />
| sceSysconGetUsbDetStatusForDriver<br />
|-<br />
| 0x806<br />
| ?0x1?<br />
| 0xE7F5D3DC<br />
| Reboots PS Vita?<br />
|-<br />
| 0x807<br />
| 0x2<br />
| 0x253CC522<br />
| ??<br />
|-<br />
| 0x820<br />
| 0x0<br />
| 0x727F985A<br />
| sceSysconCtrlDolceLEDForDriver. PSTV LED on<br />
|-<br />
| 0x821<br />
| 0x0<br />
| 0x727F985A<br />
| sceSysconCtrlDolceLEDForDriver. PSTV LED blink slow<br />
|-<br />
| 0x822<br />
| 0x0<br />
| 0x727F985A<br />
| sceSysconCtrlDolceLEDForDriver. PSTV LED blink fast<br />
|-<br />
| 0x840<br />
| ?0x1?<br />
| 0x4FEC564C<br />
| sceSysconGetManualChargeModeForDriver<br />
|-<br />
| 0x841<br />
| ?0x1?<br />
| 0x3C3B949C<br />
| ??<br />
|-<br />
| 0x842<br />
| ?0x1?<br />
| 0x1C29C00E<br />
| ??<br />
|-<br />
| 0x843<br />
| ?0x1?<br />
| 0x730E4725<br />
| ??<br />
|-<br />
| 0x880<br />
| 0x4<br />
| 0xA039B563<br />
| sceSysconGetElmoFwVersionForDriver<br />
|-<br />
| 0x881<br />
| ?<br />
| 0x9BF78047<br />
| sceSysconGetCookieFwVersionForDriver<br />
|-<br />
| 0x882<br />
| 0x6<br />
| 0x68E0031E<br />
| sceSysconGetBatteryVersionForDriver. Replaced by Syscon command 0x980 on Syscon version > 0x70503.<br />
|-<br />
| 0x883<br />
| 0x8<br />
| 0x175CE5A1<br />
| ??<br />
|-<br />
| 0x884<br />
| ?<br />
| 0x3FDD29D6<br />
| ??<br />
|-<br />
| 0x885<br />
| ?<br />
| 0x79E6DD8B<br />
| ??<br />
|-<br />
| 0x886<br />
| ?0x2?<br />
| 0x62155962<br />
| sceSysconCtrlHdmiCecPowerForDriver<br />
|-<br />
| 0x887<br />
| ?<br />
| 0x063425AE<br />
| sceSysconCtrlMotionSensorPowerForDriver<br />
|-<br />
| 0x888<br />
| ?0x2?<br />
| 0xBE1ADE4F<br />
| sceSysconCtrlSdPowerForDriver<br />
|-<br />
| 0x889<br />
| ?0x2?<br />
| 0x8D1D97E8<br />
| sceSysconCtrlAccPowerForDriver<br />
|-<br />
| 0x88A<br />
| ?<br />
| 0x4FBDA504, 0xA2E85DB9<br />
| sceSysconCtrlWirelessPowerForDriver, sceSysconCtrlWirelessPower2ForDriver<br />
|-<br />
| 0x88B<br />
| ?<br />
| 0x5A614349<br />
| ??<br />
|-<br />
| 0x88C<br />
| ?<br />
| 0xB872E904<br />
| ??<br />
|-<br />
| 0x88D<br />
| ?<br />
| 0xDD16ABD9<br />
| ??<br />
|-<br />
| 0x88E<br />
| ?0x2?<br />
| 0x7F198FA2<br />
| sceSysconCtrlVoltageForDriver. See [[Ernie#CMD_0x088E_-_CtrlVoltage]].<br />
|-<br />
| 0x88F<br />
| ?0x2?<br />
| 0x40FF3898<br />
| sceSysconCtrlDeviceResetForDriver. ?UsbEtherSmsc and WlanBt related?<br />
|-<br />
| 0x890<br />
| ?<br />
| 0x285594F8<br />
| ??<br />
|-<br />
| 0x891<br />
| ?0x2?<br />
| 0x04EC7579<br />
| sceSysconCtrlLEDForDriver<br />
|-<br />
| 0x892<br />
| ?0?<br />
| 0x596B17B7<br />
| SceSysconForDriver_596B17B7. [[ScePower]] related.<br />
|-<br />
| 0x893<br />
| ?0?<br />
| 0x2A4B0437<br />
| SceSysconForDriver_2A4B0437. [[ScePower]] related.<br />
|-<br />
| 0x895<br />
| ?<br />
| 0x5BF765BB<br />
| sceSysconReadElmoRegForDriver<br />
|-<br />
| 0x896<br />
| ?<br />
| 0xCCC71C28<br />
| sceSysconWriteElmoRegForDriver<br />
|-<br />
| 0x897<br />
| ?<br />
| 0x95975DD1<br />
| sceSysconReadCookieRegForDriver<br />
|-<br />
| 0x898<br />
| ?<br />
| 0xF39300D3<br />
| sceSysconWriteCookieRegForDriver<br />
|-<br />
| 0x899<br />
| ?0?<br />
| 0x5CDDA14D<br />
| ?Guessed name: sceSysconCtrlHpremoteForDriver? [[SceHpremote]] related.<br />
|-<br />
| 0x89A<br />
| ?0?<br />
| 0x59DC5938<br />
| sceSysconCtrlUsbStatusForDriver<br />
|-<br />
| 0x89B<br />
| ?0x2?<br />
| 0x710A7CF0<br />
| sceSysconCtrlRMRPowerForDriver<br />
|-<br />
| 0x89C<br />
| ?0x2?<br />
| 0xB1F88B11<br />
| sceSysconCtrlDevKitUsbPowerForDriver. [[SceUsbServ]] related.<br />
|-<br />
| 0x89D<br />
| ?<br />
| 0x6F586D1A<br />
| sceSysconConfigLEDForDriver<br />
|-<br />
| 0x89E<br />
| ?<br />
| 0x9CA6EB70<br />
| [[ScePower]] related<br />
|-<br />
| 0x89F<br />
| ?<br />
| 0xCB41B531<br />
| ??<br />
|-<br />
| 0x8A0<br />
| ?0x4?<br />
| 0x9070F139<br />
| sceSysconGetBatteryTempForDriver. Replaced by Syscon command 0x981 on Syscon version > 0x70503.<br />
|-<br />
| 0x8A1<br />
| ?0x3B or 0x4?<br />
| 0x00A65FC1<br />
| Replaced by Syscon command 0x982 on Syscon version > 0x70503. [[ScePower]] related.<br />
|-<br />
| 0x8A2<br />
| 0x2<br />
| 0x0826BA07<br />
| sceSysconGetBatteryElecForDriver. Replaced by Syscon command 0x983 on Syscon version > 0x70503.<br />
|-<br />
| 0x8A3<br />
| ?0x4?<br />
| 0xB841C141<br />
| sceSysconGetBatteryLifeTimeForDriver. Replaced by Syscon command 0x984 on Syscon version > 0x70503.<br />
|-<br />
| 0x8A4<br />
| ?0x4?<br />
| 0x91D3B7A3<br />
| sceSysconGetBatterySOHForDriver. Replaced by Syscon command 0x985 on Syscon version > 0x70503.<br />
|-<br />
| 0x8B0<br />
| ?<br />
| 0x2CEF078E / 0x4946538A<br />
| sceSysconBatteryStartBLModeForDriver. Replaced by Syscon command 0x9B0 on Syscon version > 0x70503. Since FW 0.940, it is also sceSysconEnableHibernateIOForDriver independently of Syscon version.<br />
|-<br />
| 0x8B1<br />
| ?<br />
| 0xE4AE7852<br />
| sceSysconBatteryStopBLModeForDriver. Replaced by Syscon command 0x9B1 on Syscon version > 0x70503.<br />
|-<br />
| 0x8B2<br />
| ?<br />
| 0xE4F29744<br />
| sceSysconBatterySetBLCommandForDriver. Replaced by Syscon command 0x9B2 on Syscon version > 0x70503.<br />
|-<br />
| 0x8B3<br />
| ?<br />
| 0x74B2AB55<br />
| sceSysconBatteryExecBLCommandForDriver. Replaced by Syscon command 0x9B3 on Syscon version > 0x70503.<br />
|-<br />
| 0x8B4<br />
| ?<br />
| 0x448DAFF1<br />
| sceSysconBatteryReadBLCommandForDriver. Replaced by Syscon command 0x9B4 on Syscon version > 0x70503.<br />
|-<br />
| 0x8C0<br />
| ?<br />
| 0xC6A2C9EF<br />
| sceSysconCtrlManualChargeModeForDriver<br />
|-<br />
| 0x8C5<br />
| ?0x2 or 0?<br />
| 0x3274A925<br />
| ??. [[SceUsbServ]] and [[SceUsbEtherSmsc]] related.<br />
|-<br />
| 0x8C6<br />
| ?<br />
| 0xDFB024C4<br />
| sceSysconAbbySyncForDriver. [[SceSblUpdateMgr]] related<br />
|-<br />
| 0x8C7<br />
| ?<br />
| 0x87FF8041<br />
| ??<br />
|-<br />
| 0x8C8<br />
| ?<br />
| 0x7BFA95DA<br />
| ??<br />
|-<br />
| 0x8C9<br />
| ?<br />
| 0x451C1662<br />
| ??<br />
|-<br />
| 0x8CA<br />
| ?<br />
| 0x79074DE4<br />
| ??<br />
|-<br />
| 0x8CB<br />
| ?<br />
| 0x7D25F6D2<br />
| ??<br />
|-<br />
| 0x8CC<br />
| ?<br />
| 0xD2ADABCA<br />
| ??<br />
|-<br />
| 0x8CE<br />
| 0x10<br />
| 0x3B354824<br />
| sceSysconGetTemperatureLog<br />
|-<br />
| 0x8CF<br />
| 0<br />
| 0x3843D657<br />
| sceSysconClearTemperatureLog. Sends 2 bytes to syscon.<br />
|-<br />
| 0x8D0<br />
| ?<br />
| 0xF87679EE<br />
| ??<br />
|-<br />
| 0x900<br />
| ?0x4?<br />
| 0xC562AF3A<br />
| sceSysconGetBatteryRemainCapacityForDriver. Replaces Syscon command 0x802 on Syscon version > 0x70503.<br />
|-<br />
| 0x901<br />
| 0x4<br />
| 0x03F11220<br />
| sceSysconGetBatteryVoltForDriver. Replaces Syscon command 0x803 on Syscon version > 0x70503.<br />
|-<br />
| 0x902<br />
| ?0x4?<br />
| 0xAD0A8275<br />
| sceSysconGetBatteryLifePercentForDriver<br />
|-<br />
| 0x903<br />
| 0x2<br />
| 0x26F9D729<br />
| sceSysconGetBatteryRemainLevelForDriver. Added on a FW higher than 2.50 and Syscon version >= 0x1040105.<br />
|-<br />
| 0x904<br />
| ?<br />
| 0x9ADC9936<br />
| sceSysconGetBatteryCalibDataForDriver<br />
|-<br />
| 0x910<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x911<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x912<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x913<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x914<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x915<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x916<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x917<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x932<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x944<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x945<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x952<br />
| ?<br />
| <br />
| Uses string "PC" then "TUV".<br />
|-<br />
| 0x953<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x954<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x961<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x962<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x963<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x964<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x965<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x966<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x967<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x968<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x969<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x980<br />
| 0x6<br />
| 0x68E0031E<br />
| sceSysconGetBatteryVersionForDriver. Replaces Syscon command 0x882 on Syscon version > 0x70503.<br />
|-<br />
| 0x981<br />
| ?0x4?<br />
| 0x9070F139<br />
| sceSysconGetBatteryTempForDriver. Replaces Syscon command 0x8A0 on Syscon version > 0x70503.<br />
|-<br />
| 0x982<br />
| ?0x4?<br />
| 0x00A65FC1<br />
| Replaces Syscon command 0x8A1 on Syscon version > 0x70503. [[ScePower]] related.<br />
|-<br />
| 0x983<br />
| 0x2<br />
| 0x0826BA07<br />
| sceSysconGetBatteryElecForDriver. Replaces Syscon command 0x8A2 on Syscon version > 0x70503.<br />
|-<br />
| 0x984<br />
| ?0x4?<br />
| 0xB841C141<br />
| sceSysconGetBatteryLifeTimeForDriver. Replaces Syscon command 0x8A3 on Syscon version > 0x70503.<br />
|-<br />
| 0x985<br />
| ?0x4?<br />
| 0x91D3B7A3<br />
| sceSysconGetBatterySOHForDriver. Replaces Syscon command 0x8A4 on Syscon version > 0x70503.<br />
|-<br />
| 0x989<br />
| ?<br />
| 0x87DA378D<br />
| sceSysconBatterySWResetForDriver<br />
|-<br />
| 0x98A<br />
| ?0x4?<br />
| 0xF93CF833<br />
| sceSysconGetBatteryFullCapacityForDriver<br />
|-<br />
| 0x98B<br />
| ?<br />
| 0xE1885F68<br />
| ??<br />
|-<br />
| 0x98C<br />
| ?0x4?<br />
| 0xCD73079D<br />
| sceSysconGetBatteryCycleCountForDriver<br />
|-<br />
| 0x9B0<br />
| ?<br />
| 0x2CEF078E<br />
| sceSysconBatteryStartBLModeForDriver. Replaces Syscon command 0x8B0 on Syscon version > 0x70503.<br />
|-<br />
| 0x9B1<br />
| ?<br />
| 0xE4AE7852<br />
| sceSysconBatteryStopBLModeForDriver. Replaces Syscon command 0x8B1 on Syscon version > 0x70503.<br />
|-<br />
| 0x9B2<br />
| ?<br />
| 0xE4F29744<br />
| sceSysconBatterySetBLCommandForDriver. Replaces Syscon command 0x8B2 on Syscon version > 0x70503.<br />
|-<br />
| 0x9B3<br />
| ?<br />
| 0x74B2AB55<br />
| sceSysconBatteryExecBLCommandForDriver. Replaces Syscon command 0x8B3 on Syscon version > 0x70503.<br />
|-<br />
| 0x9B4<br />
| ?<br />
| 0x448DAFF1<br />
| sceSysconBatteryReadBLCommandForDriver. Replaces Syscon command 0x8B4 on Syscon version > 0x70503.<br />
|-<br />
| 0xA00<br />
| 0x0<br />
| <br />
| ??<br />
|-<br />
| 0xA82<br />
| ?<br />
| 0x7BAFE083<br />
| ??<br />
|-<br />
| 0x1080<br />
| ?0x0 or 0x2?<br />
| 0x81A6060D<br />
| sceSysconNvsSetRunModeForDriver<br />
|-<br />
| 0x1081<br />
| ?0x0 or 0x2?<br />
| 0x2EC6D55D<br />
| sceSysconNvsSetUnkModeForDriver<br />
|-<br />
| 0x1082<br />
| ?<br />
| 0xACAFA2B8<br />
| sceSysconNvsReadDataForDriver<br />
|-<br />
| 0x1083<br />
| ?0x2?<br />
| 0x10C9657A<br />
| sceSysconNvsWriteDataForDriver<br />
|-<br />
| 0x1100<br />
| 0x4<br />
| 0xD2F456DC<br />
| sceSysconGetErnieDLVersionForDriver<br />
|-<br />
| 0x1101<br />
| 0x4<br />
| <br />
| <br />
|-<br />
| 0x1180<br />
| ?<br />
| 0x9B00BC7F<br />
| sceSysconUpdaterSetSegmentForDriver<br />
|-<br />
| 0x1181<br />
| ?<br />
| 0x356B9696, 0x734544E4<br />
| sceSysconUpdaterLoadSegmentForDriver, sceSysconUpdaterLoadSegment2ForDriver<br />
|-<br />
| 0x1182<br />
| ?<br />
| 0x69AD76E4<br />
| sceSysconUpdaterExecProgrammingForDriver<br />
|-<br />
| 0x1183<br />
| ?<br />
| 0xB487C2FB<br />
| sceSysconUpdaterSetRunModeForDriver<br />
|-<br />
| 0x1184<br />
| ?<br />
| 0xC7747A63<br />
| sceSysconUpdaterExecFinalizeForDriver<br />
|-<br />
| 0x1185<br />
| ?<br />
| 0xCBA836FF<br />
| SceSysconForDriver_CBA836FF<br />
|-<br />
| 0x1300<br />
| 0x8<br />
| <br />
| ??<br />
|-<br />
| 0x1310<br />
| 0x1<br />
| 0x351946B0<br />
| ??<br />
|-<br />
| 0x1382<br />
| ?<br />
| 0xA4968B8C<br />
| sceSysconBeginConfigstorageTransactionForDriver<br />
|-<br />
| 0x1383<br />
| ?<br />
| 0xFCC3E8EE<br />
| sceSysconEndConfigstorageTransactionForDriver<br />
|-<br />
| 0x1384<br />
| ?<br />
| 0x7B9B3617<br />
| sceSysconCommitConfigstorageTransactionForDriver<br />
|-<br />
| 0x1385<br />
| ?<br />
| 0x89C5CFD6<br />
| sceSysconLoadConfigstorageScriptForDriver<br />
|-<br />
| 0x1386 (called from ARM Kernel but not implemented in Syscon FW)<br />
| ?<br />
| 0xCC6F90A8<br />
| sceSysconVerifyConfigstorageScriptForDriver<br />
|-<br />
| 0x1392<br />
| ?<br />
| 0xFD65FFCB<br />
| ??<br />
|-<br />
| 0x1393<br />
| ?<br />
| 0x02350352<br />
| ??<br />
|-<br />
| 0x1394<br />
| ?<br />
| 0x7DE84CE3<br />
| ??<br />
|-<br />
| 0x2080<br />
| ?<br />
| 0x44A173F5<br />
| sceSysconJigOpenPortForDriver<br />
|-<br />
| 0x2081<br />
| ?<br />
| 0x483FAE05<br />
| sceSysconJigClosePortForDriver<br />
|-<br />
| 0x2082<br />
| ?<br />
| 0xD24BF916<br />
| sceSysconJigSetConfigForDriver<br />
|-<br />
| 0x2083<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x2084<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x2085<br />
| ?<br />
| <br />
| <br />
|}<br />
<br />
== Callbacks ==<br />
<br />
All the following exported functions have this function prototype: <code>int sceSysconSet...Callback(void (*func)(int enable, void *argp), void *argp);</code>.<br />
<br />
{| class="wikitable"<br />
! Callback name !! Callback setter function !! State getter function !! Callback setter caller !! Comments<br />
|-<br />
| SYSCON_CB_ACC || [[#sceSysconSetAccCallbackForDriver]] || [[#SceSysconForDriver_B9EA2FA8]] || [[SceUsbServ]] ||<br />
|-<br />
| SYSCON_CB_MULTI_CN_OTG || [[#sceSysconSetMultiCnOtgCallbackForDriver]] || NA || [[SceUsbServ]] ||<br />
|-<br />
| SYSCON_CB_MINI_USB_OTG || [[#sceSysconSetMiniUsbOtgCallbackForDriver]] || NA || [[SceUsbServ]] ||<br />
|-<br />
| SYSCON_CB_ALARM || [[#sceSysconSetAlarmCallbackForDriver]] || NA || [[ScePower]] ||<br />
|-<br />
| ? || [[#SceSysconForDriver_18A6F4D9]] || [[#SceSysconForDriver_C0F215B7]] || No use case seen. ||<br />
|-<br />
| ?SYSCON_CB_HEADPHONE? || [[#SceSysconForDriver_DE613081]] || [[#SceSysconForDriver_C3504ADE]] || [[SceHpremote]] ||<br />
|-<br />
| ?SYSCON_CB_MICROPHONE? || [[#SceSysconForDriver_63352A39]] || NA || [[SceHpremote]] ||<br />
|-<br />
| ?SYSCON_CB_REMOTE? || [[#SceSysconForDriver_35E1689F]] || [[#SceSysconForDriver_ACC7F71E]] || [[SceHpremote]] ||<br />
|-<br />
| SYSCON_CB_LOW_BATTERY || [[#sceSysconSetLowBatteryCallbackForDriver]] || [[#sceSysconIsLowBatteryForDriver]] || [[ScePower]] ||<br />
|-<br />
| SYSCON_CB_THERMAL_ALERT || [[#sceSysconSetThermalAlertCallbackForDriver]] || [[#SceSysconForDriver_50CAE242]] || [[ScePower]] ||<br />
|-<br />
| SYSCON_CB_LOW_BATTERY_INIHIBIT_UPDATE_REBOOT || [[#sceSysconSetLowBatteryInhibitUpdateRebootCallbackForDriver]] || [[#sceSysconIsLowBatteryInhibitUpdateRebootForDriver]] || [[ScePower]] ||<br />
|-<br />
| SYSCON_CB_LOW_BATTERY_INIHIBIT_UPDATE_DOWNLOAD || [[#sceSysconSetLowBatteryInhibitUpdateDownloadCallbackForDriver]] || [[#sceSysconIsLowBatteryInhibitUpdateDownloadForDriver]] || [[ScePower]] ||<br />
|-<br />
| SYSCON_CB_BATTERY_ONLINE || [[#SceSysconForDriver_80D6E061]] || [[#SceSysconForDriver_27758A64]] || [[ScePower]] ||<br />
|-<br />
| SYSCON_CB_RESUME_REQUEST || [[#SceSysconForDriver_9F8340FF]] || [[#SceSysconForDriver_A57B5433]] || [[ScePower]] ||<br />
|-<br />
| ? || [[#SceSysconForDriver_2D471528]] || [[#SceSysconForDriver_03C50DC3]] || [[ScePower]] || Very similar to SYSCON_CB_LOW_BATTERY.<br />
|-<br />
| ? || [[#SceSysconForDriver_7682FE69]] || [[#SceSysconForDriver_4A184B7C]] || No use case seen. || Related to battery.<br />
|-<br />
| ? || [[#SceSysconForDriver_E0D52DF0]] || [[#SceSysconForDriver_ACEE1C70]] || No use case seen. || Related to battery.<br />
|-<br />
| ? || [[#SceSysconForDriver_229A07C2]] || [[#SceSysconForDriver_B832B72C]] || No use case seen. ||<br />
|-<br />
| ? || [[#SceSysconForDriver_474A9EA7]] || [[#SceSysconForDriver_769F9AC4]] || No use case seen. ||<br />
|-<br />
| ? || [[#SceSysconForDriver_129EA022]] || [[#SceSysconForDriver_BFDA5590]] || [[ScePower]] ||<br />
|-<br />
| SYSCON_CB_ALARM_TIMER || [[#SceSysconForDriver_8351526D]] || [[#SceSysconForDriver_86BAAF7D]] || [[SceRtc]] ||<br />
|-<br />
| ? || [[#SceSysconForDriver_2E4BA4B8]] || [[#SceSysconForDriver_29CF4335]] || No use case seen. || Used in [[SceSblPostSsMgr]].<br />
|-<br />
| ? || [[#SceSysconForDriver_4E88B4D9]] || [[#SceSysconForDriver_4BC63A40]] || No use case seen. || Used in [[SceSblPostSsMgr]].<br />
|-<br />
| ? || [[#SceSysconForDriver_376CCCB8]] || [[#SceSysconForDriver_99A254A9]] || No use case seen. ||<br />
|-<br />
| ? || [[#SceSysconForDriver_3BAAC8A9]] || [[#SceSysconForDriver_9A4F4B7C]] || No use case seen. ||<br />
|-<br />
| ? || [[#SceSysconForDriver_85E5DEBF]] || [[#SceSysconForDriver_63B14156]] || No use case seen. ||<br />
|-<br />
| ? || [[#SceSysconForDriver_14730196]] || NA || No use case seen. ||<br />
|-<br />
| ? || [[#SceSysconForDriver_C442D0BE]] || [[#SceSysconForDriver_9F4042F8]] || No use case seen. ||<br />
|-<br />
| ? || [[#SceSysconForDriver_61AE3970]] || [[#SceSysconForDriver_C50568E9]] || No use case seen. ||<br />
|-<br />
| ? || [[#SceSysconForDriver_423D0C58]] || NA || No use case seen. ||<br />
|-<br />
| ? || [[#SceSysconForDriver_154676F1]] || NA || No use case seen. ||<br />
|}<br />
<br />
See also [http://uofw.github.io/upspd/docs/SilverSpring_Blog/my.malloc.us/silverspring/2007/12/03g-model-psp/index.html SilverSpring's PSP Syscon callbacks enum] and [https://github.com/pspdev/pspsdk/blob/master/src/power/psppower.h PSPSDK power callbacks enum].<br />
<br />
[[Category:ARM]]<br />
[[Category:Kernel]]<br />
[[Category:Modules]]<br />
[[Category:Library]]</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=SceSyscon&diff=20874
SceSyscon
2023-12-26T22:41:08Z
<p>CreepNT: /* SceSysconForDriver_0D0B6D25 */ Add official name from 0.945 scePdMotion</p>
<hr />
<div>System Controller.<br />
<br />
== Module ==<br />
<br />
{| class="wikitable"<br />
|-<br />
! Version !! World !! Privilege<br />
|-<br />
| 0.931.010-3.740.011 || Non-secure || Kernel<br />
|}<br />
<br />
== Libraries ==<br />
<br />
=== Known NIDs ===<br />
<br />
{| class="wikitable"<br />
|-<br />
! Version !! Name !! World !! Visibility !! NID<br />
|-<br />
| 0.931.010-3.740.011 || [[SceSyscon#SceSysconForDriver|SceSysconForDriver]] || Non-secure || Kernel || 0x60A35F64<br />
|}<br />
<br />
== Types ==<br />
<br />
<source lang="c"><br />
#define SCE_KERNEL_ERROR_SYSCON_ERROR 0x80250000<br />
#define SCE_SYSCON_ERROR_INVALID_SIZE 0x80250001<br />
#define SCE_SYSCON_ERROR_INVALID_ARGUMENT 0x80250002<br />
#define SCE_SYSCON_ERROR_INVALID_POINTER 0x80250003<br />
#define SCE_SYSCON_ERROR_INVALID_STATUS 0x80250004<br />
#define SCE_SYSCON_ERROR_NOT_INTR_ALLOWED 0x80250005<br />
#define SCE_SYSCON_ERROR_TX_SIZE_TOO_LONG 0x80250006<br />
<br />
#define SCE_SYSCON_ERROR_ILLEGAL_SIZE 0x80250100<br />
#define SCE_SYSCON_ERROR_ILLEGAL_STATUS 0x80250101<br />
#define SCE_SYSCON_ERROR_NOEXEC 0x80250102<br />
#define SCE_SYSCON_ERROR_INVALID_FLAGS 0x80250105<br />
<br />
// Syscon error codes are gotten with 0x80250200 | rx[3], where rx is the data returned by Syscon<br />
<br />
typedef struct SceSysconPacket { // size is 0x80<br />
struct SceSysconPacket *next;<br />
SceUInt32 status; // Lower 16 bits contain flags<br />
SceUID semaId;<br />
SceUInt32 index; // Out: returns to which packet list the packet was inserted into<br />
SceUInt8 tx[32]; // tx[0..1] = cmd, tx[2] = size i.e. sizeof(actual_data)+1, rx[3..31] = actual_data<br />
SceUInt8 rx[32]; // rx[0..1] = cmd, rx[2] = size i.e. sizeof(actual_data)+2, rx[3] = error_code, rx[4..31] = actual_data<br />
void *tx_extra;<br />
void *rx_extra;<br />
SceSize rx_extra_size;<br />
SceUInt32 rx_offset;<br />
int (*callback)(SceSysconPacket *packet, void *argp);<br />
void *argp;<br />
SceUInt32 time;<br />
SceUInt32 unk[5];<br />
} SceSysconPacket;<br />
<br />
typedef enum SceSysconControl {<br />
SCE_SYSCON_CTRL_UP = 0x1,<br />
SCE_SYSCON_CTRL_RIGHT = 0x2,<br />
SCE_SYSCON_CTRL_DOWN = 0x4,<br />
SCE_SYSCON_CTRL_LEFT = 0x8,<br />
SCE_SYSCON_CTRL_TRIANGLE = 0x10,<br />
SCE_SYSCON_CTRL_CIRCLE = 0x20,<br />
SCE_SYSCON_CTRL_CROSS = 0x40,<br />
SCE_SYSCON_CTRL_SQUARE = 0x80,<br />
SCE_SYSCON_CTRL_SELECT = 0x100,<br />
SCE_SYSCON_CTRL_LTRIGGER = 0x200,<br />
SCE_SYSCON_CTRL_RTRIGGER = 0x400,<br />
SCE_SYSCON_CTRL_START = 0x800,<br />
SCE_SYSCON_CTRL_PSBUTTON = 0x1000,<br />
SCE_SYSCON_CTRL_POWER = 0x4000,<br />
SCE_SYSCON_CTRL_VOLUP = 0x10000,<br />
SCE_SYSCON_CTRL_VOLDOWN = 0x20000,<br />
SCE_SYSCON_CTRL_HEADPHONE = 0x8000000<br />
} SceSysconControl;<br />
</source><br />
<br />
Flags (passed to <code>sceSysconCmdExecForDriver</code>, etc), also lower bits of <code>status</code>:<br />
{| class="wikitable"<br />
! Flags !! Meaning<br />
|-<br />
| 0x1 || Some kind of priority that helps to select to which packet list the packet is inserted into.<br />
|-<br />
| 0x100 || Do not insert packet checksum (at <code>tx_buf[2 + len]</code>), where <code>len = tx_buf[2]</code>. And don't memset the rest of the buffer to -1 (<code>memset(tx_buf + len + 3, -1, 29 - len)</code>) if len < 29.<br />
|-<br />
| 0x400 || When set, use rx_extra to receive the data. rx_extra_size must be greater than 32.<br />
|-<br />
| 0x800 || When set, use tx_extra instead of tx for sending data. The size is contained in tx_extra[2] and must be smaller or equal to 253. When cleared: use tx and the size is contained in tx[2], which has to be smaller or equal 29.<br />
|}<br />
<br />
== SceSysconForDriver ==<br />
<br />
=== sceSysconErnieShutdownForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x94AB13CC<br />
|}<br />
<br />
<source lang="C"><br />
#define ERNIE_SHUTDOWN_SHUTDOWN 0<br />
#define ERNIE_SHUTDOWN_REBOOT 1<br />
<br />
int sceSysconErnieShutdownForDriver(int mode);<br />
</source><br />
<br />
=== sceSysconPowerCtrlKermitResetForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x14B99945<br />
|}<br />
<br />
Executes [[SMC]] 0x11A: <code>return sceSysconSetPowerMode(2, 0);</code><br />
<br />
<source lang="C">int sceSysconPowerCtrlKermitResetForDriver(void);</source><br />
<br />
=== sceSysconBatterySWResetForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x87DA378D<br />
|}<br />
<br />
If Syscon version <= 0x70503, it does nothing and returns error 0x8025023F.<br />
<br />
<source lang="C">int sceSysconBatterySWResetForDriver(void);</source><br />
<br />
=== sceSysconGetBatteryFullCapacityForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0xF93CF833<br />
|}<br />
<br />
Used in [[ScePower]]'s module_start.<br />
<br />
<source lang="C">int sceSysconGetBatteryFullCapacityForDriver(void *pResult);</source><br />
<br />
=== sceSysconGetBatteryCycleCountForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0xCD73079D<br />
|}<br />
<br />
Used in [[ScePower]].<br />
<br />
<source lang="C">int sceSysconGetBatteryCycleCountForDriver(void *pRedsult);</source><br />
<br />
=== sceSysconBatteryStartBLModeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x2CEF078E<br />
|}<br />
<br />
<source lang="C">int sceSysconBatteryStartBLModeForDriver(void);</source><br />
<br />
=== sceSysconBatteryStopBLModeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xE4AE7852<br />
|}<br />
<br />
<source lang="C">int sceSysconBatteryStopBLModeForDriver(void);</source><br />
<br />
=== sceSysconBatterySetBLCommandForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xE4F29744<br />
|}<br />
<br />
BL command (1 byte at most) must be contained in either unk_byte or pSrc.<br />
<br />
<source lang="C">int sceSysconBatterySetBLCommandForDriver(SceUInt16 ctx, SceUInt8 unk_byte, void *pSrc, SceUInt8 size);</source><br />
<br />
=== sceSysconBatteryExecBLCommandForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x74B2AB55<br />
|}<br />
<br />
<source lang="C">int sceSysconBatteryExecBLCommandForDriver(SceUInt16 ctx);</source><br />
<br />
=== sceSysconBatteryReadBLCommandForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x448DAFF1<br />
|}<br />
<br />
<source lang="C"><br />
// size must be between 0 and 0x10<br />
int sceSysconBatteryReadBLCommandForDriver(SceUInt16 ctx, SceUInt8 unk1, SceUInt8 unk2, void *pDst, SceUInt8 size);<br />
</source><br />
<br />
=== sceSysconReadBatteryRegForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xC2FB5565<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
=== sceSysconGetManualChargeModeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0x4FEC564C<br />
|}<br />
<br />
<source lang="C">int sceSysconGetManualChargeModeForDriver(int *piMode);</source><br />
<br />
=== sceSysconCtrlManualChargeModeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0xC6A2C9EF<br />
|}<br />
<br />
<source lang="C">int sceSysconCtrlManualChargeModeForDriver(int mode);</source><br />
<br />
=== sceSysconGetLogInfoForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0x701535FC<br />
|}<br />
<br />
<source lang="C"><br />
typedef struct SceSysconLogInfo { // size is 8 on FW 3.600.011<br />
uint8_t unk_0[8];<br />
} SceSysconLogInfo;<br />
<br />
int sceSysconGetLogInfoForDriver(SceSysconLogInfo *pInfo);<br />
</source><br />
<br />
=== sceSysconLogStartForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0x4E55CF5E<br />
|}<br />
<br />
<source lang="C">int sceSysconLogStartForDriver(void);</source><br />
<br />
=== sceSysconLogStartWaitingForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.12 || not present<br />
|-<br />
| 2.500.071-3.740.011 || 0x9C0B1E61<br />
|}<br />
<br />
<source lang="C">int sceSysconLogStartWaitingForDriver(void);</source><br />
<br />
=== sceSysconLogReadDataForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0x487D97F3<br />
|}<br />
<br />
<source lang="C">int sceSysconLogReadDataForDriver(SceUInt32 offset, void *buffer, SceSize size);</source><br />
<br />
=== sceSysconGetTemperatureLogForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.12 || not present<br />
|-<br />
| 2.500.071-3.740.011 || 0x3B354824<br />
|}<br />
<br />
=== sceSysconClearTemperatureLogForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.12 || not present<br />
|-<br />
| 2.500.071-3.740.011 || 0x3843D657<br />
|}<br />
<br />
=== sceSysconGetUsbDetStatusForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0xEF810687<br />
|}<br />
<br />
=== sceSysconCtrlDolceLEDForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0x727F985A<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C"><br />
#define STATE_ON 0<br />
#define STATE_BLINK_SLOW 1<br />
#define STATE_BLINK_FAST 2<br />
<br />
int sceSysconCtrlDolceLEDForDriver(SceUInt32 state);<br />
</source><br />
<br />
=== sceSysconGetTimeStampForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x4D588A0A<br />
|}<br />
<br />
This is a guessed named, derived from PSP. Temp name was sceSysconGetBaryonTimestampForDriver.<br />
<br />
Returns the timestamp of latest installed Syscon firmware patch, formatted as <code>YYYYMMDDhhmm</code>. This comes from a string stored in Syscon firmware under another format: <code>$Date:: YYYY-MM-DD hh:mm:ss +0900#$</code><br />
<br />
Example: <code>$Date:: 2013-12-13 15:52:05 +0900#$</code> in Syscon firmware becomes <code>201312131552</code> in Syscon command 2.<br />
<br />
<source lang="c"><br />
// pTimestamp will point to a buffer of size 0x10 bytes, containing a string of size 13 (12: length + 1: terminal character)<br />
int sceSysconGetTimeStampForDriver(char *pTimestamp);<br />
</source><br />
<br />
=== sceSysconGetWakeupFactorForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xCF5B2F2F<br />
|}<br />
<br />
Result is 2 bytes wakeup factor coming from Syscon command 0x10.<br />
<br />
<source lang="C">int sceSysconGetWakeupFactorForDriver(SceUInt32 *pWakeupFactor);</source><br />
<br />
=== sceSysconCtrlHdmiCecPowerForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x62155962<br />
|}<br />
<br />
If Syscon version is strictly lower than 0x40000, it does nothing and returns 0.<br />
<br />
Sets the pin CDC Hot Plug Detect (HPD) state of the HDMI bridge (AD80244 / ADV7533).<br />
<br />
<source lang="c">int sceSysconCtrlHdmiCecPowerForDriver(SceBool enable_HDMI_CDC_HPD_pin);</source><br />
<br />
=== sceSysconCtrlMotionSensorPowerForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x063425AE<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
If Syscon version is strictly lower than 0x40000, it does nothing and returns 0.<br />
<br />
<source lang="C">int sceSysconCtrlMotionSensorPowerForDriver(SceBool enable);</source><br />
<br />
=== SceSysconForDriver_3FDD29D6 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x3FDD29D6<br />
|}<br />
<br />
<source lang="C">int SceSysconForDriver_3FDD29D6(int a1, SceBool use_flag);</source><br />
<br />
=== sceSysconCtrlVoltageForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.920.050-3.740.011 || 0x7F198FA2<br />
|}<br />
<br />
Temp name was sceSysconSetVoltageForDriver.<br />
<br />
Used in [[ScePower]].<br />
<br />
<source lang="C"><br />
/*<br />
type:<br />
0: Reserved<br />
1: DD1 (VDD - IFTU, DMAC, Internal bus, SPM 32KiB/128KiB) SetSysClockFrequency, SetDmac5ClockFrequency, SetBusClockFrequency, SetCameraBusClockFrequency<br />
2: DD2 (VDDA - ARM core, L2 cache) SetArmClockFrequency<br />
3: DD3 (VDDC - Codec Engine, AVC Decoder) SetVipClockFrequency, SetVeneziaClockFrequency<br />
4: DD4 (VDDG - GPU core) SetGpuClockFrequencyInternal, SetGpuXbarClockFrequency, SetCompatClockFrequency<br />
<br />
vid:<br />
0x22 (0.34V)<br />
0x8A (1.38V) - (something got from ScePervasiveForDriver)<br />
*/<br />
<br />
#define SCE_SYSCON_VOLTAGE_DD1 (1)<br />
#define SCE_SYSCON_VOLTAGE_DD2 (2)<br />
#define SCE_SYSCON_VOLTAGE_DD3 (3)<br />
#define SCE_SYSCON_VOLTAGE_DD4 (4)<br />
<br />
int sceSysconCtrlVoltageForDriver(SceUInt32 type, SceUInt32 vid);</source><br />
<br />
=== sceSysconSetPowerModeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x8A95D35C<br />
|}<br />
<br />
Temp name was sceSysconResetDeviceForDriver.<br />
<br />
<source lang="c">int sceSysconSetPowerModeForDriver(int type, int mode);</source><br />
<br />
It issues <code>SMC #0</code> with <code>r12 = 0x11A</code>.<br />
<br />
The <code>mode</code> argument is usually set to <code>0x2</code> or sometimes <code>0x8002</code> (which seems to correspond to some request by the UDC and BT drivers).<br />
<br />
The <code>type</code> argument determines what to do.<br />
<br />
Real definition names are like: "SCE_SYSCON_POWERMODE_MODE_STANDBY".<br />
<br />
{| class="wikitable"<br />
! Type !! Description !! Syscon command<br />
|-<br />
| 0 || Power off || <code>{0xC0, 0, 5, type, (~mode) & 0xFF, (~mode >> 8) & 0xFF, (mode >> 16) & 0xFF}</code><br />
|-<br />
| 1 || Suspend (low-power state) || <code>{0xC0, 0, 5, type, (~mode) & 0xFF, (~mode >> 8) & 0xFF, (mode >> 16) & 0xFF}</code><br />
|-<br />
| 2 || Cold reset || <code>{0x01, 8, 1, 0}</code><br />
|-<br />
| 3 || ?Reset to update mode? || <code>{0xC1, 0, 2, 0}</code><br />
|-<br />
| 4 || ?Reset to update mode? || <code>{0xC1, 0, 2, 1}</code><br />
|-<br />
| 5 || Hibernate || <code>{0xC2, 0, 2, 0x5A}</code><br />
|-<br />
| 16 || ?? || <code>{0xC0, 0, 5, type, (~mode) & 0xFF, (~mode >> 8) & 0xFF, (mode >> 16) & 0xFF}</code><br />
|-<br />
| 17 || Resume (soft reset: suspend and immediately resume) || <code>{0xC0, 0, 5, type, (~mode) & 0xFF, (~mode >> 8) & 0xFF, (mode >> 16) & 0xFF}</code><br />
|}<br />
<br />
=== sceSysconEnableHibernateIOForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0x4946538A<br />
|}<br />
<br />
<source lang="C">int sceSysconEnableHibernateIOForDriver(int a1);</source><br />
<br />
=== sceSysconWaitReadyForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0x55DF1C9B<br />
|}<br />
<br />
Temp name was sceSysconWaitInitializedForDriver.<br />
<br />
<source lang="c">int sceSysconWaitReadyForDriver(void);</source><br />
<br />
=== sceSysconCmdSyncForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x6E517D22<br />
|}<br />
<br />
<source lang="c">int sceSysconCmdSyncForDriver(SceSysconPacket *packet, int noWait);</source><br />
<br />
=== sceSysconCmdExecForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x9ADDCA4A<br />
|}<br />
<br />
<source lang="c">int sceSysconCmdExecForDriver(SceSysconPacket *packet, unsigned int flags);</source><br />
<br />
=== sceSysconCmdExecAsyncForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xC2224E82<br />
|}<br />
<source lang="c">int sceSysconCmdExecAsyncForDriver(SceSysconPacket *packet, u32 flags, int (*callback)(SceSysconPacket *, void *), void *argp);</source><br />
<br />
=== sceSysconCtrlSdPowerForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xBE1ADE4F<br />
|}<br />
<br />
If Syscon version is strictly lower than 0x40000, it does nothing and returns 0. Calls Syscon command 0x888.<br />
<br />
Enables/disables GameCard reader.<br />
<br />
Used in [[SceSdstor]].<br />
<br />
<source lang="c"><br />
// param: 1 = enable SD (GameCard reader) power, 0 = disable SD (GameCard reader) power<br />
int sceSysconCtrlSdPowerForDriver(SceUInt16 param);<br />
</source><br />
<br />
=== sceSysconCtrlWirelessPowerForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.995.000 || 0x4FBDA504<br />
|-<br />
| 0.996.090-3.740.011 || not present<br />
|}<br />
<br />
If Syscon version is strictly lower than 0x40000, it does nothing and returns 0. Calls Syscon command 0x88A.<br />
<br />
Replaced by function [[#sceSysconCtrlWirelessPower2ForDriver]].<br />
<br />
<source lang="C">int sceSysconCtrlWirelessPowerForDriver(SceUInt16 param);</source><br />
<br />
=== sceSysconCtrlWirelessPower2ForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0xA2E85DB9<br />
|}<br />
<br />
Replacement function for [[#sceSysconCtrlWirelessPowerForDriver]]. Calls Syscon command 0x88A.<br />
<br />
<source lang="C">int sceSysconCtrlWirelessPower2ForDriver(SceUInt16 param);</source><br />
<br />
=== sceSysconCtrlWirelessPowerDownForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.995.000 || 0xDF8C6D2D<br />
|-<br />
| 0.996.090-3.740.011 || not present<br />
|}<br />
<br />
If motherboard is not "hardware info third byte 0x10" (probably IRS-001), it does nothing and returns 0, probably because missing hardware. Calls Syscon command 0xB1. Wireless power down might be a button to enable/disable Wireless, like on PSP.<br />
<br />
<source lang="C">int sceSysconCtrlWirelessPowerDownForDriver(SceUInt16 param);</source><br />
<br />
=== sceSysconVerifyConfigstorageScriptForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.990.000 || not present<br />
|-<br />
| 0.995.000-3.740.011 || 0xCC6F90A8<br />
|}<br />
<br />
This function is not used in the OS and anyway it would always return error because it calls a command that is not implemented in Syscon FW.<br />
<br />
<source lang="C">int sceSysconVerifyConfigstorageScriptForDriver(int a1, void *pScript, SceSize size);</source><br />
<br />
=== sceSysconLoadConfigstorageScriptForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.990.000 || not present<br />
|-<br />
| 0.995.000-3.740.011 || 0x89C5CFD6<br />
|}<br />
<br />
The OS uses this function to change between modes: IDU mode, Show Mode, no mode. This works by spoofing or rewriting [[KBL Param#Hardware Info|Hardware Info]]. This is reboot persistent.<br />
<br />
<source lang="C">int sceSysconLoadConfigstorageScriptForDriver(int a1, void *pScript, SceSize size);</source><br />
<br />
=== sceSysconBeginConfigstorageTransactionForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0xA4968B8C<br />
|}<br />
<br />
<source lang="C">int sceSysconBeginConfigstorageTransactionForDriver(void);</source><br />
<br />
=== sceSysconCommitConfigstorageTransactionForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0x7B9B3617<br />
|}<br />
<br />
<source lang="C">int sceSysconCommitConfigstorageTransactionForDriver(void);</source><br />
<br />
=== sceSysconEndConfigstorageTransactionForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0xFCC3E8EE<br />
|}<br />
<br />
<source lang="C">int sceSysconEndConfigstorageTransactionForDriver(void);</source><br />
<br />
=== sceSysconSetDebugHandlersForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xF245CD6F<br />
|}<br />
<br />
<source lang="c"><br />
/** A set of debug handlers for syscon, that you can set in sceSysconSetDebugHandlersForDriver(). */<br />
typedef struct SceSysconDebugHandlers {<br />
/** Structure size (probably, unused). */<br />
s32 size;<br />
/** Callback ran right before running a packet, with a pointer to it passed as the first argument. */<br />
void (*start)(SceSysconPacket *packet);<br />
/** Callback ran right after finishing running a packet, with a pointer to it passed as the first argument. */<br />
void (*end)(SceSysconPacket *packet);<br />
} SceSysconDebugHandlers;<br />
<br />
int sceSysconSetDebugHandlersForDriver(SceSysconDebugHandlers *debug_handlers);<br />
</source><br />
<br />
=== sceSysconGetBatteryCalibDataForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.36 || not present<br />
|-<br />
| 3.500.011-3.740.011 || 0x9ADC9936<br />
|}<br />
<br />
<source lang="C">int sceSysconGetBatteryCalibDataForDriver(int *piData1, int *piData2, int *piData3, int *piData4);</source><br />
<br />
=== sceSysconGetTouchpanelDeviceInfoForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xF492E69E<br />
|}<br />
<br />
<source lang="C"><br />
typedef struct SceKernelTouchpanelDeviceInfo { // size is 8 bytes<br />
uint16_t FrontVendorID;<br />
uint16_t FrontFirmwareRev;<br />
uint16_t RearVendorID;<br />
uint16_t RearFirmwareRev;<br />
} SceKernelTouchpanelDeviceInfo;<br />
<br />
int sceSysconGetTouchpanelDeviceInfoForDriver(SceKernelTouchpanelDeviceInfo *pInfo);<br />
</source><br />
<br />
=== sceSysconGetTouchpanelDeviceInfo2ForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.50 || not present<br />
|-<br />
| 1.690.011-3.740.011 || 0x030D447F<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Returns extended touchpanel info.<br />
<br />
<source lang="C"><br />
// this is a guessed name<br />
typedef struct SceKernelTouchpanelInfo { // size is 0xA bytes<br />
SceUInt16 vendorID;<br />
SceUInt16 firmwareRev;<br />
SceUInt16 configRev;<br />
SceUInt8 hwVersion;<br />
SceUInt8 vendorInfo;<br />
SceUInt16 reserved;<br />
} SceKernelTouchpanelInfo;<br />
<br />
// this is a guessed name<br />
typedef struct SceKernelTouchpanelDeviceInfo2 { // size is 0x14 bytes<br />
SceKernelTouchpanelInfo front;<br />
SceKernelTouchpanelInfo rear;<br />
} SceKernelTouchpanelDeviceInfo2;<br />
<br />
int sceSysconGetTouchpanelDeviceInfo2ForDriver(SceKernelTouchpanelDeviceInfo2 *pInfo);<br />
</source><br />
<br />
=== sceSysconMotionGetDeviceInfoForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xD01E64FC<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Returns motion sensor device info. See [[SceMotionDev#sceMotionDevGetDeviceInfoForDriver]] to reverse the pInfo structure.<br />
<br />
<source lang="C">int sceSysconMotionGetDeviceInfoForDriver(void *pInfo);</source><br />
<br />
=== sceSysconGetHardwareInfoForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xCBD6D8BC<br />
|}<br />
<br />
Returns [[KBL Param#Hardware Info|Hardware Info]] obtained from Syscon command 0x5.<br />
<br />
<source lang="C">int sceSysconGetHardwareInfoForDriver(void);</source><br />
<br />
=== sceSysconGetHardwareInfo2ForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0x965C68C3<br />
|}<br />
<br />
Returns [[KBL Param#Hardware Info 2|Hardware Info 2]] obtained from Syscon command 0x6.<br />
<br />
This function was certainly added for PS Vita Slim or PS TV support because [[KBL Param#Hardware Info|Hardware Info]] risked being fulfilled if too many hardware revisions were made.<br />
<br />
Used in [[SceAudio#SceAudioIn|SceAudioIn]] (maybe to check Conexant IC), [[SceCodec]] (maybe to check Conexant IC), and [[SceVshBridge#vshSysconGetHardwareInfo2|_vshSysconGetHardwareInfo2]].<br />
<br />
<source lang="C"><br />
typedef struct SceKernelHardwareInfo2 {<br />
SceUInt8 flags[0x10];<br />
} SceKernelHardwareInfo2;<br />
<br />
int sceSysconGetHardwareInfo2ForDriver(SceKernelHardwareInfo2 *pInfo);<br />
</source><br />
<br />
=== sceSysconGetErnieVersionForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-3.740.011 || 0xFF86F4C5<br />
|}<br />
<br />
This is a guessed name. Temp name was sceSysconGetBaryonVersionForDriver.<br />
<br />
<source lang="c">int sceSysconGetErnieVersionForDriver(void);</source><br />
<br />
=== SceSysconForDriver_EBE3262C ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0xEBE3262C<br />
|}<br />
<br />
In [[SceSblPostSsMgr]], used just after [[#sceSysconGetErnieVersionForDriver]].<br />
<br />
Returns 8 bits of some Syscon Mode information. Bit 6 (from right) is Syscon DownLoader Mode flag. Bit 3 (from right) is Power Online flag.<br />
<br />
<source lang="C">SceUInt8 SceSysconForDriver_EBE3262C(void);</source><br />
<br />
=== sceSysconIsDownLoaderModeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0x9ADD60D2<br />
|}<br />
<br />
<source lang="C">int sceSysconIsDownLoaderModeForDriver(void);</source><br />
<br />
=== sceSysconIsDealDownLoaderModeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xB7BCC638<br />
|}<br />
<br />
<source lang="C">int sceSysconIsDealDownLoaderModeForDriver(void);</source><br />
<br />
=== sceSysconNopForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x0D0B6D25<br />
|}<br />
<br />
Maybe exits Syscon Deal DownLoader mode.<br />
<br />
<source lang="C">int sceSysconNopForDriver(void);</source><br />
<br />
=== sceSysconIsPowerOnlineForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x9DA2A5AB<br />
|}<br />
<br />
Returns true iff Syscon information bit 3 (from right) is set. See also [[#SceSysconForDriver_EBE3262C]].<br />
<br />
Used in many [[ScePower]] functions for example before setting display brightness (to save battery).<br />
<br />
<source lang="C">SceBool sceSysconIsPowerOnlineForDriver(void);</source><br />
<br />
=== sceSysconGetErnieDLVersionForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xD2F456DC<br />
|}<br />
<br />
Calls Syscon command 0x1100.<br />
<br />
<source lang="C">void sceSysconGetErnieDLVersionForDriver(int *pVersion);</source><br />
<br />
=== sceSysconGetBatteryVersionForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x68E0031E<br />
|}<br />
<br />
Battery IC name: if HWinfo > 7 "Abby" else "Bert".<br />
<br />
<source lang="C">int sceSysconGetBatteryVersionForDriver(SceUInt16 *HWinfo, SceUInt16 *FWinfo, SceUInt16 *DFinfo);</source><br />
<br />
=== sceSysconAbbySyncForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.81 || not present<br />
|-<br />
| 2.000.081-3.740.011 || 0xDFB024C4<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">int sceSysconAbbySyncForDriver(SceUInt32 *puiStatus);</source><br />
<br />
=== sceSysconGetManufacturesStatusForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.692.000 || not present<br />
|-<br />
| 1.800.071-3.740.011 || 0x3E09A1F4<br />
|}<br />
<br />
In theory, this function should only be called when Product Mode is already set.<br />
<br />
<source lang="C">int sceSysconGetManufacturesStatusForDriver(int *piStatus);</source><br />
<br />
=== sceSysconReadScratchPadForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x299B1CE7<br />
|}<br />
<br />
Temp name was sceSysconReadCommandForDriver, sceSysconVsReadDataForDriver.<br />
<br />
Calls Syscon command 0x90.<br />
<br />
Used in [[SceRtc]].<br />
<br />
See also [[Ernie#Syscon_Scratch_Pad|Syscon Scratchpad structure]].<br />
<br />
<source lang="C"><br />
// size: On FW 3.60, must be between 0 and 0x18. On FW 0.931, must be 2, 4 or 8.<br />
// offset: Must be between 0 and 0xFF.<br />
// offset + size must not exceed 0x100<br />
int sceSysconReadScratchPadForDriver(SceUInt32 offset, void *buffer, SceSize size);<br />
</source><br />
<br />
=== sceSysconWriteScratchPadForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xE26488B9<br />
|}<br />
<br />
Temp name was sceSysconSendCommandForDriver, sceSysconVsWriteDataForDriver.<br />
<br />
Calls Syscon command 0x91.<br />
<br />
Used in [[SceRtc]] and [[ScePower]].<br />
<br />
See also [[Ernie#Syscon_Scratch_Pad|Syscon Scratchpad structure]].<br />
<br />
<source lang="C"><br />
// size: On FW 3.60, must be between 0 and 0x18. On FW 0.931, must be 2, 4 or 8.<br />
// offset: Must be between 0 and 0xFF.<br />
// offset + size must not exceed 0x100<br />
int sceSysconWriteScratchPadForDriver(SceUInt32 offset, void *buffer, SceSize size);<br />
</source><br />
<br />
=== sceSysconNvsSetRunModeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x81A6060D<br />
|}<br />
<br />
Used in [[SceSblSsMgr#sceSblNvsReadDataForKernel|sceSblNvsReadDataForKernel]] and [[SceSblSsMgr#sceSblNvsWriteDataForKernel|sceSblNvsWriteDataForKernel]].<br />
<br />
<source lang="C"><br />
// mode: 0 before NVS read/write<br />
int sceSysconNvsSetRunModeForDriver(int mode);<br />
</source><br />
<br />
=== sceSysconNvsSetUnkModeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x2EC6D55D<br />
|}<br />
<br />
<source lang="C"><br />
// mode: unk<br />
int sceSysconNvsSetUnkModeForDriver(int mode);<br />
</source><br />
<br />
=== sceSysconNvsReadDataForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xACAFA2B8<br />
|}<br />
<br />
Used in [[SceSblSsMgr#sceSblNvsReadDataForKernel|sceSblNvsReadDataForKernel]] and [[SceSblSsMgr#sceSblSsGetNvsDataForDriver|sceSblSsGetNvsDataForDriver]].<br />
<br />
<source lang="C">int sceSysconNvsReadDataForDriver(SceUInt32 offset, void *buffer, SceSize size);</source><br />
<br />
=== sceSysconNvsWriteDataForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x10C9657A<br />
|}<br />
<br />
Used in [[SceSblSsMgr#sceSblNvsWriteDataForKernel|sceSblNvsWriteDataForKernel]] and [[SceSblSsMgr#sceSblSsSetNvsDataForDriver|sceSblSsSetNvsDataForDriver]].<br />
<br />
<source lang="C">int sceSysconNvsWriteDataForDriver(SceUInt32 offset, void *buffer, SceSize size);</source><br />
<br />
=== sceSysconGetMultiCnInfoForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x1503D6A0<br />
|}<br />
<br />
Returns data obtained by Syscon command 0x103.<br />
<br />
Returns 0x4ff00 when nothing is connected.<br />
<br />
Returns 0x40080 when pin 11 is pulled to GND.<br />
<br />
Returns 0x40680 when pin 12 is pulled to GND.<br />
<br />
Returns 0x40380 when pin 12 is pulled to GND while pin 11 pulled to ground via 100K resistor.<br />
<br />
Returns 0x40000 on PSTV<br />
<br />
Bits 8 and 9 indicate that an audio-out dock is connected.<br />
<br />
Bits 8, 9, 11, 12, 13, 14 and 15 indicate that [[UDC]] pins are connected.<br />
<br />
Used in [[SceHpremote]], [[SceUsbServ]].<br />
<br />
<source lang="C">int sceSysconGetMultiCnInfoForDriver(SceUInt32 *pInfo);</source><br />
<br />
=== sceSysconSetMultiCnPortForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x8AAB6308<br />
|}<br />
<br />
Used in [[SceSblPostSsMgr]].<br />
<br />
<source lang="C"><br />
// port: 0: for JIG mode, 1 for UART0 logging mode, 0x10000: for normal mode<br />
int sceSysconSetMultiCnPortForDriver(int port);<br />
</source><br />
<br />
=== sceSysconConfigLEDForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.996.090-3.740.011 || 0x6F586D1A<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Used in [[ScePower]].<br />
<br />
<source lang="C"><br />
#define DEVICE_UNK 0x40 // maybe PS button or CP power LED or maybe color (blue)<br />
<br />
// unk: SceLedConfig.unk_4<br />
<br />
int sceSysconConfigLEDForDriver(int device, SceUInt32 unk);<br />
</source><br />
<br />
=== SceSysconForDriver_9CA6EB70 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 1.000.071-3.740.011 || 0x9CA6EB70<br />
|}<br />
<br />
On motherboards IRT-001 and older, it does nothing and returns 0, probably because missing hardware that could be a LED, else it sends 2 bytes using Syscon command 0x89E.<br />
<br />
Used in [[ScePower#ScePowerForDriver_38415146]]. Related to LED.<br />
<br />
<source lang="C">int SceSysconForDriver_9CA6EB70(SceBool state);</source><br />
<br />
=== sceSysconCtrlAccPowerForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x8D1D97E8<br />
|}<br />
<br />
<source lang="C">int sceSysconCtrlAccPowerForDriver(SceBool enable);</source><br />
<br />
=== sceSysconCtrlUsbStatusForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x59DC5938<br />
|}<br />
<br />
Sends 3 bytes to Syscon command 0x89A.<br />
<br />
Related to [[SceUdcd]] and [[ScePower]].<br />
<br />
<source lang="C">int sceSysconCtrlUsbStatusForDriver(SceUInt32 value);</source><br />
<br />
=== sceSysconCtrlRMRPowerForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0x710A7CF0<br />
|}<br />
<br />
Temp name was sceSysconCtrlMsPowerForDriver.<br />
<br />
<source lang="c">int sceSysconCtrlRMRPowerForDriver(int enable_power);</source><br />
<br />
=== sceSysconCtrlDevKitUsbPowerForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0xB1F88B11<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
<source lang="C">int sceSysconCtrlDevKitUsbPowerForDriver(SceBool enable);</source><br />
<br />
=== SceSysconForDriver_3274A925 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.692.000 || not present<br />
|-<br />
| 1.800.071-3.740.011 || 0x3274A925<br />
|}<br />
<br />
Temp name was sceSysconCtrlDolceUsbPowerForDriver.<br />
<br />
This function enables/disables a USB bus related to either PS Vita IRS-1001 Wlan/Bt module USB or PS Vita 3G modem USB. This also affects PS TV USB host and maybe also PS TV ethernet.<br />
<br />
Used in [[SceUsbEtherSmsc]], [[SceUsbServ]].<br />
<br />
This function was maybe added to support IRS-1001 motherboard.<br />
<br />
<source lang="C">int SceSysconForDriver_3274A925(SceBool enable);</source><br />
<br />
=== sceSysconJigOpenPortForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x44A173F5<br />
|}<br />
<br />
<source lang="C">int sceSysconJigOpenPortForDriver(void);</source><br />
<br />
=== sceSysconJigClosePortForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x483FAE05<br />
|}<br />
<br />
<source lang="C">int sceSysconJigClosePortForDriver(void);</source><br />
<br />
=== sceSysconJigSetConfigForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xD24BF916<br />
|}<br />
<br />
<source lang="C">int sceSysconJigSetConfigForDriver(SceUInt8 a1, SceUInt8 a2);</source><br />
<br />
=== SceSysconForDriver_058941D7 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x058941D7<br />
|}<br />
<br />
It is probably a "sceSysconCtrl...ForDriver" function.<br />
<br />
Sends 2 bytes to Syscon using Syscon command 0xB0.<br />
<br />
=== sceSysconCtrlHostOutputViaDongleForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0xDECCB2B4<br />
|}<br />
<br />
Enables / disables Kermit UART0 output (logs) via Dongle (Jig).<br />
<br />
Sends 2 bytes to Syscon using Syscon command 0xB2.<br />
<br />
<source lang="C">int sceSysconCtrlHostOutputViaDongleForDriver(SceBool enable);</source><br />
<br />
=== SceSysconForDriver_33B5CDB3 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.996.090-3.740.011 || 0x33B5CDB3<br />
|}<br />
<br />
Reads from Syscon using Syscon command 0xB3.<br />
<br />
This function was probably added to support IRS-002 motherboard.<br />
<br />
=== SceSysconForDriver_F6D4DDC4 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.692.000 || not present<br />
|-<br />
| 1.800.071-3.740.011 || 0xF6D4DDC4<br />
|}<br />
<br />
Reads from Syscon using Syscon command 0xB4. It is probably the "get" equivalent of [[#SceSysconForDriver_00AE3AEB]].<br />
<br />
This function was added to support IRS-1001 motherboard.<br />
<br />
=== SceSysconForDriver_00AE3AEB ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.692.000 || not present<br />
|-<br />
| 1.800.071-3.740.011 || 0x00AE3AEB<br />
|}<br />
<br />
It is probably a "sceSysconCtrl...ForDriver" function.<br />
<br />
Sends 2 bytes to Syscon using Syscon command 0xB5. It is probably the "set" equivalent of [[#SceSysconForDriver_F6D4DDC4]].<br />
<br />
This function was added to support IRS-1001 motherboard.<br />
<br />
=== SceSysconForDriver_0D300158 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.100.081-3.740.011 || 0x0D300158<br />
|}<br />
<br />
It is probably a "sceSysconCtrl...ForDriver" function.<br />
<br />
Sends 2 bytes to Syscon using Syscon command 0xB6. It is probably the "set" equivalent of [[#SceSysconForDriver_91EF4EC3]].<br />
<br />
This function was added to support DOL-1002 motherboard.<br />
<br />
=== SceSysconForDriver_91EF4EC3 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 3.100.081-3.740.011 || 0x91EF4EC3<br />
|}<br />
<br />
Reads from Syscon using Syscon command 0xB7. It is probably the "get" equivalent of [[#SceSysconForDriver_0D300158]].<br />
<br />
This function was added to support DOL-1002 motherboard.<br />
<br />
=== receive_pm_sm_jig_msg_from_syscon ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x3C80B529<br />
|}<br />
<br />
<source lang="C">int receive_pm_sm_jig_msg_from_syscon(SceUInt32 offset, SceSize size, void *buf);</source><br />
<br />
=== send_pm_sm_jig_msg_to_syscon ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x7BFBA09E<br />
|}<br />
<br />
=== send_pm_sm_stop_to_syscon ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x933D813F<br />
|}<br />
<br />
Used just after send_pm_sm_jig_msg_to_syscon or when it fails before.<br />
<br />
<source lang="C">int send_pm_sm_stop_to_syscon(int a1, int a2, int a3);</source><br />
<br />
=== sceSysconIduModeSetForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.996.090 || not present<br />
|-<br />
| 1.030.071-3.740.011 || 0x956D07CB<br />
|}<br />
<br />
<source lang="C">int sceSysconIduModeSetForDriver(void);</source><br />
<br />
=== sceSysconIduModeClearForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.996.090 || not present<br />
|-<br />
| 1.030.071-3.740.011 || 0x34574496<br />
|}<br />
<br />
<source lang="C">int sceSysconIduModeClearForDriver(void);</source><br />
<br />
=== sceSysconShowModeSetForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.50 || not present<br />
|-<br />
| 1.600.061-3.740.011 || 0x6D65B70F<br />
|}<br />
<br />
<source lang="C">int sceSysconShowModeSetForDriver(void);</source><br />
<br />
=== sceSysconShowModeClearForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.50 || not present<br />
|-<br />
| 1.600.061-3.740.011 || 0x8D7724C0<br />
|}<br />
<br />
<source lang="C">int sceSysconShowModeClearForDriver(void);</source><br />
<br />
=== sceSysconSetWlanCallbackForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.996.090 || 0x4DEB8712<br />
|-<br />
| 1.03-3.740.011 || not present<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Registers a Wlan-related callback.<br />
<br />
index 5 on FWs 0.931.010-0.940.<br />
<br />
=== SceSysconForDriver_18A6F4D9 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x18A6F4D9<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
index 0 on FW 3.600.011.<br />
<br />
No use case seen.<br />
<br />
Related to [[#SceSysconForDriver_C0F215B7]].<br />
<br />
<source lang="C">int SceSysconForDriver_18A6F4D9(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_DE613081 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xDE613081<br />
|}<br />
<br />
A guessed name is sceSysconSetHeadphoneCallbackForDriver.<br />
<br />
Registers an headphone remote related callback.<br />
<br />
index 1 on FW 3.600.011.<br />
<br />
Used in [[SceHpremote]].<br />
<br />
Related to [[#SceSysconForDriver_C3504ADE]].<br />
<br />
<source lang="C">int SceSysconForDriver_DE613081(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_229A07C2 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x229A07C2<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
index 2 on FW 3.600.011.<br />
<br />
No use case seen.<br />
<br />
Related to [[#SceSysconForDriver_B832B72C]].<br />
<br />
<source lang="C">int SceSysconForDriver_229A07C2(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_8351526D ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x8351526D<br />
|}<br />
<br />
A guessed name is sceSysconSetAlarmTimerCallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
index 3 on FW 3.600.011.<br />
<br />
Used in [[SceRtc]].<br />
<br />
Related to [[#SceSysconForDriver_86BAAF7D]].<br />
<br />
<source lang="C">int SceSysconForDriver_8351526D(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_9F8340FF ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x9F8340FF<br />
|}<br />
<br />
A guessed name is sceSysconSetResumeRequestCallbackForDriver.<br />
<br />
Registers the "is resume requested" callback.<br />
<br />
Used in [[ScePower]] to register a callback that sets the [[ScePower]] global variable g_resume_requested to SCE_TRUE.<br />
<br />
index 4 on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_A57B5433]].<br />
<br />
<source lang="C">int SceSysconForDriver_9F8340FF(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_35E1689F ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x35E1689F<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
Used in [[SceHpremote]].<br />
<br />
index 5 on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_ACC7F71E]].<br />
<br />
<source lang="C">int SceSysconForDriver_35E1689F(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_474A9EA7 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x474A9EA7<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
index 0xC on FWs 0.931.010-0.940. index 6 on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_769F9AC4]].<br />
<br />
No use case seen.<br />
<br />
<source lang="C">int SceSysconForDriver_474A9EA7(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_4E88B4D9 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x4E88B4D9<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
index 8 on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_4BC63A40]].<br />
<br />
No use case seen. Maybe used in internal modules for Jig.<br />
<br />
<source lang="C">int SceSysconForDriver_4E88B4D9(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_376CCCB8 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x376CCCB8<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
index 9 on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_99A254A9]].<br />
<br />
No use case seen.<br />
<br />
<source lang="C">int SceSysconForDriver_376CCCB8(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_3BAAC8A9 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.995.000 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0x3BAAC8A9<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
index 0xA on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_9A4F4B7C]].<br />
<br />
No use case seen.<br />
<br />
<source lang="C">int SceSysconForDriver_3BAAC8A9(void *cb_0, void *cb_1);</source><br />
<br />
=== sceSysconSetAccCallbackForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.995.000-3.740.011 || 0x4A42712F<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Registers 2 callbacks (maybe constructor and destructor or callback and args) for accessory port.<br />
<br />
index 0xF on FW 3.600.011.<br />
<br />
Used in [[SceUsbServ]].<br />
<br />
<source lang="C">int sceSysconSetAccCallbackForDriver(void *cb_0, void *cb_1);</source><br />
<br />
=== sceSysconSetLowBatteryCallbackForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x3F0DB7C0<br />
|}<br />
<br />
Registers the low-battery callback.<br />
<br />
index 6 on FWs 0.931-0.940. index 0x10 on FW 3.600.011.<br />
<br />
<source lang="C">int sceSysconSetLowBatteryCallbackForDriver(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_80D6E061 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.000.071-3.740.011 || 0x80D6E061<br />
|}<br />
<br />
A guessed name is sceSysconSetBatteryOnlineCallbackForDriver.<br />
<br />
Registers a callback. Maybe related to Battery online status.<br />
<br />
index 0x11 on FW 3.600.011.<br />
<br />
<source lang="C">int SceSysconForDriver_80D6E061(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_7682FE69 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 1.000.071-3.740.011 || 0x7682FE69<br />
|}<br />
<br />
A guessed name is sceSysconSet...Battery...CallbackForDriver.<br />
<br />
Registers a battery-related callback.<br />
<br />
No use case seen.<br />
<br />
index 0x12 on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_4A184B7C]].<br />
<br />
<source lang="C">int SceSysconForDriver_7682FE69(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_E0D52DF0 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xE0D52DF0<br />
|}<br />
<br />
A guessed name is sceSysconSet...Battery...CallbackForDriver.<br />
<br />
Registers a battery-related callback.<br />
<br />
No use case seen.<br />
<br />
index 0x13 on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_ACEE1C70]].<br />
<br />
<source lang="C">int SceSysconForDriver_E0D52DF0(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_2D471528 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 1.000.071-3.740.011 || 0x2D471528<br />
|}<br />
<br />
A guessed name is sceSysconSet...Battery...CallbackForDriver.<br />
<br />
Registers a callback very similar to the low battery callback.<br />
<br />
Used in [[ScePower]].<br />
<br />
index 0x14 on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_03C50DC3]].<br />
<br />
<source lang="C">int SceSysconForDriver_2D471528(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_129EA022 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0x129EA022<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
Used in [[ScePower]].<br />
<br />
index 0x15 on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_BFDA5590]].<br />
<br />
<source lang="C">int SceSysconForDriver_129EA022(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_85E5DEBF ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.996.090 || not present<br />
|-<br />
| 1.000.071-3.740.011 || 0x85E5DEBF<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
index 0x16 on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_63B14156]].<br />
<br />
No use case seen.<br />
<br />
<source lang="C">int SceSysconForDriver_85E5DEBF(void *cb_0, void *cb_1);</source><br />
<br />
=== sceSysconSetThermalAlertCallbackForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.996.090 || not present<br />
|-<br />
| 1.000.071-3.740.011 || 0x773B8126<br />
|}<br />
<br />
Registers the thermal alert callback.<br />
<br />
index 0x17 on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_50CAE242]].<br />
<br />
<source lang="C">int sceSysconSetThermalAlertCallbackForDriver(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_2E4BA4B8 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x2E4BA4B8<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
index 0x19 on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_29CF4335]].<br />
<br />
No use case seen. Maybe used in internal modules for Jig.<br />
<br />
<source lang="C">int SceSysconForDriver_2E4BA4B8(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_C442D0BE ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.692.000 || not present<br />
|-<br />
| 1.800.071-3.740.011 || 0xC442D0BE<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
index 0x1A on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_9F4042F8]].<br />
<br />
No use case seen.<br />
<br />
<source lang="C">int SceSysconForDriver_C442D0BE(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_61AE3970 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.01 || not present<br />
|-<br />
| 3.100.081-3.740.011 || 0x61AE3970<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
index 0x1B on FW 3.600.011.<br />
<br />
Related to [[#SceSysconForDriver_C50568E9]].<br />
<br />
No use case seen.<br />
<br />
<source lang="C">int SceSysconForDriver_61AE3970(void *cb_0, void *cb_1);</source><br />
<br />
=== sceSysconSetLowBatteryInhibitUpdateRebootCallbackForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.18 || not present<br />
|-<br />
| 3.300.041-3.740.011 || 0x94678881<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Registers the low-battery-inhibit-update-reboot callback.<br />
<br />
index 0x1C on FW 3.600.011.<br />
<br />
No use case seen.<br />
<br />
<source lang="C">int sceSysconSetLowBatteryInhibitUpdateRebootCallbackForDriver(void *cb_0, void *cb_1);</source><br />
<br />
=== sceSysconSetLowBatteryInhibitUpdateDownloadCallbackForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.18 || not present<br />
|-<br />
| 3.300.041-3.740.011 || 0x7AA00C01<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Registers the low-battery-inhibit-update-download callback.<br />
<br />
index 0x1D on FW 3.600.011.<br />
<br />
No use case seen.<br />
<br />
<source lang="C">int sceSysconSetLowBatteryInhibitUpdateDownloadCallbackForDriver(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_423D0C58 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x423D0C58<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
index 0x20 on FW 3.600.011.<br />
<br />
No use case seen.<br />
<br />
<source lang="C">int SceSysconForDriver_423D0C58(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_154676F1 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x154676F1<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
index 0x21 on FW 3.600.011.<br />
<br />
No use case seen.<br />
<br />
<source lang="C">int SceSysconForDriver_154676F1(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_63352A39 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x63352A39<br />
|}<br />
<br />
A guessed name is sceSysconSetMicrophoneCallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
index 0x22 on FW 3.600.011.<br />
<br />
Used in [[SceHpremote]].<br />
<br />
<source lang="C">int SceSysconForDriver_63352A39(void *cb_0, void *cb_1);</source><br />
<br />
=== SceSysconForDriver_14730196 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x14730196<br />
|}<br />
<br />
A guessed name is sceSysconSet...CallbackForDriver.<br />
<br />
Registers a callback.<br />
<br />
index 0x23 on FW 3.600.011.<br />
<br />
No use case seen.<br />
<br />
<source lang="C">int SceSysconForDriver_14730196(void *cb_0, void *cb_1);</source><br />
<br />
=== sceSysconSetAlarmCallbackForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x32418370<br />
|}<br />
<br />
Registers the alarm callback.<br />
<br />
index 0 on FWs 0.931.010-0.940. index 0x24 on FW 3.600.011.<br />
<br />
<source lang="C">int sceSysconSetAlarmCallbackForDriver(void *cb_0, void *cb_1);</source><br />
<br />
=== sceSysconSetMultiCnOtgCallbackForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0xA26586B2<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Registers 2 callbacks (maybe constructor and destructor or callback and args) for multi-connector OTG on PS Vita Fat.<br />
<br />
index 0x25 on FW 3.600.011.<br />
<br />
Used in [[SceUsbServ]].<br />
<br />
<source lang="C">int sceSysconSetMultiCnOtgCallbackForDriver(void *cb_0, void *cb_1);</source><br />
<br />
=== sceSysconSetMiniUsbOtgCallbackForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0x67A4CB9F<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Registers 2 callbacks (maybe constructor and destructor or callback and args) for mini-USB OTG on PS Vita Slim.<br />
<br />
index 0x26 on FW 3.600.011.<br />
<br />
Used in [[SceUsbServ]].<br />
<br />
<source lang="C">int sceSysconSetMiniUsbOtgCallbackForDriver(void *cb_0, void *cb_1);</source><br />
<br />
=== sceSysconUpdaterSetSegmentForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x9B00BC7F<br />
|}<br />
<br />
<source lang="C"><br />
// segment_no: a 8bit value<br />
int sceSysconUpdaterSetSegmentForDriver(SceUInt32 segment_no);<br />
</source><br />
<br />
=== sceSysconUpdaterLoadSegmentForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x356B9696<br />
|}<br />
<br />
<source lang="C"><br />
// pSegment: the encrypted segment to load<br />
// unk: maybe segment_no<br />
// size: usually 0x400<br />
int sceSysconUpdaterLoadSegmentForDriver(void *segment, int unk, SceSize size);<br />
</source><br />
<br />
=== sceSysconUpdaterLoadSegment2ForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x734544E4<br />
|}<br />
<br />
<source lang="C"><br />
// pSegment: the encrypted segment to load<br />
// unk: maybe segment_no<br />
// size: usually 0x400<br />
int sceSysconUpdaterLoadSegment2ForDriver(void *segment, int unk, SceSize size);<br />
</source><br />
<br />
=== sceSysconUpdaterCalcChecksumForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xD27C3D80<br />
|}<br />
<br />
Computes checksum to use with [[#sceSysconUpdaterExecProgrammingForDriver]]. It does not call any Syscon command.<br />
<br />
<source lang="C">int sceSysconUpdaterCalcChecksumForDriver(void *data, SceSize size, int *checksum);</source><br />
<br />
=== sceSysconUpdaterExecProgrammingForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x69AD76E4<br />
|}<br />
<br />
Executes programming, i.e writes segments to Syscon Flash memory.<br />
<br />
<source lang="C"><br />
// checksum: value got from sceSysconUpdaterCalcChecksumForDriver<br />
int sceSysconUpdaterExecProgrammingForDriver(int checksum);<br />
</source><br />
<br />
=== sceSysconUpdaterSetRunModeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xB487C2FB<br />
|}<br />
<br />
On 3.60 Ernie firmware, only updater run mode 0x72BA seems to be actually useful. Modes 0x9A54 and 0x152E are recognized but just make the function return without doing anything. Mode 0xC5E7 is not recognized by Ernie firmware, although it is present on ARM side.<br />
<br />
<source lang="C"><br />
// mode: 0x72BA (0.931.010-3.740.011), 0x9A54 (0.931.010-3.740.011), 0x152E (3.600.011-3.740.011), 0x3665 (3.600.011-3.740.011), 0xC5E7 (3.600.011-3.740.011), <br />
int sceSysconUpdaterSetRunModeForDriver(int mode);<br />
</source><br />
<br />
=== sceSysconUpdaterExecFinalizeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xC7747A63<br />
|}<br />
<br />
<source lang="C"><br />
// digest: sha1 of decrypted concatenated segments, comes from Syscon Update package packet type 0x20<br />
// size: usually 0x14 (sha1 size)<br />
int sceSysconUpdaterExecFinalizeForDriver(void *digest, SceSize size);<br />
</source><br />
<br />
=== SceSysconForDriver_CBA836FF ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0xCBA836FF<br />
|}<br />
<br />
Sends a 0x18-byte buffer to Syscon command 0x1185. This Syscon command 0x1185 seems to be unimplemented in recent Syscon firmwares: it does not do anything.<br />
<br />
<source lang="C"><br />
// size: must be 0x18<br />
int SceSysconForDriver_CBA836FF(void *pBuf, SceSize size);<br />
</source><br />
<br />
=== snvs_read ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0xEBDF88B9<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Used in [[SceSblPostSsMgr]] to read data from SNVS with [[pm_sm]] command 8. Also used in [[SceSblUpdateMgr]] with [[update_service_sm]] commands 0xB0002 and 0xC0002.<br />
<br />
<source lang="C"><br />
// in_size: 0x10<br />
// out_size: 0x30<br />
int snvs_read(void *in_buf, SceSize in_size, void *out_buf, SceSize out_size);<br />
</source><br />
<br />
=== snvs_write ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0x63683B9B<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Used in [[SceSblPostSsMgr]] to write data to SNVS with [[pm_sm]] command 8. Also used in [[SceSblUpdateMgr]] with [[update_service_sm]] commands 0xB0002 and 0xC0002.<br />
<br />
<source lang="C"><br />
// in_size: 0x30<br />
// out_size: 0x10<br />
int snvs_write(void *in_buf, SceSize in_size, void *out_buf, SceSize out_size);<br />
</source><br />
<br />
=== syscon_update_command_0xD00002 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0x4D03754A<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Calls Syscon command 0xD0.<br />
<br />
Used in [[SceSblUpdateMgr]] with [[update_service_sm]] command 0xD0002.<br />
<br />
<source lang="C"><br />
// in_buf: buffer that embeds input data, usually 0xD0002 command request + 8<br />
// in_size: usually 0x28<br />
// out_buf: buffer to receive result, usually 0xD0002 command request + 0x30<br />
// out_size: usually 0x28<br />
int syscon_update_command_0xD00002(void *in_buf, SceSize in_size, void *out_buf, SceSize out_size);<br />
</source><br />
<br />
=== SceSysconForDriver_901D6CD4 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x901D6CD4<br />
|}<br />
<br />
Sets a flag used internally by [[SceSyscon]].<br />
<br />
Used in [[SceCtrl]], [[ScePower]].<br />
<br />
<source lang="C">int SceSysconForDriver_901D6CD4(int enable);</source><br />
<br />
=== sceSysconGetControlsInfoForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x145F59A4<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
See [[KBL Param#Boot Controls Info|Boot Controls Info]].<br />
<br />
Calls Syscon command 0x100.<br />
<br />
<source lang="C">int sceSysconGetControlsInfoForDriver(SceUInt32 *pCtrl);</source><br />
<br />
=== SceSysconForDriver_76272CB9 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.692.000 || not present<br />
|-<br />
| 1.800.071-3.740.011 || 0x76272CB9<br />
|}<br />
<br />
Gets a 4 byte value.<br />
<br />
Calls Syscon command 0x120.<br />
<br />
<source lang="C">int SceSysconForDriver_76272CB9(SceUInt32 *unk);</source><br />
<br />
=== sceSysconGetClockForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xD7BEFF8B<br />
|}<br />
<br />
Gets Syscon power-on time in ticks of 0.5 second. Each second the counter automatically increases by 2.<br />
<br />
Calls Syscon command 0x11.<br />
<br />
Used in [[SceRtc]] to calculate the current time and date.<br />
<br />
<source lang="C">int sceSysconGetClockForDriver(SceUInt32 *puiTime);</source><br />
<br />
=== SceSysconForDriver_3168F3AF ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x3168F3AF<br />
|}<br />
<br />
Calls Syscon command 0x12.<br />
<br />
It is an alarm timer. It must be initialized using Syscon command 0x82 via [[#SceSysconForDriver_51164951]].<br />
<br />
<source lang="C"><br />
// FW 0.931.010<br />
int SceSysconForDriver_3168F3AF(SceUInt32 *pResult);<br />
<br />
// FW 3.600.011-3.740.011<br />
int SceSysconForDriver_3168F3AF(SceUInt32 *pResult, SceUInt32 *pResult2);<br />
</source><br />
<br />
=== SceSysconForDriver_BA09F171 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0xBA09F171<br />
|}<br />
<br />
Calls Syscon command 0x13.<br />
<br />
It might be related to alarm/timer.<br />
<br />
<source lang="C">int SceSysconForDriver_BA09F171(SceUInt32 *pResult, SceUInt32 *pResult2);</source><br />
<br />
=== sceSysconSetClockForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x9B6A6F64<br />
|}<br />
<br />
Calls Syscon command 0x81.<br />
<br />
Sets current Syscon power on time in ticks of 0.5 second. The set value can be get with [[#sceSysconGetClockForDriver]].<br />
<br />
Used in [[SceRtc]]. Set to 0 just before setting Current Tick, to reset syscon power on time.<br />
<br />
<source lang="C">int sceSysconSetClockForDriver(SceUInt32 time);</source><br />
<br />
=== SceSysconForDriver_51164951 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x51164951<br />
|}<br />
<br />
Calls Syscon command 0x82. On Syscon version < 0x90907, 4 bytes are sent to Syscon, whilst on Syscon version >= 0x90907, 5 bytes are sent to Syscon.<br />
<br />
Used in [[SceRtc#sceRtcSetAlarmTickForDriver]].<br />
<br />
The set value can be get with [[#SceSysconForDriver_3168F3AF]].<br />
<br />
<source lang="C"><br />
// a1: seen value: 0xffffffff during Syscon Init<br />
// a2: some 8-bit flag, seen value: 0 during Syscon Init<br />
<br />
// FW 0.931.010<br />
int SceSysconForDriver_51164951(int a1);<br />
<br />
// FW 3.600.011-3.740.011<br />
int SceSysconForDriver_51164951(int a1, int a2);<br />
</source><br />
<br />
=== SceSysconForDriver_373ECF8A ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0x373ECF8A<br />
|}<br />
<br />
Calls Syscon command 0x83. Sends 3 bytes to Syscon. Used only if [[KBL Param#Hardware Info|Hardware Info]] indicates that the motherboard is not IRT-001 or IRT-002 or type 0x10 (maybe named IRS-001) and if console is not in manufacturing mode.<br />
<br />
<source lang="C">int SceSysconForDriver_373ECF8A(SceUInt32 unk);</source><br />
<br />
=== SceSysconForDriver_2659535C ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0x2659535C<br />
|}<br />
<br />
Calls Syscon command 0x84. Sends 1 byte to Syscon: 0.<br />
<br />
<source lang="C">int SceSysconForDriver_2659535C(void);</source><br />
<br />
=== SceSysconForDriver_4295D497 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 0.990.000-3.740.011 || 0x4295D497<br />
|}<br />
<br />
Calls Syscon command 0x85. Sends 1 byte to Syscon: 0.<br />
<br />
<source lang="C">int SceSysconForDriver_4295D497(void);</source><br />
<br />
=== SceSysconForDriver_253CC522 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0x253CC522<br />
|}<br />
<br />
Calls Syscon command 0x807. Gets 2 bytes from Syscon.<br />
<br />
On DevKit, it returns 0x8025023F. Maybe limited by model: PS TV? PS Vita Slim?.<br />
<br />
<source lang="C">int SceSysconForDriver_253CC522(SceUInt16 *pResult);</source><br />
<br />
=== SceSysconForDriver_175CE5A1 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x175CE5A1<br />
|}<br />
<br />
Calls Syscon command 0x883. Gets 8 bytes from Syscon.<br />
<br />
<source lang="C"><br />
// pDst: pointer to a buffer of at least 8 bytes<br />
int SceSysconForDriver_175CE5A1(void *pDst);<br />
</source><br />
<br />
=== sceSysconCtrlDeviceResetForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x40FF3898<br />
|}<br />
<br />
Sends 2 bytes to Syscon command 0x88F.<br />
<br />
0xC/0 : Touch Front or Back device<br />
<br />
0xC/1 : Touch Front or Back device<br />
<br />
<source lang="C">int sceSysconCtrlDeviceResetForDriver(SceUInt8 a1, SceUInt8 a2);</source><br />
<br />
=== SceSysconForDriver_285594F8 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x285594F8<br />
|}<br />
<br />
Sends 2 bytes to Syscon command 0x890.<br />
<br />
<source lang="C">int SceSysconForDriver_285594F8(SceUInt16 value);</source><br />
<br />
=== sceSysconCtrlLEDForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x04EC7579<br />
|}<br />
<br />
<source lang="C"><br />
#define STATE_ON 1<br />
#define STATE_OFF 0<br />
<br />
#define DEVICE_UNK 0x40 // maybe PS button or CP power LED or maybe color (blue)<br />
<br />
int sceSysconCtrlLEDForDriver(SceUInt16 device, SceBool state);<br />
</source><br />
<br />
=== sceSysconCtrlChargeACForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x596B17B7<br />
|}<br />
<br />
Sends 2 bytes to Syscon command 0x892. Related to Battery. Maybe enables/disables battery charging.<br />
<br />
Used in [[ScePower]]'s module_start.<br />
<br />
<source lang="C">int sceSysconCtrlChargeACForDriver(SceBool enable);</source><br />
<br />
=== sceSysconCtrlChargeVBUSForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x2A4B0437<br />
|}<br />
<br />
Sends 3 bytes to Syscon command 0x893. Related to Battery. Maybe enables/disables battery charging.<br />
<br />
Used in [[ScePower]]'s module_start.<br />
<br />
<source lang="C"><br />
// a1: ex: 0, 1<br />
// a2: ex: 0, 1<br />
<br />
// FW 0.931.010<br />
int sceSysconCtrlChargeVBUSForDriver(SceUInt32 a1);<br />
<br />
// FW 3.600.011-3.740.011<br />
int sceSysconCtrlChargeVBUSForDriver(SceUInt32 a1, SceUInt32 a2);<br />
</source><br />
<br />
=== SceSysconForDriver_5CDDA14D ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x5CDDA14D<br />
|}<br />
<br />
A guessed name is sceSysconCtrlHpremoteForDriver.<br />
<br />
If Syscon version < 0x80001, it does nothing and returns 0, else it sends 2 bytes to Syscon command 0x899.<br />
<br />
Maybe enables/disables Jack power.<br />
<br />
Used in [[SceHpremote]].<br />
<br />
<source lang="C">int SceSysconForDriver_5CDDA14D(SceBool enable);</source><br />
<br />
=== SceSysconForDriver_A2FE9BF9 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xA2FE9BF9<br />
|}<br />
<br />
Gets information related to battery charge status, or USB power connection. See also [[Ernie#CMD_0x0800]].<br />
<br />
Used in [[ScePower]]'s module_start.<br />
<br />
<source lang="C">int SceSysconForDriver_A2FE9BF9(void *pResult);</source><br />
<br />
=== sceSysconGetBatteryTempForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x9070F139<br />
|}<br />
<br />
If Syscon version <= 0x70503, it calls Syscon command 0x8A0, else Syscon command 0x981.<br />
<br />
Used in [[ScePower]]'s module_start.<br />
<br />
<source lang="C">int sceSysconGetBatteryTempForDriver(int *pResult);</source><br />
<br />
=== sceSysconGetBatteryRemainCapacityForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xC562AF3A<br />
|}<br />
<br />
Only used in [[ScePower]].<br />
<br />
If Syscon version <= 0x70503, it calls Syscon command 0x802, else Syscon command 0x900.<br />
<br />
<source lang="C">int sceSysconGetBatteryRemainCapacityForDriver(SceUInt32 *pResult);</source><br />
<br />
=== sceSysconGetBatteryVoltForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x03F11220<br />
|}<br />
<br />
If Syscon version <= 0x70503, it calls Syscon command 0x803, else Syscon command 0x901.<br />
<br />
Used in [[ScePower]].<br />
<br />
<source lang="C">int sceSysconGetBatteryVoltForDriver(SceUInt32 *pResult);</source><br />
<br />
=== sceSysconGetBatteryLifePercentForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.06 || not present<br />
|-<br />
| 1.500.151-3.740.011 || 0xAD0A8275<br />
|}<br />
<br />
Used in [[ScePower]].<br />
<br />
<source lang="C">int sceSysconGetBatteryLifePercentForDriver(SceUInt32 *pResult);</source><br />
<br />
=== SceSysconForDriver_00A65FC1 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x00A65FC1<br />
|}<br />
<br />
If Syscon version <= 0x70503, it calls Syscon command 0x8A1, else Syscon command 0x982.<br />
<br />
Used in [[ScePower]].<br />
<br />
<source lang="C">int SceSysconForDriver_00A65FC1(int *pResult);</source><br />
<br />
=== sceSysconGetBatteryElecForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x0826BA07<br />
|}<br />
<br />
If Syscon version <= 0x70503, it calls Syscon command 0x8A2, else Syscon command 0x983.<br />
<br />
Used in [[ScePower]].<br />
<br />
<source lang="C">int sceSysconGetBatteryElecForDriver(SceUInt16 *pResult);</source><br />
<br />
=== sceSysconGetBatteryLifeTimeForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xB841C141<br />
|}<br />
<br />
If Syscon version <= 0x70503, it calls Syscon command 0x8A3, else Syscon command 0x984.<br />
<br />
Used in [[ScePower]].<br />
<br />
<source lang="C">int sceSysconGetBatteryLifeTimeForDriver(SceUInt16 *pResult);</source><br />
<br />
=== sceSysconGetBatterySOHForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x91D3B7A3<br />
|}<br />
<br />
If Syscon version <= 0x70503, it calls Syscon command 0x8A4, else Syscon command 0x985.<br />
<br />
Used in [[ScePower]].<br />
<br />
<source lang="C">int sceSysconGetBatterySOHForDriver(void *pResult);</source><br />
<br />
=== SceSysconForDriver_FDB3AE9D ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xFDB3AE9D<br />
|}<br />
<br />
Gets 0x10 bytes from Syscon command 0x183.<br />
<br />
<source lang="C">int SceSysconForDriver_FDB3AE9D(int *pResult);</source><br />
<br />
=== SceSysconForDriver_C3504ADE ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xC3504ADE<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_DE613081]].<br />
<br />
Used in [[SceHpremote]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_C3504ADE(void);</source><br />
<br />
=== SceSysconForDriver_B832B72C ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xB832B72C<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_229A07C2]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_B832B72C(void);</source><br />
<br />
=== SceSysconForDriver_86BAAF7D ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x86BAAF7D<br />
|}<br />
<br />
A guessed name is sceSysconIsAlarmTimerExistForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_8351526D]].<br />
<br />
Used in [[SceRtc]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_86BAAF7D(void);</source><br />
<br />
=== SceSysconForDriver_A57B5433 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xA57B5433<br />
|}<br />
<br />
A guessed name is sceSysconIsResumeRequestedForDriver.<br />
<br />
Related to [[#SceSysconForDriver_9F8340FF]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_A57B5433(void);</source><br />
<br />
=== SceSysconForDriver_ACC7F71E ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xACC7F71E<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_35E1689F]].<br />
<br />
Used in [[SceHpremote]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_ACC7F71E(void);</source><br />
<br />
=== SceSysconForDriver_769F9AC4 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x769F9AC4<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_474A9EA7]].<br />
<br />
Returns always SCE_TRUE on PS TV. This function could be related to USB or ethernet availability.<br />
<br />
No use case seen.<br />
<br />
<source lang="C">SceBool SceSysconForDriver_769F9AC4(void);</source><br />
<br />
=== SceSysconForDriver_4BC63A40 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x4BC63A40<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_4E88B4D9]].<br />
<br />
Used in [[SceSblPostSsMgr]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_4BC63A40(void);</source><br />
<br />
=== SceSysconForDriver_99A254A9 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x99A254A9<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_376CCCB8]].<br />
<br />
No use case seen.<br />
<br />
<source lang="C">SceBool SceSysconForDriver_99A254A9(void);</source><br />
<br />
=== SceSysconForDriver_9A4F4B7C ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0x9A4F4B7C<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_3BAAC8A9]].<br />
<br />
No use case seen.<br />
<br />
<source lang="C">SceBool SceSysconForDriver_9A4F4B7C(void);</source><br />
<br />
=== SceSysconForDriver_92D2C6A4 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0x92D2C6A4<br />
|}<br />
<br />
<source lang="C">int SceSysconForDriver_92D2C6A4(void);</source><br />
<br />
=== SceSysconForDriver_B9EA2FA8 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.995.000-3.740.011 || 0xB9EA2FA8<br />
|}<br />
<br />
A guessed name is sceSysconIsAccExistForDriver.<br />
<br />
Only used in [[SceUsbServ]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_B9EA2FA8(void);</source><br />
<br />
=== SceSysconForDriver_29CF4335 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x29CF4335<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_2E4BA4B8]].<br />
<br />
It is related to Ernie DL Mode.<br />
<br />
Used in [[SceSblPostSsMgr]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_29CF4335(void);</source><br />
<br />
=== SceSysconForDriver_32B2DB3D ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x32B2DB3D<br />
|}<br />
<br />
<source lang="c">int SceSysconForDriver_32B2DB3D(void);</source><br />
<br />
=== sceSysconIsHeadphoneExistForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x142D5E82<br />
|}<br />
<br />
Used in [[SceHpremote#sceHprmIsHeadphoneExistForDriver]].<br />
<br />
<source lang="c">SceBool sceSysconIsHeadphoneExistForDriver(void);</source><br />
<br />
=== sceSysconIsMotionDevExistForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x490C5548<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Used in [[SceMotionDev]].<br />
<br />
<source lang="c">SceBool sceSysconIsMotionDevExistForDriver(void);</source><br />
<br />
=== SceSysconForDriver_012B57B3 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010 || not present<br />
|-<br />
| 0.940-3.740.011 || 0x012B57B3<br />
|}<br />
<br />
<source lang="c">int SceSysconForDriver_012B57B3(void);</source><br />
<br />
=== SceSysconForDriver_27758A64 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 1.000.071-3.740.011 || 0x27758A64<br />
|}<br />
<br />
A guessed name is sceSysconIsBatteryOnlineForDriver, deriving from [[#sceSysconIsPowerOnlineForDriver]].<br />
<br />
Used in [[ScePower#scePowerGetBatteryRemainLevelForDriver]], [[ScePower#scePowerIsLowBatteryForDriver]], [[ScePower]]'s module_start.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_80D6E061]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_27758A64(void);</source><br />
<br />
=== SceSysconForDriver_4A184B7C ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 1.000.071-3.740.011 || 0x4A184B7C<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns some information about battery.<br />
<br />
Used in [[ScePower#ScePowerForDriver_627A89C6]].<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_7682FE69]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_4A184B7C(void);</source><br />
<br />
=== SceSysconForDriver_ACEE1C70 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0xACEE1C70<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns information about battery. Only used when battery is working.<br />
<br />
Used in [[ScePower#ScePowerForDriver_0D56C601]].<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_E0D52DF0]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_ACEE1C70(void);</source><br />
<br />
=== SceSysconForDriver_03C50DC3 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 1.000.071-3.740.011 || 0x03C50DC3<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_2D471528]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_03C50DC3(void);</source><br />
<br />
=== SceSysconForDriver_BFDA5590 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0xBFDA5590<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_129EA022]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_BFDA5590(void);</source><br />
<br />
=== SceSysconForDriver_63B14156 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.996.090 || not present<br />
|-<br />
| 1.000.071-3.740.011 || 0x63B14156<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_85E5DEBF]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_63B14156(void);</source><br />
<br />
=== SceSysconForDriver_50CAE242 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.940 || not present<br />
|-<br />
| 1.000.071-3.740.011 || 0x50CAE242<br />
|}<br />
<br />
A guessed name is sceSysconIsThermalAlertForDriver.<br />
<br />
Returns the global variable related to [[#sceSysconSetThermalAlertCallbackForDriver]].<br />
<br />
Used in [[ScePower]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_50CAE242(void);</source><br />
<br />
=== SceSysconForDriver_9F4042F8 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-1.692.000 || not present<br />
|-<br />
| 1.800.071-3.740.011 || 0x9F4042F8<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_C442D0BE]].<br />
<br />
No use case seen.<br />
<br />
<source lang="C">SceBool SceSysconForDriver_9F4042F8(void);</source><br />
<br />
=== SceSysconForDriver_C50568E9 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.01 || not present<br />
|-<br />
| 3.100.081-3.740.011 || 0xC50568E9<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_61AE3970]].<br />
<br />
This function was added to support DOL-1002 motherboard.<br />
<br />
No use case seen.<br />
<br />
<source lang="C">SceBool SceSysconForDriver_C50568E9(void);</source><br />
<br />
=== sceSysconIsLowBatteryForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xD7F5A797<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Only used in [[ScePower]].<br />
<br />
<source lang="C">SceBool sceSysconIsLowBatteryForDriver(void);</source><br />
<br />
=== sceSysconIsLowBatteryInhibitUpdateRebootForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.18 || not present<br />
|-<br />
| 3.300.041-3.740.011 || 0x1A0C140F<br />
|}<br />
<br />
This function was added along with [[ScePower#scePowerIsLowBatteryInhibitUpdateReboot]].<br />
<br />
Used in [[ScePower#scePowerIsLowBatteryInhibitUpdateReboot]].<br />
<br />
<source lang="c">SceBool sceSysconIsLowBatteryInhibitUpdateRebootForDriver(void);</source><br />
<br />
=== sceSysconIsLowBatteryInhibitUpdateDownloadForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.18 || not present<br />
|-<br />
| 3.300.041-3.740.011 || 0x1E3130EE<br />
|}<br />
<br />
This function was added along with [[ScePower#scePowerIsLowBatteryInhibitUpdateDownload]].<br />
<br />
Used in [[ScePower#scePowerIsLowBatteryInhibitUpdateDownload]].<br />
<br />
<source lang="c">SceBool sceSysconIsLowBatteryInhibitUpdateDownloadForDriver(void);</source><br />
<br />
=== sceSysconGetBatteryRemainLevelForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.18 || not present<br />
|-<br />
| 3.300.041-3.740.011 || 0x26F9D729<br />
|}<br />
<br />
Only used if Syscon version >= 0x1040105.<br />
<br />
This function was added along with [[ScePower#scePowerGetBatteryRemainLevelForDriver]].<br />
<br />
Used in [[ScePower#scePowerGetBatteryRemainLevelForDriver]].<br />
<br />
<source lang="C">int sceSysconGetBatteryRemainLevelForDriver(SceUInt8 *pResult1, SceUInt8 *pResult2);</source><br />
<br />
=== SceSysconForDriver_C0F215B7 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-0.990.000 || not present<br />
|-<br />
| 0.996.090-3.740.011 || 0xC0F215B7<br />
|}<br />
<br />
A guessed name is sceSysconIs...ForDriver.<br />
<br />
Returns the global variable related to [[#SceSysconForDriver_18A6F4D9]].<br />
<br />
The global variable is updated by [[#sceSysconCmdSyncForDriver]].<br />
<br />
<source lang="C">SceBool SceSysconForDriver_C0F215B7(void);</source><br />
<br />
=== SceSysconForDriver_D6F6D472 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0xD6F6D472<br />
|}<br />
<br />
Gets electric information (maybe intensity) of the device connected to USB OTG on PS Vita Slim. It should be studied if PS TV supports this function and if this function was initially targetting PS TV.<br />
<br />
Returns a global variable updated by [[#sceSysconCmdSyncForDriver]], obtained using Syscon command 0x130.<br />
<br />
<source lang="C">int SceSysconForDriver_D6F6D472(int *pInfo);</source><br />
<br />
=== SceSysconForDriver_F99BC858 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.01 || not present<br />
|-<br />
| 3.100.081-3.740.011 || 0xF99BC858<br />
|}<br />
<br />
Detects microSD swap.<br />
<br />
Calls syscon command 0x131.<br />
<br />
This function was maybe added to support a prototype motherboard that has a microSD port.<br />
<br />
<source lang="C">int SceSysconForDriver_F99BC858(SceBool *isSwapped);</source><br />
<br />
=== SceSysconForDriver_E7893732 ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-2.060.011 || not present<br />
|-<br />
| 2.100.081-3.740.011 || 0xE7893732<br />
|}<br />
<br />
Calls Syscon command 0x1B0. Related to UART or JIG on PS Vita Slim or PS TV.<br />
<br />
<source lang="C"><br />
// value holds 3 useful bytes and 1 byte not sent to syscon<br />
int SceSysconForDriver_E7893732(int value);<br />
</source><br />
<br />
=== sceSysconGetElmoFwVersionForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0xA039B563<br />
|}<br />
<br />
Calls Syscon command 0x880.<br />
<br />
<source lang="C">int sceSysconGetElmoFwVersionForDriver(SceUInt32 *pResult);</source><br />
<br />
=== sceSysconGetCookieFwVersionForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x9BF78047<br />
|}<br />
<br />
Calls Syscon command 0x881.<br />
<br />
<source lang="C">int sceSysconGetCookieFwVersionForDriver(SceUInt32 *pResult);</source><br />
<br />
=== sceSysconReadElmoRegForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x5BF765BB<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Calls Syscon command 0x895.<br />
<br />
=== sceSysconWriteElmoRegForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xCCC71C28<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Calls Syscon command 0x896.<br />
<br />
=== sceSysconReadCookieRegForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0x95975DD1<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Calls Syscon command 0x897. Probably reads data from Cookie.<br />
<br />
=== sceSysconWriteCookieRegForDriver ===<br />
{| class="wikitable"<br />
! Version !! NID<br />
|-<br />
| 0.990.000-3.740.011 || 0xF39300D3<br />
|}<br />
<br />
This is a guessed name.<br />
<br />
Calls Syscon command 0x898. Probably writes data to Cookie.<br />
<br />
Returns error 0x80250001 if offset is greater than 0xFF.<br />
<br />
<source lang="C"><br />
// offset: 0-0xFF<br />
int sceSysconWriteCookieRegForDriver(SceUInt32 offset, SceUInt16 data);<br />
</source><br />
<br />
== Commands ==<br />
<br />
It seems like the command format is as follows: <code>(direction << 8) | cmd_id</code>, where <code>direction = 1</code> means write to syscon, and <code>direction = 0</code> means read from syscon.<br />
<br />
{| class="wikitable"<br />
! Command<br />
! Return size (without considering the 2 bytes rx.size and rx.error_code)<br />
! Functions NIDs<br />
! Description<br />
|-<br />
| 0x0<br />
| 0x0<br />
| 0x0D0B6D25<br />
| <br />
|-<br />
| 0x1<br />
| 0x4<br />
| module_start<br />
| sceSysconGetErnieVersionForDriver. Used during SysconInit.<br />
|-<br />
| 0x2<br />
| 0xC<br />
| module_start<br />
| sceSysconGetTimeStampForDriver. Returns 12-byte string followed by at least 2-byte memory leak. Used during SysconInit.<br />
|-<br />
| 0x3<br />
| 0x4<br />
| module_start<br />
| sceSysconGetSleepFactor. Used during SysconInit.<br />
|-<br />
| 0x4<br />
| 0x4<br />
| <br />
| <br />
|-<br />
| 0x5<br />
| 0x4<br />
| 0xCBD6D8BC, module_start<br />
| sceSysconGetHardwareInfoForDriver<br />
|-<br />
| 0x6<br />
| 0x10<br />
| 0x965C68C3, module_start<br />
| sceSysconGetHardwareInfo2ForDriver. Get Hardware Info 2. See [[KBL_Param#Hardware_Info_2]].<br />
|-<br />
| 0x10<br />
| 0x2<br />
| 0xCF5B2F2F<br />
| sceSysconGetWakeupFactorForDriver<br />
|-<br />
| 0x11<br />
| 0x4<br />
| 0xD7BEFF8B<br />
| sceSysconGetClockForDriver<br />
|-<br />
| 0x12<br />
| 0x5 or 0x6<br />
| 0x3168F3AF<br />
| ??<br />
|-<br />
| 0x13<br />
| 0x2<br />
| 0xBA09F171<br />
| ??<br />
|-<br />
| 0x14<br />
| 0x1<br />
| 0x93075DD1<br />
| ??<br />
|-<br />
| 0x15<br />
| 0x4<br />
| 0x3E09A1F4<br />
| sceSysconGetManufacturesStatusForDriver<br />
|-<br />
| 0x80<br />
| 0x0<br />
| module_start<br />
| ?? Used during SysconInit.<br />
|-<br />
| 0x81<br />
| ?<br />
| 0x9B6A6F64<br />
| sceSysconSetClockForDriver<br />
|-<br />
| 0x82<br />
| ?<br />
| 0x51164951<br />
| <br />
|-<br />
| 0x83<br />
| ?<br />
| 0x373ECF8A<br />
| Sends 3 bytes to Syscon.<br />
|-<br />
| 0x84<br />
| ?<br />
| 0x2659535C<br />
| Sends 1 byte to Syscon.<br />
|-<br />
| 0x85<br />
| ?<br />
| 0x4295D497<br />
| <br />
|-<br />
| 0x86<br />
| 8<br />
| 0x701535FC<br />
| sceSysconGetLogInfoForDriver<br />
|-<br />
| 0x87<br />
| 0<br />
| 0x4E55CF5E<br />
| sceSysconLogStartForDriver. Sends 1 byte to Syscon: 0.<br />
|-<br />
| 0x88<br />
| 0x18<br />
| 0x487D97F3<br />
| sceSysconLogReadDataForDriver. Sends 2 bytes to Syscon: offset.<br />
|-<br />
| 0x89<br />
| 0<br />
| 0x9C0B1E61<br />
| sceSysconLogStartWaitingForDriver. Sends 1 byte to Syscon: 0.<br />
|-<br />
| 0x90<br />
| ?0x3B?<br />
| 0x299B1CE7<br />
| sceSysconReadScratchPadForDriver<br />
|-<br />
| 0x91<br />
| ?0x3B?<br />
| 0xE26488B9<br />
| sceSysconWriteScratchPadForDriver<br />
|-<br />
| 0xA0<br />
| ?0x10 or 0x28?<br />
| second_loader<br />
| See [[Ernie Secure]].<br />
|-<br />
| 0xB0<br />
| 0<br />
| 0x058941D7<br />
| Probably a control command. Sends 2 bytes to Syscon.<br />
|-<br />
| 0xB1<br />
| 0<br />
| 0xDF8C6D2D<br />
| sceSysconCtrlWirelessPowerDownForDriver<br />
|-<br />
| 0xB2<br />
| 0<br />
| 0xDECCB2B4<br />
| sceSysconCtrlHostOutputViaDongleForDriver. Sends 2 bytes to Syscon.<br />
|-<br />
| 0xB3<br />
| at least 1<br />
| 0x33B5CDB3<br />
| ??<br />
|-<br />
| 0xB4<br />
| at least 1<br />
| 0xF6D4DDC4<br />
| ??<br />
|-<br />
| 0xB5<br />
| 0<br />
| 0x00AE3AEB<br />
| Probably a control command. Sends 2 bytes to Syscon.<br />
|-<br />
| 0xB6<br />
| 0<br />
| 0x0D300158<br />
| Probably a control command. Sends 2 bytes to Syscon.<br />
|-<br />
| 0xB7<br />
| at least 1<br />
| 0x91EF4EC3<br />
| ??<br />
|-<br />
| 0xC0<br />
| ?0x3E?<br />
| <br />
| <br />
|-<br />
| 0xC1<br />
| 0<br />
| 0x94AB13CC<br />
| sceSysconErnieShutdownForDriver. Sends 2 bytes to Syscon.<br />
|-<br />
| 0xD0<br />
| ?0x2A or 0x28?<br />
| <br />
| <br />
|-<br />
| 0xD1<br />
| ?0x2?<br />
| <br />
| <br />
|-<br />
| 0xD2<br />
| ?0x30?<br />
| second_loader, SNVS functions<br />
| See [[Ernie Secure]]. SNVS RW.<br />
|-<br />
| 0xD3<br />
| ?0x12?<br />
| <br />
| <br />
|-<br />
| 0x100<br />
| 0x4<br />
| 0x145F59A4<br />
| sceSysconGetControlsInfoForDriver. Used in SceCtrlVblankHandler in [[SceCtrl]].<br />
|-<br />
| 0x101<br />
| 0x8<br />
| <br />
| sceSysconGetControlsInfo2ForDriver. Used in SceCtrlVblankHandler in [[SceCtrl]]. Uses Ernie version and Ernie DL version.<br />
|-<br />
| 0x102<br />
| 0xC<br />
| <br />
| <br />
|-<br />
| 0x103<br />
| 0x4<br />
| 0x1503D6A0<br />
| sceSysconGetMultiCnInfoForDriver<br />
|-<br />
| 0x104<br />
| 0xC<br />
| <br />
| sceSysconGetControlsInfo3ForDriver. Used in SceCtrlVblankHandler in [[SceCtrl]].<br />
|-<br />
| 0x105<br />
| ?<br />
| <br />
| Uses string "PS" then "TUV".<br />
|-<br />
| 0x106<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x107<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x108<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x109<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x110<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x120<br />
| ?<br />
| 0x76272CB9<br />
| ??<br />
|-<br />
| 0x121<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x130<br />
| 0x4<br />
| module_start, 0xD6F6D472<br />
| Get USB OTG device electric info (maybe intensity). Used during SysconInit.<br />
|-<br />
| 0x131<br />
| ?0x1? (read)<br />
| 0xF99BC858<br />
| ?? Added on a FW > 2.50 and <= 3.100.081.<br />
|-<br />
| 0x140<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x141<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x142<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x143<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x144<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x145<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x146<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x147<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x148<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x150<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x151<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x152<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x153<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x154<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x155<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x156<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x157<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x160<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x161<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x162<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x163<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x168<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x170<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x171<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x172<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x180<br />
| ?<br />
| <br />
| Set analog sampling. Sends 2 bytes to Syscon: 0 to disable, 1 to enable on Syscon version is < 0x90202, 3 to enable on Syscon version is >= 0x90202. Used in SceCtrlVblankHandler in [[SceCtrl]].<br />
|-<br />
| 0x181<br />
| 0<br />
| 0xCFCEE733<br />
| Sends 2 bytes to Syscon.<br />
|-<br />
| 0x182<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x183<br />
| 0x10<br />
| 0xFDB3AE9D<br />
| Gets some info.<br />
|-<br />
| 0x184<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x185<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x186<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x187<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x188<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x189<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x18A<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x18B<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x18C<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x18D<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x18E<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x18F<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x190<br />
| 0<br />
| 0x8AAB6308<br />
| sceSysconSetMultiCnPortForDriver. Sends 3 bytes to Syscon.<br />
|-<br />
| 0x191<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x192<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1A0<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1A1<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1B0<br />
| 0<br />
| 0xE7893732<br />
| Sends 3 bytes to Syscon.<br />
|-<br />
| 0x1B2<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1C0<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1C1<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1C2<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1C3<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1C4<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1D0<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1D1<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1D2<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1D3<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1D4<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1D5<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1E0<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1E1<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1E2<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x1E3<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x300<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x301<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x303<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x380<br />
| at least 1<br />
| 0xF492E69E<br />
| sceSysconGetTouchpanelDeviceInfoForDriver<br />
|-<br />
| 0x38A<br />
| at least 1<br />
| 0xA1F1B973<br />
| ??<br />
|-<br />
| 0x390<br />
| at least 1<br />
| 0x030D447F<br />
| sceSysconGetTouchpanelDeviceInfo2ForDriver<br />
|-<br />
| 0x392<br />
| ?<br />
| 0x48ED8981, 060E55C1<br />
| <br />
|-<br />
| 0x393<br />
| ?<br />
| 0x9A28BEEF, 0x8874EF45<br />
| Used in [[SceSblUpdateMgr]]<br />
|-<br />
| 0x3A9<br />
| 0<br />
| 0x010F95D9<br />
| Sends 1 byte to Syscon.<br />
|-<br />
| 0x3AB<br />
| ?<br />
| 0x357CC9D9<br />
| <br />
|-<br />
| 0x3AC<br />
| ?<br />
| 0x3664E2C0<br />
| ??<br />
|-<br />
| 0x3AF<br />
| ?<br />
| 0xB8F4F4E3<br />
| <br />
|-<br />
| 0x3B9<br />
| ?<br />
| 0x42E599AC<br />
| <br />
|-<br />
| 0x3BB<br />
| ?<br />
| 0xCCA56A16<br />
| <br />
|-<br />
| 0x3BC<br />
| ?<br />
| 0x2E6D97CD<br />
| ??<br />
|-<br />
| 0x3BF<br />
| ?<br />
| 0x240A604E<br />
| <br />
|-<br />
| 0x3C2<br />
| ?<br />
| 0x5946B29B, 0x10327C64<br />
| Used in [[SceSblUpdateMgr]]<br />
|-<br />
| 0x480<br />
| ?<br />
| 0xD01E64FC<br />
| ??<br />
|-<br />
| 0x481<br />
| ?<br />
| 0x9A7858B6<br />
| ??<br />
|-<br />
| 0x800<br />
| ?0x4?<br />
| 0xA2FE9BF9<br />
| SceSysconForDriver_A2FE9BF9. [[ScePower]] related.<br />
|-<br />
| 0x801<br />
| 0x0<br />
| <br />
| ??<br />
|-<br />
| 0x802<br />
| ?0x4?<br />
| 0xC562AF3A<br />
| sceSysconGetBatteryRemainCapacityForDriver. Replaced by Syscon command 0x900 on Syscon version > 0x70503.<br />
|-<br />
| 0x803<br />
| 0x4<br />
| 0x03F11220<br />
| sceSysconGetBatteryVoltForDriver. Replaced by Syscon command 0x901 on Syscon version > 0x70503.<br />
|-<br />
| 0x804<br />
| ?<br />
| <br />
| ??<br />
|-<br />
| 0x805<br />
| ?0x0?<br />
| 0xEF810687<br />
| sceSysconGetUsbDetStatusForDriver<br />
|-<br />
| 0x806<br />
| ?0x1?<br />
| 0xE7F5D3DC<br />
| Reboots PS Vita?<br />
|-<br />
| 0x807<br />
| 0x2<br />
| 0x253CC522<br />
| ??<br />
|-<br />
| 0x820<br />
| 0x0<br />
| 0x727F985A<br />
| sceSysconCtrlDolceLEDForDriver. PSTV LED on<br />
|-<br />
| 0x821<br />
| 0x0<br />
| 0x727F985A<br />
| sceSysconCtrlDolceLEDForDriver. PSTV LED blink slow<br />
|-<br />
| 0x822<br />
| 0x0<br />
| 0x727F985A<br />
| sceSysconCtrlDolceLEDForDriver. PSTV LED blink fast<br />
|-<br />
| 0x840<br />
| ?0x1?<br />
| 0x4FEC564C<br />
| sceSysconGetManualChargeModeForDriver<br />
|-<br />
| 0x841<br />
| ?0x1?<br />
| 0x3C3B949C<br />
| ??<br />
|-<br />
| 0x842<br />
| ?0x1?<br />
| 0x1C29C00E<br />
| ??<br />
|-<br />
| 0x843<br />
| ?0x1?<br />
| 0x730E4725<br />
| ??<br />
|-<br />
| 0x880<br />
| 0x4<br />
| 0xA039B563<br />
| sceSysconGetElmoFwVersionForDriver<br />
|-<br />
| 0x881<br />
| ?<br />
| 0x9BF78047<br />
| sceSysconGetCookieFwVersionForDriver<br />
|-<br />
| 0x882<br />
| 0x6<br />
| 0x68E0031E<br />
| sceSysconGetBatteryVersionForDriver. Replaced by Syscon command 0x980 on Syscon version > 0x70503.<br />
|-<br />
| 0x883<br />
| 0x8<br />
| 0x175CE5A1<br />
| ??<br />
|-<br />
| 0x884<br />
| ?<br />
| 0x3FDD29D6<br />
| ??<br />
|-<br />
| 0x885<br />
| ?<br />
| 0x79E6DD8B<br />
| ??<br />
|-<br />
| 0x886<br />
| ?0x2?<br />
| 0x62155962<br />
| sceSysconCtrlHdmiCecPowerForDriver<br />
|-<br />
| 0x887<br />
| ?<br />
| 0x063425AE<br />
| sceSysconCtrlMotionSensorPowerForDriver<br />
|-<br />
| 0x888<br />
| ?0x2?<br />
| 0xBE1ADE4F<br />
| sceSysconCtrlSdPowerForDriver<br />
|-<br />
| 0x889<br />
| ?0x2?<br />
| 0x8D1D97E8<br />
| sceSysconCtrlAccPowerForDriver<br />
|-<br />
| 0x88A<br />
| ?<br />
| 0x4FBDA504, 0xA2E85DB9<br />
| sceSysconCtrlWirelessPowerForDriver, sceSysconCtrlWirelessPower2ForDriver<br />
|-<br />
| 0x88B<br />
| ?<br />
| 0x5A614349<br />
| ??<br />
|-<br />
| 0x88C<br />
| ?<br />
| 0xB872E904<br />
| ??<br />
|-<br />
| 0x88D<br />
| ?<br />
| 0xDD16ABD9<br />
| ??<br />
|-<br />
| 0x88E<br />
| ?0x2?<br />
| 0x7F198FA2<br />
| sceSysconCtrlVoltageForDriver. See [[Ernie#CMD_0x088E_-_CtrlVoltage]].<br />
|-<br />
| 0x88F<br />
| ?0x2?<br />
| 0x40FF3898<br />
| sceSysconCtrlDeviceResetForDriver. ?UsbEtherSmsc and WlanBt related?<br />
|-<br />
| 0x890<br />
| ?<br />
| 0x285594F8<br />
| ??<br />
|-<br />
| 0x891<br />
| ?0x2?<br />
| 0x04EC7579<br />
| sceSysconCtrlLEDForDriver<br />
|-<br />
| 0x892<br />
| ?0?<br />
| 0x596B17B7<br />
| SceSysconForDriver_596B17B7. [[ScePower]] related.<br />
|-<br />
| 0x893<br />
| ?0?<br />
| 0x2A4B0437<br />
| SceSysconForDriver_2A4B0437. [[ScePower]] related.<br />
|-<br />
| 0x895<br />
| ?<br />
| 0x5BF765BB<br />
| sceSysconReadElmoRegForDriver<br />
|-<br />
| 0x896<br />
| ?<br />
| 0xCCC71C28<br />
| sceSysconWriteElmoRegForDriver<br />
|-<br />
| 0x897<br />
| ?<br />
| 0x95975DD1<br />
| sceSysconReadCookieRegForDriver<br />
|-<br />
| 0x898<br />
| ?<br />
| 0xF39300D3<br />
| sceSysconWriteCookieRegForDriver<br />
|-<br />
| 0x899<br />
| ?0?<br />
| 0x5CDDA14D<br />
| ?Guessed name: sceSysconCtrlHpremoteForDriver? [[SceHpremote]] related.<br />
|-<br />
| 0x89A<br />
| ?0?<br />
| 0x59DC5938<br />
| sceSysconCtrlUsbStatusForDriver<br />
|-<br />
| 0x89B<br />
| ?0x2?<br />
| 0x710A7CF0<br />
| sceSysconCtrlRMRPowerForDriver<br />
|-<br />
| 0x89C<br />
| ?0x2?<br />
| 0xB1F88B11<br />
| sceSysconCtrlDevKitUsbPowerForDriver. [[SceUsbServ]] related.<br />
|-<br />
| 0x89D<br />
| ?<br />
| 0x6F586D1A<br />
| sceSysconConfigLEDForDriver<br />
|-<br />
| 0x89E<br />
| ?<br />
| 0x9CA6EB70<br />
| [[ScePower]] related<br />
|-<br />
| 0x89F<br />
| ?<br />
| 0xCB41B531<br />
| ??<br />
|-<br />
| 0x8A0<br />
| ?0x4?<br />
| 0x9070F139<br />
| sceSysconGetBatteryTempForDriver. Replaced by Syscon command 0x981 on Syscon version > 0x70503.<br />
|-<br />
| 0x8A1<br />
| ?0x3B or 0x4?<br />
| 0x00A65FC1<br />
| Replaced by Syscon command 0x982 on Syscon version > 0x70503. [[ScePower]] related.<br />
|-<br />
| 0x8A2<br />
| 0x2<br />
| 0x0826BA07<br />
| sceSysconGetBatteryElecForDriver. Replaced by Syscon command 0x983 on Syscon version > 0x70503.<br />
|-<br />
| 0x8A3<br />
| ?0x4?<br />
| 0xB841C141<br />
| sceSysconGetBatteryLifeTimeForDriver. Replaced by Syscon command 0x984 on Syscon version > 0x70503.<br />
|-<br />
| 0x8A4<br />
| ?0x4?<br />
| 0x91D3B7A3<br />
| sceSysconGetBatterySOHForDriver. Replaced by Syscon command 0x985 on Syscon version > 0x70503.<br />
|-<br />
| 0x8B0<br />
| ?<br />
| 0x2CEF078E / 0x4946538A<br />
| sceSysconBatteryStartBLModeForDriver. Replaced by Syscon command 0x9B0 on Syscon version > 0x70503. Since FW 0.940, it is also sceSysconEnableHibernateIOForDriver independently of Syscon version.<br />
|-<br />
| 0x8B1<br />
| ?<br />
| 0xE4AE7852<br />
| sceSysconBatteryStopBLModeForDriver. Replaced by Syscon command 0x9B1 on Syscon version > 0x70503.<br />
|-<br />
| 0x8B2<br />
| ?<br />
| 0xE4F29744<br />
| sceSysconBatterySetBLCommandForDriver. Replaced by Syscon command 0x9B2 on Syscon version > 0x70503.<br />
|-<br />
| 0x8B3<br />
| ?<br />
| 0x74B2AB55<br />
| sceSysconBatteryExecBLCommandForDriver. Replaced by Syscon command 0x9B3 on Syscon version > 0x70503.<br />
|-<br />
| 0x8B4<br />
| ?<br />
| 0x448DAFF1<br />
| sceSysconBatteryReadBLCommandForDriver. Replaced by Syscon command 0x9B4 on Syscon version > 0x70503.<br />
|-<br />
| 0x8C0<br />
| ?<br />
| 0xC6A2C9EF<br />
| sceSysconCtrlManualChargeModeForDriver<br />
|-<br />
| 0x8C5<br />
| ?0x2 or 0?<br />
| 0x3274A925<br />
| ??. [[SceUsbServ]] and [[SceUsbEtherSmsc]] related.<br />
|-<br />
| 0x8C6<br />
| ?<br />
| 0xDFB024C4<br />
| sceSysconAbbySyncForDriver. [[SceSblUpdateMgr]] related<br />
|-<br />
| 0x8C7<br />
| ?<br />
| 0x87FF8041<br />
| ??<br />
|-<br />
| 0x8C8<br />
| ?<br />
| 0x7BFA95DA<br />
| ??<br />
|-<br />
| 0x8C9<br />
| ?<br />
| 0x451C1662<br />
| ??<br />
|-<br />
| 0x8CA<br />
| ?<br />
| 0x79074DE4<br />
| ??<br />
|-<br />
| 0x8CB<br />
| ?<br />
| 0x7D25F6D2<br />
| ??<br />
|-<br />
| 0x8CC<br />
| ?<br />
| 0xD2ADABCA<br />
| ??<br />
|-<br />
| 0x8CE<br />
| 0x10<br />
| 0x3B354824<br />
| sceSysconGetTemperatureLog<br />
|-<br />
| 0x8CF<br />
| 0<br />
| 0x3843D657<br />
| sceSysconClearTemperatureLog. Sends 2 bytes to syscon.<br />
|-<br />
| 0x8D0<br />
| ?<br />
| 0xF87679EE<br />
| ??<br />
|-<br />
| 0x900<br />
| ?0x4?<br />
| 0xC562AF3A<br />
| sceSysconGetBatteryRemainCapacityForDriver. Replaces Syscon command 0x802 on Syscon version > 0x70503.<br />
|-<br />
| 0x901<br />
| 0x4<br />
| 0x03F11220<br />
| sceSysconGetBatteryVoltForDriver. Replaces Syscon command 0x803 on Syscon version > 0x70503.<br />
|-<br />
| 0x902<br />
| ?0x4?<br />
| 0xAD0A8275<br />
| sceSysconGetBatteryLifePercentForDriver<br />
|-<br />
| 0x903<br />
| 0x2<br />
| 0x26F9D729<br />
| sceSysconGetBatteryRemainLevelForDriver. Added on a FW higher than 2.50 and Syscon version >= 0x1040105.<br />
|-<br />
| 0x904<br />
| ?<br />
| 0x9ADC9936<br />
| sceSysconGetBatteryCalibDataForDriver<br />
|-<br />
| 0x910<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x911<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x912<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x913<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x914<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x915<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x916<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x917<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x932<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x944<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x945<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x952<br />
| ?<br />
| <br />
| Uses string "PC" then "TUV".<br />
|-<br />
| 0x953<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x954<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x961<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x962<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x963<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x964<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x965<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x966<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x967<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x968<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x969<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x980<br />
| 0x6<br />
| 0x68E0031E<br />
| sceSysconGetBatteryVersionForDriver. Replaces Syscon command 0x882 on Syscon version > 0x70503.<br />
|-<br />
| 0x981<br />
| ?0x4?<br />
| 0x9070F139<br />
| sceSysconGetBatteryTempForDriver. Replaces Syscon command 0x8A0 on Syscon version > 0x70503.<br />
|-<br />
| 0x982<br />
| ?0x4?<br />
| 0x00A65FC1<br />
| Replaces Syscon command 0x8A1 on Syscon version > 0x70503. [[ScePower]] related.<br />
|-<br />
| 0x983<br />
| 0x2<br />
| 0x0826BA07<br />
| sceSysconGetBatteryElecForDriver. Replaces Syscon command 0x8A2 on Syscon version > 0x70503.<br />
|-<br />
| 0x984<br />
| ?0x4?<br />
| 0xB841C141<br />
| sceSysconGetBatteryLifeTimeForDriver. Replaces Syscon command 0x8A3 on Syscon version > 0x70503.<br />
|-<br />
| 0x985<br />
| ?0x4?<br />
| 0x91D3B7A3<br />
| sceSysconGetBatterySOHForDriver. Replaces Syscon command 0x8A4 on Syscon version > 0x70503.<br />
|-<br />
| 0x989<br />
| ?<br />
| 0x87DA378D<br />
| sceSysconBatterySWResetForDriver<br />
|-<br />
| 0x98A<br />
| ?0x4?<br />
| 0xF93CF833<br />
| sceSysconGetBatteryFullCapacityForDriver<br />
|-<br />
| 0x98B<br />
| ?<br />
| 0xE1885F68<br />
| ??<br />
|-<br />
| 0x98C<br />
| ?0x4?<br />
| 0xCD73079D<br />
| sceSysconGetBatteryCycleCountForDriver<br />
|-<br />
| 0x9B0<br />
| ?<br />
| 0x2CEF078E<br />
| sceSysconBatteryStartBLModeForDriver. Replaces Syscon command 0x8B0 on Syscon version > 0x70503.<br />
|-<br />
| 0x9B1<br />
| ?<br />
| 0xE4AE7852<br />
| sceSysconBatteryStopBLModeForDriver. Replaces Syscon command 0x8B1 on Syscon version > 0x70503.<br />
|-<br />
| 0x9B2<br />
| ?<br />
| 0xE4F29744<br />
| sceSysconBatterySetBLCommandForDriver. Replaces Syscon command 0x8B2 on Syscon version > 0x70503.<br />
|-<br />
| 0x9B3<br />
| ?<br />
| 0x74B2AB55<br />
| sceSysconBatteryExecBLCommandForDriver. Replaces Syscon command 0x8B3 on Syscon version > 0x70503.<br />
|-<br />
| 0x9B4<br />
| ?<br />
| 0x448DAFF1<br />
| sceSysconBatteryReadBLCommandForDriver. Replaces Syscon command 0x8B4 on Syscon version > 0x70503.<br />
|-<br />
| 0xA00<br />
| 0x0<br />
| <br />
| ??<br />
|-<br />
| 0xA82<br />
| ?<br />
| 0x7BAFE083<br />
| ??<br />
|-<br />
| 0x1080<br />
| ?0x0 or 0x2?<br />
| 0x81A6060D<br />
| sceSysconNvsSetRunModeForDriver<br />
|-<br />
| 0x1081<br />
| ?0x0 or 0x2?<br />
| 0x2EC6D55D<br />
| sceSysconNvsSetUnkModeForDriver<br />
|-<br />
| 0x1082<br />
| ?<br />
| 0xACAFA2B8<br />
| sceSysconNvsReadDataForDriver<br />
|-<br />
| 0x1083<br />
| ?0x2?<br />
| 0x10C9657A<br />
| sceSysconNvsWriteDataForDriver<br />
|-<br />
| 0x1100<br />
| 0x4<br />
| 0xD2F456DC<br />
| sceSysconGetErnieDLVersionForDriver<br />
|-<br />
| 0x1101<br />
| 0x4<br />
| <br />
| <br />
|-<br />
| 0x1180<br />
| ?<br />
| 0x9B00BC7F<br />
| sceSysconUpdaterSetSegmentForDriver<br />
|-<br />
| 0x1181<br />
| ?<br />
| 0x356B9696, 0x734544E4<br />
| sceSysconUpdaterLoadSegmentForDriver, sceSysconUpdaterLoadSegment2ForDriver<br />
|-<br />
| 0x1182<br />
| ?<br />
| 0x69AD76E4<br />
| sceSysconUpdaterExecProgrammingForDriver<br />
|-<br />
| 0x1183<br />
| ?<br />
| 0xB487C2FB<br />
| sceSysconUpdaterSetRunModeForDriver<br />
|-<br />
| 0x1184<br />
| ?<br />
| 0xC7747A63<br />
| sceSysconUpdaterExecFinalizeForDriver<br />
|-<br />
| 0x1185<br />
| ?<br />
| 0xCBA836FF<br />
| SceSysconForDriver_CBA836FF<br />
|-<br />
| 0x1300<br />
| 0x8<br />
| <br />
| ??<br />
|-<br />
| 0x1310<br />
| 0x1<br />
| 0x351946B0<br />
| ??<br />
|-<br />
| 0x1382<br />
| ?<br />
| 0xA4968B8C<br />
| sceSysconBeginConfigstorageTransactionForDriver<br />
|-<br />
| 0x1383<br />
| ?<br />
| 0xFCC3E8EE<br />
| sceSysconEndConfigstorageTransactionForDriver<br />
|-<br />
| 0x1384<br />
| ?<br />
| 0x7B9B3617<br />
| sceSysconCommitConfigstorageTransactionForDriver<br />
|-<br />
| 0x1385<br />
| ?<br />
| 0x89C5CFD6<br />
| sceSysconLoadConfigstorageScriptForDriver<br />
|-<br />
| 0x1386 (called from ARM Kernel but not implemented in Syscon FW)<br />
| ?<br />
| 0xCC6F90A8<br />
| sceSysconVerifyConfigstorageScriptForDriver<br />
|-<br />
| 0x1392<br />
| ?<br />
| 0xFD65FFCB<br />
| ??<br />
|-<br />
| 0x1393<br />
| ?<br />
| 0x02350352<br />
| ??<br />
|-<br />
| 0x1394<br />
| ?<br />
| 0x7DE84CE3<br />
| ??<br />
|-<br />
| 0x2080<br />
| ?<br />
| 0x44A173F5<br />
| sceSysconJigOpenPortForDriver<br />
|-<br />
| 0x2081<br />
| ?<br />
| 0x483FAE05<br />
| sceSysconJigClosePortForDriver<br />
|-<br />
| 0x2082<br />
| ?<br />
| 0xD24BF916<br />
| sceSysconJigSetConfigForDriver<br />
|-<br />
| 0x2083<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x2084<br />
| ?<br />
| <br />
| <br />
|-<br />
| 0x2085<br />
| ?<br />
| <br />
| <br />
|}<br />
<br />
== Callbacks ==<br />
<br />
All the following exported functions have this function prototype: <code>int sceSysconSet...Callback(void (*func)(int enable, void *argp), void *argp);</code>.<br />
<br />
{| class="wikitable"<br />
! Callback name !! Callback setter function !! State getter function !! Callback setter caller !! Comments<br />
|-<br />
| SYSCON_CB_ACC || [[#sceSysconSetAccCallbackForDriver]] || [[#SceSysconForDriver_B9EA2FA8]] || [[SceUsbServ]] ||<br />
|-<br />
| SYSCON_CB_MULTI_CN_OTG || [[#sceSysconSetMultiCnOtgCallbackForDriver]] || NA || [[SceUsbServ]] ||<br />
|-<br />
| SYSCON_CB_MINI_USB_OTG || [[#sceSysconSetMiniUsbOtgCallbackForDriver]] || NA || [[SceUsbServ]] ||<br />
|-<br />
| SYSCON_CB_ALARM || [[#sceSysconSetAlarmCallbackForDriver]] || NA || [[ScePower]] ||<br />
|-<br />
| ? || [[#SceSysconForDriver_18A6F4D9]] || [[#SceSysconForDriver_C0F215B7]] || No use case seen. ||<br />
|-<br />
| ?SYSCON_CB_HEADPHONE? || [[#SceSysconForDriver_DE613081]] || [[#SceSysconForDriver_C3504ADE]] || [[SceHpremote]] ||<br />
|-<br />
| ?SYSCON_CB_MICROPHONE? || [[#SceSysconForDriver_63352A39]] || NA || [[SceHpremote]] ||<br />
|-<br />
| ?SYSCON_CB_REMOTE? || [[#SceSysconForDriver_35E1689F]] || [[#SceSysconForDriver_ACC7F71E]] || [[SceHpremote]] ||<br />
|-<br />
| SYSCON_CB_LOW_BATTERY || [[#sceSysconSetLowBatteryCallbackForDriver]] || [[#sceSysconIsLowBatteryForDriver]] || [[ScePower]] ||<br />
|-<br />
| SYSCON_CB_THERMAL_ALERT || [[#sceSysconSetThermalAlertCallbackForDriver]] || [[#SceSysconForDriver_50CAE242]] || [[ScePower]] ||<br />
|-<br />
| SYSCON_CB_LOW_BATTERY_INIHIBIT_UPDATE_REBOOT || [[#sceSysconSetLowBatteryInhibitUpdateRebootCallbackForDriver]] || [[#sceSysconIsLowBatteryInhibitUpdateRebootForDriver]] || [[ScePower]] ||<br />
|-<br />
| SYSCON_CB_LOW_BATTERY_INIHIBIT_UPDATE_DOWNLOAD || [[#sceSysconSetLowBatteryInhibitUpdateDownloadCallbackForDriver]] || [[#sceSysconIsLowBatteryInhibitUpdateDownloadForDriver]] || [[ScePower]] ||<br />
|-<br />
| SYSCON_CB_BATTERY_ONLINE || [[#SceSysconForDriver_80D6E061]] || [[#SceSysconForDriver_27758A64]] || [[ScePower]] ||<br />
|-<br />
| SYSCON_CB_RESUME_REQUEST || [[#SceSysconForDriver_9F8340FF]] || [[#SceSysconForDriver_A57B5433]] || [[ScePower]] ||<br />
|-<br />
| ? || [[#SceSysconForDriver_2D471528]] || [[#SceSysconForDriver_03C50DC3]] || [[ScePower]] || Very similar to SYSCON_CB_LOW_BATTERY.<br />
|-<br />
| ? || [[#SceSysconForDriver_7682FE69]] || [[#SceSysconForDriver_4A184B7C]] || No use case seen. || Related to battery.<br />
|-<br />
| ? || [[#SceSysconForDriver_E0D52DF0]] || [[#SceSysconForDriver_ACEE1C70]] || No use case seen. || Related to battery.<br />
|-<br />
| ? || [[#SceSysconForDriver_229A07C2]] || [[#SceSysconForDriver_B832B72C]] || No use case seen. ||<br />
|-<br />
| ? || [[#SceSysconForDriver_474A9EA7]] || [[#SceSysconForDriver_769F9AC4]] || No use case seen. ||<br />
|-<br />
| ? || [[#SceSysconForDriver_129EA022]] || [[#SceSysconForDriver_BFDA5590]] || [[ScePower]] ||<br />
|-<br />
| SYSCON_CB_ALARM_TIMER || [[#SceSysconForDriver_8351526D]] || [[#SceSysconForDriver_86BAAF7D]] || [[SceRtc]] ||<br />
|-<br />
| ? || [[#SceSysconForDriver_2E4BA4B8]] || [[#SceSysconForDriver_29CF4335]] || No use case seen. || Used in [[SceSblPostSsMgr]].<br />
|-<br />
| ? || [[#SceSysconForDriver_4E88B4D9]] || [[#SceSysconForDriver_4BC63A40]] || No use case seen. || Used in [[SceSblPostSsMgr]].<br />
|-<br />
| ? || [[#SceSysconForDriver_376CCCB8]] || [[#SceSysconForDriver_99A254A9]] || No use case seen. ||<br />
|-<br />
| ? || [[#SceSysconForDriver_3BAAC8A9]] || [[#SceSysconForDriver_9A4F4B7C]] || No use case seen. ||<br />
|-<br />
| ? || [[#SceSysconForDriver_85E5DEBF]] || [[#SceSysconForDriver_63B14156]] || No use case seen. ||<br />
|-<br />
| ? || [[#SceSysconForDriver_14730196]] || NA || No use case seen. ||<br />
|-<br />
| ? || [[#SceSysconForDriver_C442D0BE]] || [[#SceSysconForDriver_9F4042F8]] || No use case seen. ||<br />
|-<br />
| ? || [[#SceSysconForDriver_61AE3970]] || [[#SceSysconForDriver_C50568E9]] || No use case seen. ||<br />
|-<br />
| ? || [[#SceSysconForDriver_423D0C58]] || NA || No use case seen. ||<br />
|-<br />
| ? || [[#SceSysconForDriver_154676F1]] || NA || No use case seen. ||<br />
|}<br />
<br />
See also [http://uofw.github.io/upspd/docs/SilverSpring_Blog/my.malloc.us/silverspring/2007/12/03g-model-psp/index.html SilverSpring's PSP Syscon callbacks enum] and [https://github.com/pspdev/pspsdk/blob/master/src/power/psppower.h PSPSDK power callbacks enum].<br />
<br />
[[Category:ARM]]<br />
[[Category:Kernel]]<br />
[[Category:Modules]]<br />
[[Category:Library]]</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=Ernie&diff=20873
Ernie
2023-12-26T18:40:00Z
<p>CreepNT: /* NVS */ use actual name for 0x486</p>
<hr />
<div>Ernie is the codename for the Syscon chip. The Syscon is for exemple responsible for handling button input (including power button), reading/writing to non-volatile storage (NVS) for storing system flags (mostly encrypted and signed). For example IDU flag is stored in NVS. Syscon is also responsible for maintaining the physical address to the resume buffer during [[Suspend]]. Communication between [[Kermit]] and Syscon is mainly through SPI (see [[SceSyscon]]) but there are also some GPIO pins connecting the two. The chip model is NEC/Renesas <code>uPD79F0109</code> and is likely custom designed for Sony.<br />
<br />
See also: [[Ernie Secure]]<br />
<br />
= Boot Process =<br />
<br />
The following is logged from boot. The timestamp is in seconds (the starting time is irrelevant). The arrow at the start indicates direction: '>' means Kermit to Syscon (MOSI) and '<' means Syscon to Kermit (MISO). Then there is a 2 byte command id or response code, followed by a flag byte (response only), the payload, a [[#Packet checksum|checksum byte]], and an (response only) unknown byte. Please note that the packets are listed in transfer order but this may not represent the logical order of the packets. It is currently unknown what the logical order should be, but one can guess that a response is "close to" a request.<br />
<br />
First some version information seems to be sent from Syscon to Kermit. This is same for cold boot and resume boot. The last response indicates the type of boot where 0xFF80 is resume and 0xFF14 is regular boot.<br />
<br />
<pre><br />
< [2.048118000000000] 0x0004, flags=00, payload=[0D 06 00 01 | ....], chk=0xE1, unk=0x00<br />
> [2.048118000000000] 0x0001, payload=[ | ], chk=0xFD<br />
< [2.048659583333333] 0x0004, flags=00, payload=[00 60 40 00 | .`@.], chk=0x55, unk=0x00<br />
> [2.048659583333333] 0x0005, payload=[ | ], chk=0xF9<br />
< [2.049330083333333] 0x0004, flags=00, payload=[32 30 31 32 31 31 30 38 31 37 30 34 | 201211081704], chk=0x92, unk=0x00<br />
> [2.049330083333333] 0x0002, payload=[ | ], chk=0xFC<br />
< [2.054004333333333] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x30<br />
> [2.054004333333333] 0x0080, payload=[12 00 | ..], chk=0x6A<br />
< [2.058172916666666] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x30<br />
> [2.058172916666666] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.062716333333333] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x30<br />
> [2.062716333333333] 0x0080, payload=[12 00 | ..], chk=0x6A<br />
< [2.111457750000000] 0x0004, flags=00, payload=[14 FF | ..], chk=0xE4, unk=0x32<br />
</pre><br />
<br />
Next some encrypted session is established. A 8 byte nonce is sent from Syscon (it appears random for each boot, cold or warm). Encrypted data from this point on always differs each boot.<br />
<br />
<pre><br />
> [2.111457750000000] 0x0010, payload=[ | ], chk=0xEE<br />
< [2.133389000000000] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0xFF<br />
> [2.133389000000000] 0x00A0, payload=[30 00 00 0B 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | 0.......................................], chk=0xFB<br />
< [2.150567250000000] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0xFF<br />
> [2.150567250000000] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.155149500000000] 0x0024, flags=00, payload=[30 01 00 0B 00 00 00 00 A4 B0 EF 23 D6 9A 3A 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | 0..........#..:.........................], chk=0x5F, unk=0x00<br />
> [2.155149500000000] 0x00A0, payload=[30 00 00 0B 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | 0.......................................], chk=0xFB<br />
< [2.163572000000000] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x01<br />
> [2.163572000000000] 0x00A0, payload=[30 02 00 0B 01 00 00 00 6C 7F E0 79 AA 03 4B B0 96 B7 42 F0 BC F8 62 7A 35 27 53 68 3D 0D ED A7 13 F2 32 77 46 2D 54 F8 | 0.......l..y..K...B...bz5'Sh=.....2wF-T.], chk=0x9B<br />
< [2.189271166666667] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x01<br />
> [2.189271166666667] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.193866583333334] 0x0024, flags=00, payload=[30 03 00 0B 00 00 00 00 7A 44 6E C8 F5 FA 35 CB 9B E9 E6 A0 B6 5C 85 1D FB A8 89 5C 9C 04 0B 29 34 59 55 EB 1D 98 AB 83 | 0.......zDn...5......\.....\...)4YU.....], chk=0xC6, unk=0x00<br />
> [2.193866583333334] 0x00A0, payload=[30 02 00 0B 01 00 00 00 6C 7F E0 79 AA 03 4B B0 96 B7 42 F0 BC F8 62 7A 35 27 53 68 3D 0D ED A7 13 F2 32 77 46 2D 54 F8 | 0.......l..y..K...B...bz5'Sh=.....2wF-T.], chk=0x9B<br />
</pre><br />
<br />
Some more data is exchanged. Up until this point all the plaintext payloads appear to be the same from coldboot and warmboot.<br />
<br />
<pre><br />
< [2.202246333333334] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x03<br />
> [2.202246333333334] 0x088E, payload=[01 22 | ."], chk=0x43<br />
< [2.206411750000000] 0x0004, flags=00, payload=[ | ], chk=0xF9, unk=0x03<br />
> [2.206411750000000] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.217062666666667] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x03<br />
> [2.217062666666667] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.221620916666667] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x03<br />
> [2.221620916666667] 0x088E, payload=[01 22 | ."], chk=0x43<br />
< [2.229805500000000] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x03<br />
> [2.229805500000000] 0x1082, payload=[80 04 08 | ...], chk=0xDD<br />
< [2.233887583333333] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x03<br />
> [2.233887583333333] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.238363416666667] 0x0024, flags=00, payload=[FF FF FF FF 01 FF FF FF | ........], chk=0xD7, unk=0x44<br />
> [2.238363416666667] 0x1082, payload=[80 04 08 | ...], chk=0xDD<br />
< [2.246473916666667] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0xFF<br />
</pre><br />
<br />
Now, there appears to be a branch. The next sequence only shows up for cold boots.<br />
<br />
<pre><br />
> [2.246473916666667] 0x1082, payload=[A0 04 01 | ...], chk=0xC4<br />
< [2.250555000000000] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0xFF<br />
> [2.250555000000000] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.255030833333334] 0x0024, flags=00, payload=[FF | .], chk=0xD9, unk=0x00<br />
> [2.255030833333334] 0x1082, payload=[A0 04 01 | ...], chk=0xC4<br />
< [2.259176583333333] 0x0004, flags=00, payload=[01 01 13 00 | ....], chk=0xE0, unk=0xFF<br />
> [2.259176583333333] 0x1100, payload=[ | ], chk=0xED<br />
< [2.263720583333333] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x01<br />
> [2.263720583333333] 0x00D0, payload=[30 00 00 0F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | 0.......................................], chk=0xC7<br />
< [2.267827000000000] 0x0004, flags=00, payload=[ | ], chk=0xF9, unk=0x01<br />
> [2.267827000000000] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.278339666666667] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x01<br />
> [2.278339666666667] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.282830833333333] 0x0024, flags=00, payload=[30 01 00 0F 00 00 00 00 E1 CA 65 96 BB 7E 81 7A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | 0.........e..~.z........................], chk=0x97, unk=0x00<br />
> [2.282830833333333] 0x00D0, payload=[30 00 00 0F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | 0.......................................], chk=0xC7<br />
< [2.291023500000000] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x01<br />
> [2.291023500000000] 0x00D0, payload=[30 02 00 0F 01 00 00 00 4E D7 C0 7C D5 E8 BB D7 3E 9E 43 7B B2 E3 4D 81 23 C8 C4 BF B8 4D 9B 25 0A 3D C7 45 E6 0D 23 43 | 0.......N..|....>.C{..M.#....M.%.=.E..#C], chk=0x38<br />
< [2.295129250000000] 0x0004, flags=00, payload=[ | ], chk=0xF9, unk=0x01<br />
> [2.295129250000000] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.305641750000000] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x01<br />
> [2.305641750000000] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.310132916666667] 0x0024, flags=00, payload=[30 03 00 0F 00 00 00 00 5B 3E 5C 5F 11 F9 E4 6A 85 0D 1E 06 9E F9 33 25 9B 95 55 21 39 48 FC 55 C7 BF A7 E4 32 AD FC 65 | 0.......[>\_...j......3%..U!9H.U....2..e], chk=0x55, unk=0x00<br />
> [2.310132916666667] 0x00D0, payload=[30 02 00 0F 01 00 00 00 4E D7 C0 7C D5 E8 BB D7 3E 9E 43 7B B2 E3 4D 81 23 C8 C4 BF B8 4D 9B 25 0A 3D C7 45 E6 0D 23 43 | 0.......N..|....>.C{..M.#....M.%.=.E..#C], chk=0x38<br />
< [2.318358166666667] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x03<br />
> [2.318358166666667] 0x00D0, payload=[30 04 00 0F 00 00 00 00 52 8D 6D BC 90 C9 00 EE FA CA 47 63 10 D1 4A E5 5A FD BB 91 3A 6C DA EF 64 CA 71 01 4A A9 D5 31 | 0.......R.m.......Gc..J.Z...:l..d.q.J..1], chk=0x4B<br />
< [2.322464250000000] 0x0004, flags=00, payload=[ | ], chk=0xF9, unk=0x03<br />
> [2.322464250000000] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.332976833333333] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x03<br />
> [2.332976833333333] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.337468000000000] 0x0024, flags=00, payload=[30 05 00 0F 00 00 00 00 52 8D 6D BC 90 C9 00 EE FA CA 47 63 10 D1 4A E5 5A FD BB 91 3A 6C DA EF 64 CA 71 01 4A A9 D5 31 | 0.......R.m.......Gc..J.Z...:l..d.q.J..1], chk=0xF5, unk=0x00<br />
> [2.337468000000000] 0x00D0, payload=[30 04 00 0F 00 00 00 00 52 8D 6D BC 90 C9 00 EE FA CA 47 63 10 D1 4A E5 5A FD BB 91 3A 6C DA EF 64 CA 71 01 4A A9 D5 31 | 0.......R.m.......Gc..J.Z...:l..d.q.J..1], chk=0x4B<br />
< [2.345696333333333] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x05<br />
</pre><br />
<br />
Then another set of shared sequence. Some differences in the warmboot responses though. On line 18, <pre>FF BF FF 74</pre> becomes <pre>FF FF FF 74</pre>. On line 12, the <pre>00 00 00 00</pre> becomes the physical address of the resume context buffer. Example:<br />
<pre>F0 1E 1F 41</pre><br />
<br />
<pre><br />
> [2.345696333333333] 0x00D2, payload=[20 7A 3E 7B 31 DE FC 3A 11 5F 64 E7 AB A4 EC 17 | .z>{1..:._d.....], chk=0x77<br />
< [2.349790333333333] 0x0004, flags=00, payload=[ | ], chk=0xF9, unk=0x05<br />
> [2.349790333333333] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.360448916666666] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x05<br />
> [2.360448916666666] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.364930250000000] 0x0024, flags=00, payload=[9D 0B BC 4D BA 66 40 2C 63 BE F3 79 D0 31 26 1E 47 3A 64 DE 68 2F AE E2 8A B6 F0 27 37 46 89 16 0E 71 04 FA BF C9 4A A1 DF 4B EF D3 3D 0D 39 CD | ...M.f@,c..y.1&.G:d.h/.....'7F...q....J..K..=.9.], chk=0x11, unk=0x00<br />
> [2.364930250000000] 0x00D2, payload=[20 7A 3E 7B 31 DE FC 3A 11 5F 64 E7 AB A4 EC 17 | .z>{1..:._d.....], chk=0x77<br />
< [2.373236666666667] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x0B<br />
> [2.373236666666667] 0x0090, payload=[0C 00 04 | ...], chk=0x5B<br />
< [2.377318583333333] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x0B<br />
> [2.377318583333333] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.381794416666667] 0x0024, flags=00, payload=[00 00 00 00 | ....], chk=0xD5, unk=0x66<br />
> [2.381794416666667] 0x0090, payload=[0C 00 04 | ...], chk=0x5B<br />
< [2.385879750000000] 0x0004, flags=00, payload=[40 00 | @.], chk=0xB7, unk=0x00<br />
> [2.385879750000000] 0x0800, payload=[ | ], chk=0xF6<br />
< [2.386382583333333] 0x0004, flags=00, payload=[FF BF FF 74 | ...t], chk=0xC4, unk=0x66<br />
> [2.386382583333333] 0x0100, payload=[ | ], chk=0xFD<br />
< [2.386871833333333] 0x0004, flags=00, payload=[10 00 00 00 | ....], chk=0xE5, unk=0x66<br />
> [2.386871833333333] 0x0003, payload=[ | ], chk=0xFB<br />
< [2.387380083333333] 0x0000, flags=3F, payload=[ | ], chk=0xBE, unk=0x00<br />
> [2.387380083333333] 0x0006, payload=[ | ], chk=0xF8<br />
< [2.481997666666667] 0x0000, flags=80, payload=[ | ], chk=0x7D, unk=0x00<br />
> [2.481986333333333] 0x00D2, payload=[30 14 F4 B8 84 89 81 AB 3D 07 66 DE AE B6 D3 24 | 0.......=.f....$], chk=0x10<br />
< [2.514678500000000] 0x0020, flags=00, payload=[ | ], chk=0xDD, unk=0x00<br />
> [2.514678500000000] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.519163916666667] 0x0020, flags=00, payload=[1A 1F BC 74 AA 16 59 D6 5C E7 FF 5B E0 85 B2 C8 39 2D D6 95 98 2F B7 4B 71 64 34 D7 8D 2C 94 A1 91 CB 73 D7 8D E1 D0 07 E6 1E 0F DA E7 51 BC 69 | ...t..Y.\..[....9-.../.Kqd4..,....s..........Q.i], chk=0x3C, unk=0x00<br />
> [2.519163916666667] 0x00D2, payload=[30 14 F4 B8 84 89 81 AB 3D 07 66 DE AE B6 D3 24 | 0.......=.f....$], chk=0x10<br />
< [2.527551416666667] 0x0000, flags=80, payload=[ | ], chk=0x7D, unk=0x1F<br />
> [2.527540083333333] 0x088E, payload=[02 29 | .)], chk=0x3B<br />
< [2.531619416666667] 0x0000, flags=00, payload=[ | ], chk=0xFD, unk=0x1F<br />
> [2.531619416666667] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.542392416666666] 0x0020, flags=00, payload=[ | ], chk=0xDD, unk=0x1F<br />
> [2.542392416666666] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.546867583333333] 0x0020, flags=00, payload=[ | ], chk=0xDD, unk=0x1F<br />
> [2.546867583333333] 0x088E, payload=[02 29 | .)], chk=0x3B<br />
</pre><br />
<br />
Then, the two boot paths diverge completely (also note the time jump). It is suspected that at this point the kernel is started up on coldboot, and the kernel resumes for warmboot. For cold boot only, we see the beginning init sequence again, which is likely done in [[SceSyscon]].<br />
<br />
<pre><br />
< [3.322105750000000] 0x0000, flags=00, payload=[0D 06 00 01 | ....], chk=0xE5, unk=0x16<br />
> [3.322105750000000] 0x0001, payload=[ | ], chk=0xFD<br />
< [3.326563916666667] 0x0000, flags=00, payload=[32 30 31 32 31 31 30 38 31 37 30 34 | 201211081704], chk=0x96, unk=0x85<br />
> [3.326552583333333] 0x0002, payload=[ | ], chk=0xFC<br />
< [3.331090666666667] 0x0000, flags=80, payload=[ | ], chk=0x7D, unk=0x30<br />
> [3.331079333333333] 0x0080, payload=[12 00 | ..], chk=0x6A<br />
< [3.331576333333333] 0x0020, flags=00, payload=[ | ], chk=0xDD, unk=0x30<br />
> [3.331576333333333] 0x0080, payload=[12 00 | ..], chk=0x6A<br />
< [3.332068833333333] 0x0000, flags=00, payload=[10 00 00 00 | ....], chk=0xE9, unk=0x31<br />
> [3.332068833333333] 0x0004, payload=[ | ], chk=0xFA<br />
< [3.332541666666667] 0x0000, flags=00, payload=[00 FF 04 00 | ....], chk=0xF6, unk=0x31<br />
> [3.332541666666667] 0x0103, payload=[ | ], chk=0xFA<br />
< [3.336980333333333] 0x0000, flags=00, payload=[10 00 00 00 | ....], chk=0xE9, unk=0x31<br />
> [3.336980333333333] 0x0003, payload=[ | ], chk=0xFB<br />
...<br />
</pre><br />
<br />
= Packet checksum =<br />
The checksum byte of the packet is calculated as the binary negation of the sum of all the bytes of the packet (including the 2 bytes of the command id and the byte for the length).<br />
The checksum calculation can be implemented as follows:<br />
<source lang="c"><br />
void syscon_calc_checksum(unsigned char packet[32], int length)<br />
{<br />
int i;<br />
unsigned char hash = 0;<br />
<br />
for (i = 0; i < 3 + length; i++)<br />
hash += packet[i];<br />
<br />
packet[3 + length] = ~hash;<br />
}<br />
</source><br />
<br />
= Commands =<br />
<br />
Commands are listed in the order seen in cold boot. The numbers in the captured packets indicate the assumed order with some unused packets filtered out (they appear to be resent). The ordering and grouping are assumed and may contain errors.<br />
<br />
== CMD 0x0001 - GetBaryonVersion ==<br />
<br />
Gets version of the current installed Ernie firmware. Can also be seen in the packet header in [[Syscon Update]]. Also sent at kernel boot.<br />
<br />
<pre><br />
SEND 1 > [2.881037083333333] 0x0001, payload=[ | ], chk=0xFD<br />
RESP 1 < [2.881037083333333] 0x0004, flags=00, payload=[0D 06 00 01 | ....], chk=0xE1, unk=0x71<br />
</pre><br />
<pre><br />
SEND 23 > [4.167151583333333] 0x0001, payload=[ | ], chk=0xFD<br />
RESP 23 < [4.167151583333333] 0x0000, flags=00, payload=[0D 06 00 01 | ....], chk=0xE5, unk=0x32<br />
</pre><br />
<br />
== CMD 0x0005 - GetHardwareInfo ==<br />
<br />
See [[KBL Param#Hardware_Info]].<br />
<br />
<pre><br />
SEND 2 > [2.881578833333333] 0x0005, payload=[ | ], chk=0xF9<br />
RESP 2 < [2.881578833333333] 0x0004, flags=00, payload=[00 60 40 00 | .`@.], chk=0x55, unk=0x71<br />
</pre><br />
<br />
== CMD 0x0002 - GetBaryonTimestamp ==<br />
<br />
Gets syscon firmware timestamp. Also sent at kernel boot.<br />
<br />
<pre><br />
SEND 3 > [2.882249083333333] 0x0002, payload=[ | ], chk=0xFC<br />
RESP 3 < [2.882249083333333] 0x0004, flags=00, payload=[32 30 31 32 31 31 30 38 31 37 30 34 | 201211081704], chk=0x92, unk=0x00<br />
</pre><br />
<pre><br />
SEND 24 > [4.171598000000000] 0x0002, payload=[ | ], chk=0xFC<br />
RESP 24 < [4.171598000000000] 0x0000, flags=00, payload=[32 30 31 32 31 31 30 38 31 37 30 34 | 201211081704], chk=0x96, unk=0xF7<br />
</pre><br />
<br />
== CMD 0x0080 ==<br />
<br />
Unknown. Sends data 0x0012 on FW 3.60. Does not get return data. Also sent at kernel boot.<br />
<br />
<pre><br />
SEND 4 > [2.895635416666666] 0x0080, payload=[12 00 | ..], chk=0x6A<br />
RESP 4 < [2.886923416666667] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x30<br />
RESP 4 < [2.891092083333333] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x30<br />
RESP 4 < [2.895635416666666] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x30<br />
</pre><br />
<pre><br />
SEND 25 > [4.176620750000000] 0x0080, payload=[12 00 | ..], chk=0x6A<br />
RESP 25 < [4.176123750000000] 0x0000, flags=80, payload=[ | ], chk=0x7D, unk=0x30<br />
RESP 25 < [4.176620750000000] 0x0020, flags=00, payload=[ | ], chk=0xDD, unk=0x30<br />
</pre><br />
<br />
== CMD 0x0010 - GetWakeupFactor ==<br />
<br />
See [[KBL Param#Wakeup factor|Wakeup factor]].<br />
<br />
Boot type indicator. 0xFF14 on cold boot. 0xFF80 on resume boot.<br />
<pre><br />
SEND 5 > [2.950546416666667] 0x0010, payload=[ | ], chk=0xEE<br />
RESP 5 < [2.950546416666667] 0x0004, flags=00, payload=[14 FF | ..], chk=0xE4, unk=0x32<br />
</pre><br />
<br />
== CMD 0x00A0 ==<br />
<br />
Runs twice. Appears to contain a 8 byte inner header. First packet sends all zeros and gets back a 8 byte random response. This is likely a nonce or challenge. This likely establishes an encrypted session. Encrypted data differs on each boot. There does not appear to be data transferred using the established session.<br />
<br />
<pre><br />
SEND 6 > [2.994470666666667] 0x00A0, payload=[30 00 00 0B 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | 0.......................................], chk=0xFB<br />
RESP 6 < [2.972471333333333] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0xFF<br />
RESP 6 < [2.989889500000000] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0xFF<br />
RESP 6 < [2.994470666666667] 0x0024, flags=00, payload=[30 01 00 0B 00 00 00 00 CA 71 11 BA 86 87 EF 0D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | 0........q..............................], chk=0x66, unk=0x00<br />
<br />
SEND 7 > [3.033187750000000] 0x00A0, payload=[30 02 00 0B 01 00 00 00 92 45 B4 A5 49 15 CE F2 39 0E 9E 4C BF FA 19 E6 5D CF BA 5A 6E C3 7C ED 2A 6D 4E 79 84 28 1C 2A | 0........E..I...9..L....]..Zn.|.*mNy.(.*], chk=0x97<br />
RESP 7 < [3.002893083333333] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x01<br />
RESP 7 < [3.028592333333334] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x01<br />
RESP 7 < [3.033187750000000] 0x0024, flags=00, payload=[30 03 00 0B 00 00 00 00 12 77 A5 98 67 F7 38 9B B4 54 48 FE 84 82 CF 84 41 42 87 A2 EA D1 CF 9C 5B D1 2A 3F 1E 50 B9 3D | 0........w..g.8..TH.....AB......[.*?.P.=], chk=0x0A, unk=0x00<br />
</pre><br />
<br />
== CMD 0x088E - CtrlVoltage ==<br />
<br />
Controls voltage. Sends value 0x2201 on FW 3.60 and does not get any response.<br />
<br />
<pre><br />
SEND 8 > [3.061354583333333] 0x088E, payload=[01 22 | ."], chk=0x43<br />
RESP 8 < [3.041713500000000] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x03<br />
RESP 8 < [3.046148250000000] 0x0004, flags=00, payload=[ | ], chk=0xF9, unk=0x03<br />
RESP 8 < [3.056796250000000] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x03<br />
RESP 8 < [3.061354583333333] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x03<br />
</pre><br />
<br />
== CMD 0x1082 - NVS Read ==<br />
<br />
Get data from [[#NVS|NVS]]. 2-byte offset followed by 1 byte length. For example used to fetch boot-time flags, like Update Mode.<br />
<br />
<pre><br />
Get Qaf Token area:<br />
SEND 9 > [3.078212500000000] 0x1082, payload=[80 04 08 | ...], chk=0xDD<br />
RESP 9 < [3.069790250000000] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x03<br />
RESP 9 < [3.073736583333333] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x03<br />
RESP 9 < [3.078212500000000] 0x0024, flags=00, payload=[FF FF FF FF 01 FF FF FF | ........], chk=0xD7, unk=0x77<br />
<br />
Get Update Mode:<br />
SEND 10 > [3.094879833333333] 0x1082, payload=[A0 04 01 | ...], chk=0xC4<br />
RESP 10 < [3.086322916666667] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0xFF<br />
RESP 10 < [3.090404000000000] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0xFF<br />
RESP 10 < [3.094879833333333] 0x0024, flags=00, payload=[FF | .], chk=0xD9, unk=0x00<br />
</pre><br />
<br />
== CMD 0x1100 - GetErnieDLVersion ==<br />
<br />
Gets Ernie DownLoader Version i.e. version of Ernie firmware.<br />
<br />
<pre><br />
SEND 11 > [3.099025500000000] 0x1100, payload=[ | ], chk=0xED<br />
RESP 11 < [3.099025500000000] 0x0004, flags=00, payload=[01 01 13 00 | ....], chk=0xE0, unk=0xFF<br />
</pre><br />
<br />
== CMD 0x00D0 ==<br />
Some encrypted transfer that looks close to [[Syscon#CMD 0x00A0]] in format. Different on each boot.<br />
<pre><br />
SEND 12 > [3.122679833333333] 0x00D0, payload=[30 00 00 0F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | 0.......................................], chk=0xC7<br />
RESP 12 < [3.103569583333333] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x01<br />
RESP 12 < [3.107676166666667] 0x0004, flags=00, payload=[ | ], chk=0xF9, unk=0x01<br />
RESP 12 < [3.118188666666667] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x01<br />
RESP 12 < [3.122679833333333] 0x0024, flags=00, payload=[30 01 00 0F 00 00 00 00 9F CC 4A 69 73 E9 C0 5A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | 0.........Jis..Z........................], chk=0xDD, unk=0x00<br />
<br />
SEND 13 > [3.150031916666667] 0x00D0, payload=[30 02 00 0F 01 00 00 00 98 6D 3A 1E C5 B1 E9 AF 54 65 55 91 3B DF 2B A8 0F AD B0 73 A0 A2 0F EE 5D 0A AF 41 A5 6D 32 20 | 0........m:.....TeU.;.+....s....]..A.m2.], chk=0xF4<br />
RESP 13 < [3.130872500000000] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x01<br />
RESP 13 < [3.134978166666667] 0x0004, flags=00, payload=[ | ], chk=0xF9, unk=0x01<br />
RESP 13 < [3.145539833333333] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x01<br />
RESP 13 < [3.150031916666667] 0x0024, flags=00, payload=[30 03 00 0F 00 00 00 00 F5 19 C0 67 09 80 C6 DB 58 8D FB E1 86 22 D1 00 DA BB D2 AF AA 51 F9 57 7C 56 92 0A 94 D6 60 4D | 0..........g....X....".......Q.W|V....`M], chk=0xF0, unk=0x00<br />
<br />
SEND 14 > [3.177452416666667] 0x00D0, payload=[30 04 00 0F 00 00 00 00 87 4E 59 41 22 98 F8 62 BD B4 C8 4F 4C 0A 81 90 47 1E 1E 70 D6 51 57 42 E5 EC 07 A2 D4 CF E5 02 | 0........NYA"..b...OL...G..p.QWB........], chk=0x9A<br />
RESP 14 < [3.158257166666667] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x03<br />
RESP 14 < [3.162363250000000] 0x0004, flags=00, payload=[ | ], chk=0xF9, unk=0x03<br />
RESP 14 < [3.172875666666667] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x03<br />
RESP 14 < [3.177452416666667] 0x0024, flags=00, payload=[30 05 00 0F 00 00 00 00 87 4E 59 41 22 98 F8 62 BD B4 C8 4F 4C 0A 81 90 47 1E 1E 70 D6 51 57 42 E5 EC 07 A2 D4 CF E5 02 | 0........NYA"..b...OL...G..p.QWB........], chk=0x44, unk=0x00<br />
</pre><br />
<br />
== CMD 0x00D2 - SNVS RW ==<br />
This command is used twice during boot and also quite often after boot. Data is different on each boot. Encrypted session using key from handshake above. Second transaction seems to be the firmware version data written during the update process. Likely firmware version check is done here.<br />
<pre><br />
SEND 15 > [3.204733083333333] 0x00D2, payload=[32 78 88 CF 3E 63 56 19 75 3A 0A 2D F3 49 63 E2 | 2x..>cV.u:.-.Ic.], chk=0xA4<br />
RESP 15 < [3.185595250000000] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x05<br />
RESP 15 < [3.189740333333333] 0x0004, flags=00, payload=[ | ], chk=0xF9, unk=0x05<br />
RESP 15 < [3.200251666666666] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x05<br />
RESP 15 < [3.204733083333333] 0x0024, flags=00, payload=[D3 57 9B F2 A2 45 E2 7A 2A FC 84 12 97 8E 23 5F C8 AB FB 58 97 EC DE 20 94 0A 78 28 C6 EE C5 45 18 29 00 F4 56 22 53 AF 24 47 8E FF B1 5C DA 2F | .W...E.z*.....#_...X......x(...E.)..V"S.$G...\./], chk=0x4C, unk=0xFF<br />
</pre><br />
<pre><br />
SEND 21 > [3.359112250000000] 0x00D2, payload=[1C 0B 9E FF FB 68 90 4B FD C2 05 CD D8 67 4D D0 | .....h.K.....gM.], chk=0x2D<br />
RESP 21 < [3.321934500000000] 0x0000, flags=80, payload=[ | ], chk=0x7D, unk=0x00<br />
RESP 21 < [3.354626666666667] 0x0020, flags=00, payload=[ | ], chk=0xDD, unk=0x00<br />
RESP 21 < [3.359112250000000] 0x0020, flags=00, payload=[6C B4 26 F3 CD 32 D3 3E 6F 80 F2 0F 68 F7 E2 96 58 DB 2F BB AB A6 98 DD 26 14 DD 61 12 E4 55 BA BB 32 1D 1F 75 D5 D1 4C 7E 4A 19 42 E5 B0 C6 AB | l.&..2.>o...h...X./.....&..a..U..2..u..L~J.B....], chk=0x84, unk=0xFF<br />
</pre><br />
<br />
== CMD 0x0090 - Scratch Pad Read ==<br />
<br />
This command reads data from Ernie Scratch Pad. This is the inverse of command 0x91.<br />
<br />
This is used for example to fetch the saved resume context buffer physical address. Kernel sets this before suspending and this value is passed to the resume function. See [[Suspend]]. The format is 2 byte offset and 1 byte length.<br />
<br />
<pre><br />
SEND 16 > [3.221743166666667] 0x0090, payload=[0C 00 04 | ...], chk=0x5B<br />
RESP 16 < [3.213273166666667] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x57<br />
RESP 16 < [3.217267333333333] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x57<br />
RESP 16 < [3.221743166666667] 0x0024, flags=00, payload=[F0 0E 1F 41 | ...A], chk=0x77, unk=0x45<br />
</pre><br />
<br />
== CMD 0x0091 - Scratch Pad Write ==<br />
<br />
This command writes data to Ernie Scratch Pad. This is the inverse of command 0x90.<br />
<br />
== CMD 0x0800 - Get USB Info ==<br />
<br />
See [[KBL Param]].<br />
<br />
<pre><br />
SEND 17 > [3.225828583333334] 0x0800, payload=[ | ], chk=0xF6<br />
RESP 17 < [3.225828583333334] 0x0004, flags=00, payload=[40 00 | @.], chk=0xB7, unk=0x41<br />
</pre><br />
<br />
== CMD 0x0100 - GetControlsInfo ==<br />
<br />
See [[KBL Param#Boot Controls Info|Boot Controls Info]].<br />
<br />
<pre><br />
SEND 18 > [3.226331500000000] 0x0100, payload=[ | ], chk=0xFD<br />
RESP 18 < [3.226331500000000] 0x0004, flags=00, payload=[FF BF FF 74 | ...t], chk=0xC4, unk=0x45<br />
</pre><br />
<br />
== CMD 0x0003 - GetSleepFactor ==<br />
<br />
See [[KBL Param#Sleep Factor|Sleep Factor]].<br />
<br />
<pre><br />
SEND 19 > [3.226820750000000] 0x0003, payload=[ | ], chk=0xFB<br />
RESP 19 < [3.226820750000000] 0x0004, flags=00, payload=[10 00 00 00 | ....], chk=0xE5, unk=0x45<br />
</pre><br />
<br />
== CMD 0x0006 - Get Hardware flags ==<br />
<br />
See [[KBL Param#Hardware flags|Hardware flags]].<br />
<br />
<pre><br />
SEND 20 > [3.227328833333333] 0x0006, payload=[ | ], chk=0xF8<br />
RESP 20 < [3.227328833333333] 0x0000, flags=3F, payload=[ | ], chk=0xBE, unk=0x00<br />
</pre><br />
<br />
== CMD 0x088E ==<br />
Unknown. Appears to be the last command sent before a time-jump (likely indicating completion of early-boot). Might be some status indicator to tell Syscon that we're done.<br />
<pre><br />
SEND 22 > [3.386554833333333] 0x088E, payload=[02 29 | .)], chk=0x3B<br />
RESP 22 < [3.367488416666667] 0x0000, flags=80, payload=[ | ], chk=0x7D, unk=0xB4<br />
RESP 22 < [3.371567833333333] 0x0000, flags=00, payload=[ | ], chk=0xFD, unk=0xB4<br />
RESP 22 < [3.382079833333334] 0x0020, flags=00, payload=[ | ], chk=0xDD, unk=0xB4<br />
RESP 22 < [3.386554833333333] 0x0020, flags=00, payload=[ | ], chk=0xDD, unk=0xB4<br />
</pre><br />
<br />
== CMD 0x0004 ==<br />
Unknown. Likely happens after initial boot.<br />
<pre><br />
SEND 26 > [4.177113250000000] 0x0004, payload=[ | ], chk=0xFA<br />
RESP 26 < [4.177113250000000] 0x0000, flags=00, payload=[10 00 00 00 | ....], chk=0xE9, unk=0x31<br />
</pre><br />
<br />
== CMD 0x0103 - Get Multi Connector Info ==<br />
<br />
Likely happens after initial boot.<br />
<br />
<pre><br />
SEND 27 > [4.177586083333333] 0x0103, payload=[ | ], chk=0xFA<br />
RESP 27 < [4.177586083333333] 0x0000, flags=00, payload=[00 FF 04 00 | ....], chk=0xF6, unk=0x31<br />
</pre><br />
<br />
= Syscon Scratch Pad =<br />
<br />
{| class="wikitable"<br />
|-<br />
! Offset !! Size !! Name !! Comment !! Used by<br />
|-<br />
| 0x0 || 8 || unknown || ||<br />
|-<br />
| 0x8 || 4 || Syscon power on time || ex on DevKit: 0xA, 0x16, 0x1F, 0x24. ex on retail: 0x01BC0CD0, 0x05AC1AF7, 0x80000269 || [[SceRtc#sceRtcSetCurrentTickForDriver]]<br />
|-<br />
| 0xC || 4 || Resume context physical address || Set on retail. Not set on DevKit. ex: 0x411F1EF0 || second_loader<br />
|-<br />
| 0x10 || 5 || Current Tick || Set on retail and DevKit. Stored in microseconds since 01/01/0001 divided by 2^19. || [[SceRtc#sceRtcSetCurrentTickForDriver]]<br />
|-<br />
| 0x15 || 3 || Padding of Current Tick || ||<br />
|-<br />
| 0x18 || 5 || Current Secure Tick || Set on retail. Not set on DevKit. || [[SceRtc#sceRtcSetCurrentSecureTickForDriver]]<br />
|-<br />
| 0x1D || 5 || Current Network Tick || Always a bit earlier than Current Tick and Current Secure Tick. || [[SceRtc#sceRtcSetCurrentNetworkTickForDriver]]<br />
|-<br />
| 0x22 || 5 || Current ?Debug Secure?/?Tool Secure? Tick || Set on DevKit. Not set on retail. || [[SceRtc#sceRtcGetCurrentToolSecureTickForDriver]]<br />
|-<br />
| 0x27 || 5 || Current Aux Tick || || [[SceRtc#sceRtcSetCurrentAuxTickForDriver]]<br />
|-<br />
| 0x2C || 5 || Current Debug Network Tick || || [[SceRtc#sceRtcSetCurrentDebugNetworkTickForDriver]]<br />
|-<br />
| 0x31 || 0x8F || unknown || Maybe reserved. Probably unused. ||<br />
|-<br />
| 0xE0 || 0x20 || [[KBL Param|CP DIP Switches]] || Set on DevKit having a CP. Hence not set on Retail nor TestKit. || ?secure_kernel? before system suspend, second_loader after system resume<br />
|}<br />
<br />
== Types ==<br />
<br />
<source lang="C"><br />
typedef struct SceSysconRtcTick { // size is 5 bytes<br />
uint8_t tick[5];<br />
} SceSysconRtcTick;<br />
<br />
typedef struct SceSysconScratchPad { // size is 0x100 bytes<br />
uint8_t unk_0[8];<br />
SceUInt32 powerOnTime;<br />
void *resumeContextPA;<br />
SceRtcSysconTick currentTick;<br />
uint8_t padding[3];<br />
SceSysconRtcTick currentSecureTick;<br />
SceSysconRtcTick currentNetworkTick;<br />
SceSysconRtcTick unk_0x22;<br />
SceSysconRtcTick currentAuxTick;<br />
SceSysconRtcTick currentDebugNetworkTick;<br />
uint8_t reserved[0x8F];<br />
SceDIPSW dipsw;<br />
} SceSysconScratchPad;<br />
</source><br />
<br />
= NVS =<br />
<br />
Ernie Non-volatile storage (NVS) is a persistent storage allocated on Ernie Data Flash that is used by PS Vita OS for data required at boot time. Indeed, reading NVS requires no driver except the driver to communicate with Syscon, whilst reading PS Vita eMMC requires its AES-XTS decryption.<br />
<br />
Not every NVS sector is directly readable from Kermit: the first sectors are part of [[Ernie Secure#SNVS|SNVS]] (Secure NVS) which means that they are XTS-encrypted and must be accessed through a Secure handshake.<br />
<br />
NVS actual size is 0xBA0 bytes on new Syscon hardware revisions and 0xC20 on old. However, only 0xB60 bytes are accessible from Kermit on System Software 3.600.011 and more recent. The hidden area is probably used internally by Syscon as it is not blanked nor 0xFFed.<br />
<br />
On FW 3.60, NVS size accessible from Kermit is 0xB60 bytes:<br />
* Area from 0 to 0x3FF is named [[Ernie Secure#SNVS]]. It has an additional level of encryption. It cannot be read using [[SceSblSsMgr#sceSblNvsReadForKernel]] nor written using [[SceSblSsMgr#sceSblNvsWriteForKernel]]. This area is handled by [[Secure Modules]].<br />
* Area from 0x400 to 0x75F is handled by Non-secure Kernel [[SceSblSsMgr]] module.<br />
* Area from 0x760 to 0xB5F is reserved for Test and Tool consoles. However this area seems unused.<br />
* Area from 0xB60 to the end of NVS is not accessible from Kermit.<br />
<br />
{| class="wikitable"<br />
|-<br />
! Offset !! Size !! Name !! Comment !! Used by<br />
|-<br />
| 0 || 0x400 || SNVS || See [[Ernie Secure#SNVS]]. ||<br />
|-<br />
| 0x400 || 0x80 || Qaf Token || || second_loader<br />
|-<br />
| 0x480 || 0x1 || Qaf Token Flag || 1 when Qaf Token is not set (FFed), 0 when Qaf Token is set || second_loader<br />
|-<br />
| 0x481 || 0x1 || Extra UART Flag || See [[KBL Param#Boot flags]]. || second_loader<br />
|-<br />
| 0x482 || 0x1 || Unknown || || [[SceSblSsMgr#sceSblSsGetNvsDataForDriver]], [[SceSblSsMgr#sceSblSsSetNvsDataForDriver]]<br />
|-<br />
| 0x483 || 0x1 || Safe Mode Flag || See [[KBL Param#Boot flags]]. || [[SceSblSsMgr#sceSblSsGetNvsDataForDriver]], [[SceSblSsMgr#sceSblSsSetNvsDataForDriver]], second_loader<br />
|-<br />
| 0x484 || 0x1 || <code>KervResult</code>/<code>KervDiagResultFlag</code> || || Factory test <code>preCheckFactTest</code><br />
|-<br />
| 0x485 || 0x1 || Unknown || ||<br />
|-<br />
| 0x486 || 0x1 || <code>MCEmu</code> Flag || See [[KBL Param#Boot flags]].<br>Not present on FWs 0.931-0.990. Present on FW 3.60. || [[SceSblSsMgr#sceSblSsGetNvsDataForDriver]], [[SceSblSsMgr#sceSblSsSetNvsDataForDriver]], second_loader<br />
|-<br />
| 0x487 || 0x1 || Unknown || See [[KBL Param#Boot flags]]. || second_loader<br />
|-<br />
| 0x4A0 || 0x1 || Update Mode || See [[KBL Param#Boot flags]]. || [[SceSblUpdateMgr#sceSblUsGetUpdateModeForUser]], [[SceSblUpdateMgr#sceSblUsSetUpdateModeForUser]]<br />
|-<br />
| 0x4A1 || 0x3 || Unknown. Unused. || ||<br />
|-<br />
| 0x4A4 || 0x4 || System Language || || [[SceRegistryMgr]], [[SceSblSsMgr#sceSblSsGetNvsDataForDriver]], [[SceSblSsMgr#sceSblSsSetNvsDataForDriver]]<br />
|-<br />
| 0x4A8 || 0x1C || Unknown. Unused. || ||<br />
|-<br />
| 0x4C4 || 0x1 || Unknown. Set to 0 by default. || || <br />
|-<br />
| 0x4C5 || 0x1B || Unknown. Unused. || ||<br />
|-<br />
| 0x4E0 || 0x20 || KibanID || || [[SceSblSsMgr#sceSblSsGetNvsDataForDriver]], [[SceSblSsMgr#sceSblSsSetNvsDataForDriver]]<br />
|-<br />
| 0x500 || 0x1 || Wlan/Bt Flag || || [[SceSblSsMgr#sceSblSsGetNvsDataForDriver]], [[SceSblSsMgr#sceSblSsSetNvsDataForDriver]], [[SceWlanBt]] module_start<br />
|-<br />
| 0x501 || 0x1F || Unknown. Unused. || ||<br />
|-<br />
| 0x520 || 0x80 || Activation Area || first 0x20 bytes are SceNVSKitActivationData || [[SceSblSsMgr]], [[SceSblPostSsMgr]]<br />
|-<br />
| 0x5A0 || 0x100 || Qaf Token RSA signature || Not present on FW 0.990. Present on FW 3.60. Maybe added on FW 1.80. || second_loader<br />
|-<br />
| 0x6A0 || 0xC0 || Unknown. Unused. || ||<br />
|-<br />
| 0x760 || 0x400 || Reserved for Test and Tool. || Seems unused. ||<br />
|}<br />
<br />
== Types ==<br />
<br />
<source lang="C"><br />
typedef struct SceNVSKitActivationData { // size is 0x20 bytes<br />
char magic[4]; // "act\n"<br />
uint32_t issue_no;<br />
uint32_t end_date;<br />
uint32_t start_date;<br />
char cmac_hash[0x10];<br />
} SceNVSKitActivationData;<br />
</source><br />
<br />
= Config Storage =<br />
<br />
Config Storage is a similar storage than [[#NVS|NVS]] but is accessed in a different manner. Whilst [[#NVS|NVS]] is read and written by 32-byte sectors and is physically stored with a sort of history, Config Storage is written by sending scripts from [[Kermit]] to Syscon, and is not really readable but instead affects [[KBL Param#Hardware Info]].<br />
<br />
== Sample scripts ==<br />
<br />
Below are sample configstorage scripts hardcoded in [[SceSyscon]]:<br />
<source lang="C"><br />
const char syscon_idu_set_config[0x20] = {<br />
0x1F, 0x54, 0x35, 0x63, 0x38, 0x62, 0x31, 0x64,<br />
0x61, 0x63, 0x62, 0x38, 0x33, 0x36, 0x64, 0x64,<br />
0x36, 0x63, 0x39, 0x39, 0x36, 0x38, 0x65, 0x34,<br />
0x63, 0x30, 0x35, 0x30, 0x61, 0x36, 0x66, 0x35<br />
};<br />
<br />
const char syscon_idu_set_config2[0x20] = {<br />
0x07, 0x57, 0xA8, 0x01, 0x01, 0x00, 0x0D, 0x00,<br />
0x01, 0x4E, 0x15, 0x48, 0x51, 0xBD, 0x52, 0x2C,<br />
0x4C, 0x83, 0x70, 0xDA, 0x4D, 0xF3, 0x8E, 0x82,<br />
0x6B, 0xD6, 0x34, 0x98, 0x3A, 0xFD, 0xA6, 0x94<br />
};<br />
<br />
const char syscon_show_set_config[0x20] = {<br />
0x1F, 0x54, 0x66, 0x63, 0x33, 0x39, 0x38, 0x39,<br />
0x30, 0x61, 0x33, 0x32, 0x64, 0x30, 0x66, 0x32,<br />
0x37, 0x36, 0x31, 0x35, 0x62, 0x65, 0x36, 0x65,<br />
0x63, 0x64, 0x63, 0x35, 0x65, 0x32, 0x63, 0x63<br />
};<br />
<br />
const char syscon_show_set_config2[0x20] = {<br />
0x07, 0x57, 0xA8, 0x01, 0x03, 0x00, 0x10, 0x00,<br />
0x01, 0x4E, 0x15, 0x48, 0xB8, 0x1A, 0x54, 0xD1,<br />
0xF2, 0xA0, 0xD1, 0x05, 0x18, 0xEA, 0x22, 0x09,<br />
0x0A, 0x02, 0x2E, 0xAE, 0x00, 0x08, 0x25, 0xF1<br />
};<br />
<br />
const char syscon_clear_config[0x20] = {<br />
0x1F, 0x54, 0x65, 0x34, 0x61, 0x65, 0x38, 0x62,<br />
0x37, 0x61, 0x65, 0x38, 0x36, 0x33, 0x32, 0x65,<br />
0x64, 0x64, 0x39, 0x61, 0x61, 0x65, 0x38, 0x38,<br />
0x38, 0x39, 0x66, 0x30, 0x65, 0x65, 0x61, 0x38<br />
};<br />
<br />
const char syscon_clear_config2[0x20] = {<br />
0x07, 0x57, 0xA8, 0x01, 0x00, 0x00, 0x00, 0x00,<br />
0x01, 0x4E, 0x15, 0x48, 0x88, 0xEA, 0xC7, 0xAD,<br />
0x65, 0xB1, 0x73, 0xC1, 0xCF, 0x48, 0xC7, 0x29,<br />
0x1B, 0x2B, 0x8A, 0x32, 0x89, 0xCF, 0xB3, 0xC1<br />
};<br />
</source><br />
<br />
The only actual differences between those scripts are:<br />
* the ascii string: we do not know how it is generated and what it means<br />
* the mode value:<br />
** A8 01 00 00 00 00 = mode clear<br />
** A8 01 01 00 0D 00 = idu mode set<br />
** A8 01 03 00 10 00 = show mode set<br />
<br />
== Types ==<br />
<br />
<source lang="C"><br />
// TODO<br />
</source><br />
<br />
{| class="wikitable"<br />
|-<br />
! Offset !! Size !! Name !! Sample value !! Comment<br />
|-<br />
| 0 || 1 || ascii_data_size || 0x1F ||<br />
|-<br />
| 1 || 1 || ascii_data_flag || 0x54 ||<br />
|-<br />
| 2 || 0x1E || ascii_data || || ASCII hexadecimal string so maybe a hash<br />
|-<br />
| 0x20 || 1 || unk_7_data_size || 7 ||<br />
|-<br />
| 0x21 || 1 || unk_7_data_flag || ||<br />
|-<br />
| 0x22 || 6 || unk_7_data || ||<br />
|-<br />
| 0x28 || 1 || unk_1_data_size || 1 ||<br />
|-<br />
| 0x29 || 1 || unk_1_data_flag || 0x4E ||<br />
|-<br />
| 0x2A || 1 || sha1_hash_size || 0x15 ||<br />
|-<br />
| 0x2B || 1 || sha1_hash_flag || 0x48 ||<br />
|-<br />
| 0x2C || 0x14 || sha1_hash || || sha1 hash of the previous blocks (data from 0 of size 0x2A)<br />
|}<br />
<br />
Config storage scripts have in theory a variable size. It is the concatenation of some blocks where the first byte is the length of the body, followed by the body of variable size. Body structure is always the same: 1 byte representing the flag, followed by data of variable size.<br />
<br />
== Usage ==<br />
<br />
Theory by CelesteBlue (untested):<br />
* 0) Begin Transaction<br />
<br />
* 1) Load Script (part 1)<br />
* A) configstorage data is read from SceSyscon memory<br />
* B) configstorage data is sent by SceSyscon to Ernie<br />
* C) Ernie FW checks hash of data and returns xx on success<br />
<br />
if success:<br />
* 2) Load Script (part 2)<br />
* A) configstorage data is read from SceSyscon memory<br />
* B) configstorage data is sent by SceSyscon to Ernie using Load<br />
* C) Ernie FW loads data to memory and executes it<br />
<br />
*6) Commit Transaction<br />
*7) End Transaction<br />
<br />
= Pinout =<br />
<br />
[[File:ernie-package.png|600px|Ernie BGA package.]]<br />
<br />
A candidate package for this chip is Renesas' [https://www.renesas.com/us/en/package-image/pdf/outdrawing/p121f1-50-bal.pdf P121F1-50-BAL-1]. It has the same size and number of pins.<br />
<br />
=== UART ===<br />
<br />
{| class='wikitable'<br />
! Name || Pin || Description<br />
|-<br />
| CTS0 || J7 || UART0 clear to send<br />
|-<br />
| RTS0 || C6 || UART0 request to send<br />
|-<br />
| TX0 || B6 || UART0 transmit<br />
|-<br />
| RX0 || F11 || UART0 receive<br />
|-<br />
| SW0 || A8 || Switch, see [[UART Console#OLED PSVita UART0 location]]<br />
|}<br />
<br />
=== SPI ===<br />
<br />
Main communication with [[Kermit]].<br />
<br />
{| class='wikitable'<br />
! Name || Pin || Description<br />
|-<br />
| SS || A7 || Slave Select (often active low, output from master)<br />
|-<br />
| MISO || A6 || Master In Slave Out (data output from slave)<br />
|-<br />
| MOSI || C7 || Master Out Slave In (data output from master)<br />
|-<br />
| SCLK || B7 || Serial Clock (output from master)<br />
|}<br />
<br />
=== Other ===<br />
<br />
{| class='wikitable'<br />
! Name || Pin || Description<br />
|-<br />
| ? || C11 || [[UDC]] pin 11<br />
|-<br />
| ? || F9 || [[UDC]] pin 12<br />
|-<br />
| ? || G4 || [[UDC]] pin 13<br />
|-<br />
| ? || G8 || [[SN99057]] pin 38<br />
|-<br />
| PWR_SW || G6 || Power switch through two transistor buffers<br />
|}<br />
<br />
= Versions =<br />
<br />
== Hardware Versions ==<br />
<br />
There are three hardware versions of Ernie:<br />
* NEC 78K0R/Kx3-L: present on early PS Vita prototypes (never seen)<br />
* NEC 78K0R/Kx3: present on Fat PS Vita and PS TV models, including some prototypes such as DEM-3000L<br />
* Renesas RL78/G13: present on Slim PS Vita models<br />
<br />
=== NEC 78K0R/Kx3-L ===<br />
<br />
Never seen yet but exists according to Ernie update packages.<br />
<br />
=== NEC 78K0R/Kx3 ===<br />
<br />
NEC D79F0109 (78K0R/KH3, 121 pin)<br />
<br />
Device Name : D79F0109<br />
<br />
Other Device Name : SK0RT02N200GV120 (on DEM-3000L and PCH-1000)<br />
<br />
Label:<br />
<pre><br />
Model <- always D79F0109<br />
Revision <- on DEM-3000H: ES1.0, blank on others<br />
Build <- XXYYZZWWW <- XX: year, YY: week, ZZ: 2 letters (unknown usage), WWW: serial number<br />
Manufacturing country <- always "MALAYSIA"<br />
</pre><br />
<br />
=== Renesas RL78/G13 ===<br />
<br />
Renesas R5F1ZCRK (RL78/G13, 121 pin)<br />
<br />
<pre><br />
R5F1ZCRKABG#U0<br />
R5 Renesas MCU<br />
F Flash<br />
1 RL78<br />
Z Customer specific<br />
C Product group<br />
R 121-pin<br />
K 384KB<br />
A Consumer grade<br />
BG VFBGA 0.4mm<br />
#U0 Tray*2<br />
</pre><br />
<br />
<pre><br />
Device Name : R5F1ZCRK<br />
Device Code : 10 00 06<br />
Firmware Version : V3.03<br />
Code Flash 1 (Address : 0x00000000, Size : 384 K, Erase Size : 1 K)<br />
Data Flash 1 (Address : 0x000F1000, Size : 8 K, Erase Size : 1 K)<br />
</pre><br />
<br />
Label:<br />
<pre><br />
(C) XXXX <- Year<br />
Revision <- A0xxx SCEI<br />
Build <- XXYYZZWWW <- XX: year, YY: week, ZZ: 2 letters (unknown usage), WWW: serial number<br />
Unknown data<br />
</pre><br />
<br />
== Block sizes ==<br />
<br />
Ernie flash memory is erasable in blocks. Size of one block in bytes depends on the hardware version:<br />
* NEC 78K0R/Kx3-L: 0x800<br />
* NEC 78K0R/Kx3: 0x400<br />
* Renesas RL78/G13: 0x400<br />
<br />
See also [https://playstationdev.wiki/psvitadevwiki/index.php?title=Ernie].<br />
<br />
== Software Versions ==<br />
<br />
See also [https://playstationdev.wiki/psvitadevwiki/index.php?title=System_Controller_Firmware].<br />
<br />
Ernie firmware can be partly updated and downgraded with software updates embedded in PUP.<br />
<br />
Ernie firmware is dependant of the hardware version and detects it based on [[KBL Param#Hardware_Info|Hardware Info]].<br />
<br />
=== Examples ===<br />
<br />
With DevKit connected, <code>psp2ctrl info</code> queries return the following results: <br />
<br />
DEM-3000H running FW 0.990:<br />
<source>SysConVersion: 591105</source> -> converted to hexadecimal: 0x00090501 -> 0.9.5.1<br />
<br />
PDEL-1001 running FW 1.692: <br />
<source>SCVersion: 0.9.2.4</source><br />
<br />
PDEL-1001 running FW 3.600-3.680:<br />
<source>SCVersion: 1.0.3.6</source><br />
<br />
=== Downgrade ===<br />
<br />
Syscon is downgradable on DEM/PDEL/PTEL/QAF units. It might also be downgraded on retail when using a downgrade enabler like modoru.<br />
<br />
= Firmware =<br />
<br />
See [[Ernie Firmware]]<br />
<br />
[[Category:Devices]]</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=KBL_Param&diff=20872
KBL Param
2023-12-26T18:38:53Z
<p>CreepNT: /* Boot flags */ Rename internal storage flag</p>
<hr />
<div>The KBL Param buffer (temporary name was sysroot buffer) is a <code>0x100 or 0x200</code> bytes sized buffer passed to the Secure Kernel BootLoader in the scratch space and contains all sorts of flags and system parameters. This buffer is created in [[Second Loader]] copied to [[Secure Kernel]], passed to the Secure and Non-Secure Kernel BootLoaders, and finally to the non-secure kernel. It is used in many functions to check for features that are enabled for the system. The strategy in this buffer is to compute once for all the information that is often used, to share it between all security layers not to have to implement generator code many times, and to implement the generation code in the most secure layer: second_loader (excluding first_loader but that's because first_loader is not updatable and has minimum code).<br />
<br />
== Structure ==<br />
<br />
{| class="wikitable"<br />
! Offset !! Size !! Set by !! Description<br />
|-<br />
| 0x0 || 0x2 || second_loader || Version (usually 1)<br />
|-<br />
| 0x2 || 0x2 || second_loader || Size. Size of this structure. 0x100 or 0x200.<br />
|-<br />
| 0x4 || 0x4 || second_loader || Current Firmware Version<br />
|-<br />
| 0x8 || 0x4 || second_loader || Minimum Firmware Version. Comes from SMI IdStorage leaf.<br />
|-<br />
| 0xC || 0x4 || Unknown || Unknown<br />
|-<br />
| 0x10 || 0x4 || Unknown || Used for Kit Activation. If lower than 0x20, the Kit is fake activated (License Status = 0, Issue No = 0, Expire Date = 0xffffffff). If lower than 0x30, default bus error handler is not registered in [[SceKernelBusError]].<br />
|-<br />
| 0x14 || 0xC || Unknown || maybe unused<br />
|-<br />
| 0x20 || 0x10 || second_loader || [[KBL Param#QA flags|QA flags]]<br />
|-<br />
| 0x30 || 0x10 || second_loader || [[KBL Param#Boot flags|Boot flags]]<br />
|-<br />
| 0x40 || 0x20 || second_loader || [[KBL Param#DIP Switches|DIP Switches]]<br />
|-<br />
| 0x60 || 0x4 || second_loader || DRAM base paddr (0x40000000)<br />
|-<br />
| 0x64 || 0x4 || second_loader || DRAM size (0x20000000 on retail and testkit, 0x40000000 on DevKit in DevKit Memory Size mode)<br />
|-<br />
| 0x68 || 0x4 || Unknown || unk<br />
|-<br />
| 0x6C || 0x4 || second_loader || [[KBL Param#Boot type indicator 1|Boot type indicator 1]]<br />
|-<br />
| 0x70 || 0x10 || second_loader || [[OpenPsId]]. Comes from [[IdStorage]].<br />
|-<br />
| 0x80 || 0x4 || second_loader || <code>secure_kernel.enp</code> raw data paddr (optional)<br />
|-<br />
| 0x84 || 0x4 || second_loader || <code>secure_kernel.enp</code> size (optional)<br />
|-<br />
| 0x88 || 0x4 || second_loader || <code>context_auth_sm.self</code> raw data paddr<br />
|-<br />
| 0x8C || 0x4 || second_loader || <code>context_auth_sm.self</code> size<br />
|-<br />
| 0x90 || 0x4 || second_loader || <code>kprx_auth_sm.self</code> raw data paddr<br />
|-<br />
| 0x94 || 0x4 || second_loader || <code>kprx_auth_sm.self</code> size<br />
|-<br />
| 0x98 || 0x4 || second_loader || <code>prog_rvk.srvk</code> raw data paddr<br />
|-<br />
| 0x9C || 0x4 || second_loader || <code>prog_rvk.srvk</code> size<br />
|-<br />
| 0xA0 || 0x8 || second_loader || [[PsCode]]. Comes from [[IdStorage]].<br />
|-<br />
| 0xA8 || 0x4 || second_loader || __stack_chk_guard. Set by Second Loader to a pseudo random number. Exported by SceSysmem as __stack_chk_guard.<br />
|-<br />
| 0xAC || 0x4 || second_loader || Unknown. Set by Second Loader to a pseudo random number.<br />
|-<br />
| 0xB0 || 0x10 || second_loader || Session ID<br />
|-<br />
| 0xC0 || 0x4 || second_loader || [[KBL Param#Sleep Factor|Sleep Factor]]. Comes from syscon cmd 3.<br />
|-<br />
| 0xC4 || 0x4 || second_loader || [[KBL Param#Wakeup Factor|Wakeup Factor]]. Comes from syscon cmd 0x10.<br />
|-<br />
| 0xC8 || 0x4 || second_loader || Unknown, contains USB info. Comes from syscon cmd 0x800 (?device model dependant?). (ex: 0x40 PSVita usually, 0x60 PSTV usually, 0x64 DEM-3000H, 0x1C0 PC USB -> charge USB on FAT, 0x2D2 PC USB -> USB -> charge USB on FAT, 0x2D3 charge USB on FAT, 0x3D2, 0xC001C0 USB charge on SLIM, 0xC503D2 USB charge on SLIM, 0xC501CA USB data to PC)<br />
|-<br />
| 0xCC || 0x4 || second_loader || [[KBL Param#Boot Controls Info|Boot Controls Info]]. Comes from syscon cmd 0x100.<br />
|-<br />
| 0xD0 || 0x4 || second_loader || <code>suspendinfo_adr</code>. [[Suspend|Resume context]] physical address. Comes from syscon cmd 0x90 offset 0xC.<br />
|-<br />
| 0xD4 || 0x4 || second_loader || [[KBL Param#Hardware Info|Hardware Info]]. Comes from syscon cmd 5.<br />
|-<br />
| 0xD8 || 0x4 || second_loader || [[KBL Param#Power Info|Power Info]]<br />
|-<br />
| 0xDC || 0x4 || Unknown || unk<br />
|-<br />
| 0xE0 || 0x4 || second_loader, SceDriverTzs || If resume, always 0 (second_loader).<br />
|-<br />
| 0xE4 || 0x4 || Unknown || unk<br />
|-<br />
| 0xE8 || 0x10 || second_loader || [[KBL Param#Hardware Info 2|Hardware Info 2]]. Comes from syscon cmd 6.<br />
|-<br />
| 0xF8 || 0x4 || second_loader || BootLoader Revision<br />
|-<br />
| 0xFC || 0x4 || Unknown || KBL Param Magic value (0xCBAC03AA)<br />
|-<br />
| 0x100 || 0x20 || second_loader || Coredump Encrypted Session Key (FW 2.12+)<br />
|}<br />
<br />
== QA flags ==<br />
<br />
The steps to install QA flags on a PS Vita are:<br />
Write Qaf token to NVS at offset 0x400 (0x80-bytes) (tied to Console ID).<br />
Write Qaf token RSA signature to NVS at offset 0x5A0 (0x100-bytes) (only required on firmware 1.80 and above).<br />
Write Qaf version to SNVS sector 0x15.<br />
Clear Qaf inhibit DIP switches 240 and 241 (maybe even more DIP switches inhibit QA flags).<br />
Write Qaf enable flag to NVS at offset 0x480.<br />
Set Qaf ON flag to SNVS mgmt sector.<br />
<br />
The following libraries are available for checking QA Flags<br />
<br />
[[SceSblSsMgr#SceSblQafMgr|SceSblQafMgr]]<br />
<br />
[[SceSysmem#SceSblQafMgrForDriver|SceSblQafMgrForDriver]]<br />
<br />
[[SceVshBridge#SceVshBridge|SceVshBridge]]<br />
<br />
In the following table bytes are counted from left to right and bits from left to right too (little-endian). However the OS uses bit masking for QA flags (unlike bit shifting for DIP Switches).<br />
<br />
{| class="wikitable"<br />
|-<br />
! Byte (0-0xF) - mask = 1 << (bit_no & 7) !! Used in !! Description<br />
|-<br />
| rowspan="2" | Byte 0x0 > Mask 1<br />
| update_service_sm<br />
| rowspan="2" | Skip System Update version check on CEX (but still there Manufacturing mode checks).<br />
|-<br />
| spkg_verifier_sm_w_key_2<br />
|-<br />
| Byte 0x0 > Mask 2 || Unknown || -<br />
|-<br />
| Byte 0x0 > Mask 0x10 || SceNpDrm || Allow Finalized Retail Package on Non CEX unit without StoreFlag.<br />
|-<br />
| Byte 0x0 > Mask 0x20 || Unknown || -<br />
|-<br />
| Byte 0x6 > Mask 1 || Unknown || -<br />
|-<br />
| rowspan="7" | Byte 0x6 > Mask 2<br />
| To check<br />
| Allow Dtcp Ip Reset, Allow NearTest/PSPEmuShowQAInfo (SceVshBridge)<br />
|-<br />
| SceShell<br />
| Allow Fake AC Install, Allow Show Title Upgrade Info, Allow Liblocation Change Model on CEX, Allow ScreenShot Always.<br />
|-<br />
| SceRtc<br />
| Allow something on sceRtcGetCurrentAdNetworkTickForDriver<br />
|-<br />
| SceStoreBrowser<br />
| rowspan="2" | Allow Limited Debug Menu Display<br />
|-<br />
| SceSettings<br />
|-<br />
| SceNpCommon<br />
| Allow Np Full Test<br />
|-<br />
| SceIduUpdate<br />
| Allow Control Idu Auto Update<br />
|-<br />
| Byte 0x6 > Mask 4 || Unknown || -<br />
|-<br />
| Byte 0x6 > Mask 8 || Unknown || -<br />
|-<br />
| Byte 0x7 > Mask 1 || Unknown || -<br />
|-<br />
| Byte 0x7 > Mask 4 || Unknown || -<br />
|-<br />
| Byte 0x8 > Mask 1 || Unknown || -<br />
|-<br />
| Byte 0x8 > Mask 2 || Unknown || -<br />
|-<br />
| Byte 0x8 > Mask 4 || Unknown || -<br />
|-<br />
| Byte 0x8 > Mask 0x10 || Unknown || -<br />
|-<br />
| Byte 0x8 > Mask 0x20 || Unknown || -<br />
|-<br />
| Byte 0x8 > Mask 0x40 || Unknown || -<br />
|-<br />
| Byte 0x9 > Mask 1 || Used on FW 0.931 by SceSblACMgrForKernel_F7524073 || -<br />
|-<br />
| Byte 0xB > Mask 1 || Unknown || Unknown. Maybe to use alternate keyset (internal).<br />
|-<br />
| rowspan="3" | Byte 0xB > Mask 4<br />
| kprx_auth_sm<br />
| Use alternate keyset e.g. QA SPSFO key/NpDrm app key.<br />
|-<br />
| SceAppMgr<br />
| Allow ignore app keystone error.<br />
|-<br />
| SceSblACMgr<br />
| Allow User App Debug.<br />
|-<br />
| rowspan="3" | Byte 0xB > Mask 0x10<br />
| secure_kernel<br />
| Bypass platform (Test/Tool/Diag) requirement for loading of fSELF with attribute 128<br />
|-<br />
| SceSettings<br />
| Allow EMPR via vshSblQafMgrIsAllowLoadMagicGate<br />
|-<br />
| SceDbRecovery<br />
| -<br />
|-<br />
| rowspan="2" | Byte 0xC > Mask 2<br />
| SceSettings<br />
| Allow All Debug Menu Display, Allow RemotePlayDebug<br />
|-<br />
| SceGps<br />
| Allow sceSblACMgrIsSystem bypass<br />
|-<br />
| rowspan="2" | Byte 0xC > Mask 4<br />
| Updater<br />
| Skip version checks in system updates<br />
|-<br />
| compat_sm<br />
| Allow compat_sm operation on DevKit (can be use PspEmu)<br />
|-<br />
| rowspan="17" | Byte 0xD > Mask 1 : Allow Kernel Debug<br />
| To check<br />
| USB Enum Wake Up Debug Menu.<br />
|-<br />
| secure_kernel<br />
| CMeP Debug.<br />
|-<br />
| NSKBL<br />
| logging level set to 0 instead of 1/2, 1 instead of 2<br />
|-<br />
| rowspan="2" | SceSysmem<br />
| Allow printing Syscall Frame info with module name + offset.<br />
|-<br />
| Allow Kernel Debug Level.<br />
|-<br />
| SceDeci4pSDrfp<br />
| Allow starting this module.<br />
|-<br />
| SceDeci4pSCTtyp<br />
| Allow starting this module.<br />
|-<br />
| SceDeci4pSDbgp<br />
| Allow starting this module. Allow call to SceDeci4pSdbgpTest export function.<br />
|-<br />
| SceDeci4pSDfMgr<br />
| Allow dumping the non encrypted .psp2kerndmp<br />
|-<br />
| SceDeci4pLoadp<br />
| Allow load/unload/start/stop Kernel module.<br />
|-<br />
| SceDeci4pDtracep<br />
| Allow disabled NID encode. Allow dtrace sysbreak. Allow all process dtrace. And more.<br />
|-<br />
| SceExcpmgr<br />
| Allow printing module info with module name.<br />
|-<br />
| SceKernelModulemgr<br />
| Allow dump the module load address (printing)<br />
|-<br />
| ScePamgr<br />
| Allow more SyscallTrace flag.<br />
|-<br />
| SceHdmi<br />
| Allow HDCP control by dipsw. Allow HDMI CEC on PS TV Emu.<br />
|-<br />
| SceAudio<br />
| Allow something audio debug control by dipsw.<br />
|-<br />
| SceWlanBt<br />
| Allow enable WlanBt on DEM-3000 (IRT-001) for Non IsTest unit and Non Product Mode<br />
|-<br />
| rowspan="13" | Byte 0xD > Mask 2 : Allow System Debug<br />
| secure_kernel<br />
| Allow to bypass absent Media Type 7 (host0:) in SELF attribute for usermode SELF.<br />
|-<br />
| SceAppMgr<br />
| Dictates if you can pass arguments to sceAppMgrLaunchAppByPathForDriver<br />
|-<br />
| SceSysmodule<br />
| rowspan="4" | Allow Remote Sysmodule Load (host0:)<br />
|-<br />
| SceParty<br />
|-<br />
| SceCommonDialogMain<br />
|-<br />
| SceShell<br />
|-<br />
| SceSysStateMgr<br />
| Allow loading <code>host0:psp2config.rpath</code>.<br />
|-<br />
| SceDeci4pLoadp<br />
| Allow any drive path.<br />
|-<br />
| SceKernelModulemgr<br />
| Allow preloading module path switching by dipsw.<br />
|-<br />
| SceSysLibTrace<br />
| Allow System NID symbol table refer.<br />
|-<br />
| SceSblACMgr<br />
| Allow System App Debug<br />
|-<br />
| SceDeci4pDtracep<br />
| Allow System App dtrace.<br />
|-<br />
| SceVshBridge (stub)<br />
| Allow Marlin Test (SceVshBridge)<br />
|-<br />
| rowspan="7" | Byte 0xE > Mask 1 : Allow Module Debug<br />
| second_loader<br />
| Allow ignore SceKblPara->dipsw.ASLR initialize.<br />
|-<br />
| secure_kernel<br />
| Allow to bypass absent Media Type 7 (host0:) in SELF attribute for Kernel/SM SELF.<br />
|-<br />
| NSKBL<br />
| Allow Force Loading Boot Kernel Module in 100000 times on loadModule function.<br />
|-<br />
| SceSysStateMgr<br />
| Allow loading <code>host0:psp2config.skprx</code>, Allow loading psp2config as plaintext. Allow loading <code>host0:psp2config.rpath</code>.<br />
|-<br />
| SceDeci4pLoadp<br />
| Allow any drive path.<br />
|-<br />
| SceSblPostSsMgr<br />
| Allow Remote SM Loading (host0:), Allow Remote Spfso Auth (host0:), Allow Remote FwLoader path switching by dipsw (host0:module/).<br />
|-<br />
| SceKernelModulemgr<br />
| Allow Remote Kernel module Loading (host0:).<br />
|-<br />
| Byte 0xE - mask 2 || Unknown || Unknown<br />
|-<br />
| rowspan="15" | Byte 0xF > Mask 1<br />
| secure_kernel<br />
| Allow SELF attribute qaf::0xF::1 required<br />
|-<br />
| kprx_auth_sm<br />
| Enable DMAC5 keyset for 0x10001<br />
|-<br />
| update_service_sm<br />
| rowspan="3" | Allow QAUpdate<br />
|-<br />
| spkg_verifier_sm_w_key_2<br />
|-<br />
| SceSblUpdateMgr<br />
|-<br />
| SceSettings<br />
| Minimum Debug Menu Display<br />
|-<br />
| SceCuiSetUpper<br />
| rowspan="4" | Allow Non QAPup on CEX.<br />
|-<br />
| SceSafeMode<br />
|-<br />
| SceSettings<br />
|-<br />
| SceShell<br />
|-<br />
| SceNpDrm<br />
| Allow Debug DRM Loose Bind.<br />
|-<br />
| SceNpCommon<br />
| rowspan="2" | Allow Np Test<br />
|-<br />
| SceShell<br />
|-<br />
| SceRegistryMgr<br />
| Allow more registry keys.<br />
|-<br />
| SceShell<br />
| Allow Keep CoreFile<br />
|-<br />
| rowspan="3" | Byte 0xF > Mask 2 : Allow Force Update<br />
| update_service_sm<br />
| rowspan="3" | Skip the System Update's version checks and Manufacturing mode checks on CEX<br />
|-<br />
| spkg_verifier_sm_w_key_2<br />
|-<br />
| SceSblUpdateMgr<br />
|-<br />
| Any QA flag || act_sm || Infinite Kit activation<br />
|}<br />
<br />
To check: Byte 0xF - mask 1, Byte 0xE - mask 1, Byte 0xE - mask 2, Byte 0xB - mask 0x10: Revocation related.<br />
<br />
Existing QA flag token templates identified thus far:<br />
<br />
* NO_FLAGS: Default value with no QA flag set. Generated upon request on unit by qaf_sm using QAF keyslots set by second_loader, no signature.<br />
<br />
* QAF_QATEAM_MINI_E: QA flags (mini) for QA Team units running External System Software. Set on DevKits.<br />
<br />
* QAF_QATEAM_FULL_E: QA flags (full) for QA Team units running External System Software. Set on Retail and TestKits. Same as QAF_QATEAM_MINI_E but with two more QA flags (Byte 0x0 - mask 0x10 and Byte 0x6 - mask 2) set. These supplementary QA flags allow features like: ScreenShot Always, Np Full Test, Limited Debug Menu Display.<br />
<br />
* QAF_SYS_DEV_I: QA flags (development) for System Software QA units running Internal System Software. Set on Development tools used for system debugging, running Internal firmware. Set on DevKits.<br />
<br />
* QAF_MGVIDEO_DEV_I: QA flags (development) for Magic Gate Video QA units running Internal System Software. Set on DevKits. <br />
Basically the same as QAF_SYS_DEV_I, but with the addition of the AllowMagicGate flag. But the AllowKernelDebug flag is cleared.<br />
<br />
* QAF_MGVIDEO_ADV_I: QA flags (advanced) for Magic Gate Video QA units running Internal System Software. Set on DevKits. <br />
Basically the same as QAF_SYS_DEV_I, but with the addition of the AllowMagicGate flag.<br />
<br />
<source><br />
flags for NO_FLAGS:<br />
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00<br />
flags for QAF_QATEAM_MINI_E: <br />
01 00 00 00 00 00 0D 04 64 00 00 00 04 00 00 03<br />
flags for QAF_QATEAM_FULL_E: <br />
11 00 00 00 00 00 0F 04 64 00 00 00 04 00 00 03<br />
flags for QAF_SYS_DEV_I:<br />
33 00 00 00 00 00 07 05 73 01 00 01 06 03 03 01<br />
flags for QAF_MGVIDEO_DEV_I:<br />
33 00 00 00 00 00 07 05 73 01 00 11 06 02 03 01<br />
flags for QAF_MGVIDEO_ADV_I:<br />
33 00 00 00 00 00 07 05 73 01 00 11 06 03 03 01<br />
</source><br />
<br />
== Boot flags ==<br />
<br />
These Boot flags come from [[Ernie#NVS|Ernie NVS]].<br />
<br />
On FW 3.60, second_loader generates the boot flags as following:<br />
* byte 0 = NVS 0x4A0<br />
* byte 1 = NVS 0x481<br />
* byte 2 = 0<br />
* byte 3 = NVS 0x483<br />
* byte 4 = NVS 0x487<br />
* byte 5 = NVS 0x486<br />
* byte 6-0xF = 0<br />
<br />
Example: FF FF 00 FF FF FF 00 00 00 00 00 00 00 00 00 00<br />
<br />
{| class="wikitable"<br />
|-<br />
! Bit !! Description<br />
|-<br />
| 47 || MCEmu (Use internal <code>ux0</code>)<br />
|}<br />
<br />
* byte 0: 0xFF - not update mode, other value - update step (to detail)<br />
* byte 1: 0xFF - extra UART disabled, 0x00 - extra UART enabled, 0x01 - extra UART enabled only when Jig dongle is connected<br />
* byte 3: 0xFF - not safe mode<br />
* byte 4: 0xFF - unknown, maybe not used on FWs <= 0.995<br />
* byte 5: 0xFF on FAT - no internal storage or on PSTV or SLIM - internal storage enabled, 0xFE on PSTV or SLIM - internal storage disabled, maybe not used on FWs <= 0.995<br />
<br />
== DIP Switches ==<br />
<br />
DIP switches area embeds two parts: Communication Processor information as 32-bit integers, followed by DIP switches stored as bit flags.<br />
<br />
{| class="wikitable"<br />
! Offset !! Size !! Description<br />
|-<br />
| 0x40 || 0x4 || CP Timestamp 1 (ex: 0x4AD86AB3 -> 16/10/2009 14:44:35)<br />
|-<br />
| 0x44 || 0x2 || CP Version (ex: 0x1301 -> 1301 on PDEL-100x)<br />
|-<br />
| 0x46 || 0x2 || CP Board ID (3 on DEM-300xH, 4 on PDEL-100x)<br />
|-<br />
| 0x48 || 0x4 || CP Timestamp 2 (identical as CP Timestamp 1)<br />
|-<br />
| 0x4C || 0x4 || ASLR Seed (?USER flags?) (also set on CEX and DEX) (ex: 0x00000000 on a DEM-300xH)<br />
|-<br />
| 0x50 || 0x4 || SDK (SCE) flags (ex: 0x80000000, 0x80000001, 0x80000003, 0x81000000, 0x81000001, 0, 2)<br />
|-<br />
| 0x54 || 0x4 || Shell flags (ex: 0x00000000 on a DEM-300xH)<br />
|-<br />
| 0x58 || 0x4 || Debug control flags (ex: 0x000413E7 on a DEM-300xH, 0x001453E7 dev mode, 0x00080002 release mode)<br />
|-<br />
| 0x5C || 0x4 || System control flags (ex: 0x2000001C on a DEM-300xH, 0x20000010 dev mode, 0x20000000 release mode)<br />
|}<br />
<br />
=== DIP Switches bit flags resolving ===<br />
<br />
Warning: DIP Switches bit flags actually start at offset 0x10 (before that is CP information), which implies the first bit flag number is 128 (bit_num = offset / 8).<br />
<br />
DIP Switches bit flags follow little-endian logic, which makes it hard to visualize in commonly used big-endian hexadecimal:<br />
* ((uint32_t *)kbl_param->dipsw[0x10])[0] = 0x00000001 (big-endian in hex) = 01 00 00 00 (little-endian in hex) = 10000000 00000000 00000000 00000000 (little-endian in base 2) <- the 1 corresponds to bit flag number 128<br />
* ((uint32_t *)kbl_param->dipsw[0x10])[0] = 0x00000002 (big-endian in hex) = 02 00 00 00 (little-endian in hex) = 01000000 00000000 00000000 00000000 (little-endian in base 2) <- the 1 corresponds to bit flag number 129<br />
* ((uint32_t *)kbl_param->dipsw[0x10])[0] = 0x00000100 (big-endian in hex) = 00 01 00 00 (little-endian in hex) = 00000000 10000000 00000000 00000000 (little-endian in base 2) <- the 1 corresponds to bit flag number 136<br />
* ((uint32_t *)kbl_param->dipsw[0x10])[0] = 0x80000000 (big-endian in hex) = 00 00 00 80 (little-endian in hex) = 00000000 00000000 00000000 00000001 (little-endian in base 2) <- the 1 corresponds to bit flag number 159<br />
<br />
As you can see this way is not convenient to know in memory on which byte corresponds which bit flag, so instead we can use a formula to convert bit number to offset and bit: <code>offset = (bit_num / 32) * 4</code>, <code>bit = bit_num & 31</code>. This is used for example in the following code:<br />
<source lang="C"><br />
SceBool sceKernelCheckDipswForDriver(SceUInt32 no) {<br />
return (*(SceUInt32 *)(kbl_param->dipsw + (no >> 5) * 4) >> (no & 31)) & 1;<br />
}<br />
</source><br />
<br />
=== CP Information ===<br />
<br />
Bits <code>0-31</code> is a 32-bit integer of the current time on the CP clock. This is duplicated in bits <code>64-95</code>.<br />
<br />
Bits <code>32-47</code> is a 16-bit integer of the CP version and bits <code>48-63</code> is a 16-bit integer of the CP board ID. All integers are little-endian. On units that do not have a CP, these fields are zeroes.<br />
<br />
Bits <code>96-127</code> is 32-bit integer ASLR seed that is randomized on each boot in second loader. It can be disabled by setting a specific DIP switch or QA flag byte 0xE mask 1.<br />
<br />
Bits <code>0-63</code> are also manipulable as general purpose DIP Switches exposed with <code>sceKernelSetDipsw</code>, <code>sceKernelClearDipsw</code>, and <code>sceKernelCheckDipsw</code> but these functions do not change anything in hardware (only cached values are overwritten in [[SceSysmem]]).<br />
<br />
According to SDK only DIP Switches 0-63 are accessible from usermode, however:<br />
* On FW 0.990 (but not on FW 0.931 nor 3.60), DIP Switch number 237 is the only one out of range 0-63 that can be set from usermode.<br />
* Usermode SELFs can use DIP Switches number > 63 if they have a special attribute or capability in SELF Auth Info.<br />
<br />
=== SDK (SCE) flags ===<br />
<br />
Bits <code>128-159</code> are used for DevKit Boot Parameters.<br />
<br />
{| class="wikitable"<br />
! Bit !! Name !! Description<br />
|-<br />
| 128 || memory_size_switch || Memory Size. Console Size: 1 - Development Tool Size: 0. (Extended game memory)<br />
|-<br />
| 129 || release_check_mode_console || Release Mode Console. On: 1 - Off: 0<br />
|-<br />
| 152 || platform_emulation_dolce || PS TV Emulation. On: 1 - Off: 0<br />
|-<br />
| 159 || development_mode || Release Check Mode. Development Mode: 1 - Release Mode: 0<br />
|}<br />
<br />
=== Shell flags ===<br />
<br />
Bits <code>160-191</code> are used for [[SceShell]] flags.<br />
<br />
dipsw 190 is ignored if dipsw 191 is on.<br />
<br />
Turning on dipsw 191 and 213 at the same time can cause physical address conflicts.<br />
<br />
{| class="wikitable"<br />
! Bit !! Name !! Description<br />
|-<br />
| 168 || || Memory Size.<br />
|-<br />
| 184 || enable_extra_tty || Enable extra TTY: On: 1 - Off: 0. (tty7:)<br />
|-<br />
| 185 || || Enable System Boot Time Notifications: On: 1 - Off: 0<br />
|-<br />
| 186 || || Related to SceShellCronCallback.<br />
|-<br />
| 187 || || Allow processes to run on all cores (CPU affinity): On: 1 - Off: 0<br />
|-<br />
| 190 || || Disable to ScePhyMemPartShellDummy with PA 0x78000000 0x8000000-bytes.<br />
|-<br />
| 191 || || Grow PhyMemPart with PA 0x78000000 0x8000000-bytes. Shell += 48MiB, Shared += 80MiB.<br />
|}<br />
<br />
=== Debug control flags ===<br />
<br />
Bits <code>192-223</code> are for various debug options.<br />
<br />
{| class="wikitable"<br />
! Bit !! Description<br />
|-<br />
| 192 || Enable Dmac6.<br />
|-<br />
| 193 || Enable SDbgSdio, deci4p_sdfmgr, deci4p_sttyp<br />
|-<br />
| 194 || Enable User DECI. Enables Cpup, [[SceDbgSdio]], [[SceDbgUsb]] and dtrace module start. Force UnloadProcessModules on Process Delete.<br />
|-<br />
| 195 || Disable USB Debug. nouse_dbgusb (if enabled, [[SceDbgUsb]] does not init).<br />
|-<br />
| 196 || Enable kernel/NSKBL UART0 console logging (if enabled, UART0 is initialized and SceDebug handlers are set to UART0 functions). Or disable remote power control.<br />
|-<br />
| 197 || Enable kernel/NSKBL UART1 console logging: On: 1 - Off: 0<br />
|-<br />
| 198 || Enable System TTY: On: 1 - Off: 0. See [[SceDeci4pSTtyp]].<br />
|-<br />
| 199 || Enable TTY stdio ("tty0:"): On: 1 - Off: 0<br />
|-<br />
| 200 || Stop when an assertion fails: On: 1 - Off: 0<br />
|-<br />
| 201 || Set minimum assertion level to 1: On: 1 - Off: 0. Used in [[SceSysmem]].<br />
|-<br />
| 202 || Set minimum assertion level to 2: On: 1 - Off: 0. Used in [[SceSysmem]].<br />
|-<br />
| 204 || Set minimum log level to 1: On: 1 - Off: 0. Used in [[NSKBL]] and [[SceSysmem]].<br />
|-<br />
| 205 || Set minimum log level to 2: On: 1 - Off: 0. Used in [[NSKBL]] and [[SceSysmem]].<br />
|-<br />
| 206 || Allow syscall debug. Used in [[SceKernelThreadMgr]].<br />
|-<br />
| 210 || SCE_DIPSW_ENABLE_TOOL_PHYMEMPART. Allow Kernel Budget (Enable Devkit 512MiB DRAM): On: 1 - Off: 0<br />
|-<br />
| 211 || Enable usermode UART console logging: On: 1 - Off: 0. Enables [[SceTty2uart]]. Used in [[SceCoredump]].<br />
|-<br />
| 212 || Enable PA memory mapping for usermode. Used in NSKBL and [[SceSysmem]], [[ScePamgr]]. Works with dipsw 213.<br />
|-<br />
| 213 || PA memory mapping address. 1 to use PA 0x78000000 0x8000000-bytes. 0 to use PA 0x80000000 0x20000000-bytes. Used in NSKBL and [[SceSysmem]], [[ScePamgr]]. Works with dipsw 212.<br />
|-<br />
| 214 || Disable ASLR: Disabled: 1 - Enabled: 0.<br />
|-<br />
| 215 || Disable DECI4P System Debug process Trace: Disabled: 1 - Enabled: 0.<br />
|-<br />
| 216 || Wipe kernel stack by 0xFF: On: 1 - Off: 0.<br />
|-<br />
| 217 || Enable path logging: On: 1 - Off: 0. Used in [[SceIofilemgr]]. If set, [[SceKernelThreadMgr]] sets kernel thread stack size to 0x4000-bytes instead of 0x1000-bytes.<br />
|-<br />
| 218 || Ignore app keystone error in [[SceAppMgr]]: On: 1 - Off: 0.<br />
|-<br />
| 222 || Enable KBL Simple Memory Test over ScePowerScratchPad32KiB: On: 1 - Off: 0. See [[Physical Memory]], [[SKBL]].<br />
|-<br />
| 223 || Enable KBL Simple Memory Test over Secure DRAM: On: 1 - Off: 0. See [[Physical Memory]], [[SKBL]].<br />
|}<br />
<br />
=== System control flags ===<br />
<br />
Bits <code>224-255</code> are used for various system options.<br />
<br />
{| class="wikitable"<br />
! Bit !! Description<br />
|-<br />
| 224 || <code>SCE_DIPSW_PSP2_CONFIG_SD</code> Enable sdbgp's sysmemChecker. Allow plain psp2-config. Allows loading sd0:psp2-config.txt.<br />
|-<br />
| 225 || L2 Cache Disabled? (0 = L2 Cache ON, 1 = L2 Cache OFF). Used in [[SceSysmem]], NSKBL when doing something with exception stacks<br />
|-<br />
| 228 || Enables hardware break/watch point. Used in SKBL, [[SceProcessmgr]] and [[SceKernelThreadMgr]]. [[SKBL]] seems to enable/disable unknown devices. [[SceKernelThreadMgr]] copies some process info to SceKernelThreadObject related to breakpoints.<br />
|-<br />
| 229 || HDCP enable/disable. Used in [[SceAudio]].<br />
|-<br />
| 230 || Enable initialization of sd0 and ur0. Used in [[SceExfatfs]], ?[[SceIofilemgr]]?.<br />
|-<br />
| 231 || Enable initialization of os0. Used in [[SceExfatfs]], [[SceIofilemgr]].<br />
|-<br />
| 232 || ? Used in [[second_loader]]. DIP Switches 232, 240 and 241 are related.<br />
|-<br />
| 233 || Used in [[SceSdstor]] on System Software version 1.50.<br />
|-<br />
| 236 || GPU overclock. When enabled, GPU and GPU Xbar are overclocked from 111MHz to 166MHz.<br />
|-<br />
| 237 || Probably underclock/overclock related. On FW 0.990 (but not on FW 0.931 nor 3.60), this is the only DIP switch out of range 0-63 that can be set from usermode.<br />
|-<br />
| 238 || Underclock. When enabled, something is underclocked from 222MHz to 111MHz.<br />
|-<br />
| 239 || Underclock/overclock related.<br />
|-<br />
| 240 || Disable QA flags. Used in [[second_loader]]. DIP Switches 232, 240 and 241 are related.<br />
|-<br />
| 241 || Disable QA flags 0xD mask 1 and 0xE mask 1. Used in [[second_loader]]. DIP Switches 232, 240 and 241 are related.<br />
|-<br />
| 250 || Enable "tty0:"<br />
|-<br />
| 251 || Enable "dummytty0:". Also allow sysmodule load from <code>host0:</code> (SceSysmodule debug).<br />
|-<br />
| 252 || Allow host0: access. Used in [[SceSysStateMgr]], [[SceSblFwLoader]].<br />
|-<br />
| 253 || Enable some console logging: On: 1 - Off: 0. Used in [[NSKBL]].<br />
|}<br />
<br />
== Boot type indicator 1 ==<br />
<br />
We ignore the official name so we name it Boot type indicator 1.<br />
<br />
* 0x1: external boot mode. It is used in manufacture image to boot in external mode. It cannot be set in release second_loader.<br />
* 0x2: SKBL has been loaded from GCSD<br />
* 0x4: product mode. manufacturing mode (Mgmt bit 0)<br />
* 0x8: seems to be never set in release second_loader. Required by FW 0.931 SKBL to perform memory tests.<br />
* 0x40: use special Media Type. Never set in release second_loader. Used in NSKBL when loading modules from sd0:.<br />
* 0x10000: jig handshake5 status, bypasses current system software version checks<br />
* 0x20000: resume mode. Disables boot logo display.<br />
* 0x40000: manufacturing mode (Mgmt bit 0) and GCSD initialized (for mounting sd0:) by second_loader using [[Ernie]] command 0x888.<br />
* 0x80000: sd mode (Mgmt bit 1). [[SceExfatfs]] checks this flag before mounting sd0:.<br />
<br />
== Sleep Factor ==<br />
<br />
This is a guessed name.<br />
<br />
Used in [[SceSysmem#sceKernelSysrootIsUsbEnumWakeupForKernel]].<br />
<br />
* 1 bsod reboot (or other serious factors)<br />
* 4 seen on a DEM-3000G running System Software 0.930.010<br />
* 0x10 bsod poweroff<br />
* 0x60 seen on a PCH-11xx<br />
* 0x400 seen on a PCH-1xxx in Manufacturing mode<br />
* 0x20000 unknown<br />
<br />
== Wakeup Factor ==<br />
<br />
Wakeup Factor is only 2 bytes but to preserve alignment, in KBL Param it is extended to 4 bytes.<br />
<br />
*00 00 00 00 coldboot on a DEM-3000H<br />
*01 XX XX XX unknown<br />
*04 00 00 00 reboot<br />
*0E XX XX XX related to USB Enum Wakeup(maybe devkit)<br />
*0F 00 00 00 USB Enum Wakeup<br />
*14 00 00 00 boot with power hold<br />
*00 FF 00 00 maybe coldboot<br />
*04 FF 00 00 reboot<br />
*14 FF 00 00 boot with power hold<br />
*16 FF 00 00 boot by charge cable<br />
*17 XX 00 00 BSOD reboot<br />
*80 00 00 00 after suspend<br />
<br />
Deduction:<br />
* 1: Maybe do not show lock screen<br />
* 2: USB enum wakeup<br />
* 4: reboot<br />
* 0x8: BSOD<br />
* 0xB: goes to safe mode<br />
* 0x10: anormal boot<br />
* 0x1F: goes to safe mode<br />
* 0x20: unknown<br />
<br />
{| class="wikitable"<br />
|+ Wakeup factor bits description<br />
|-<br />
! Bitmask !! Usage !! Notes<br />
|-<br />
| 0xFF00 || Unknown || ?battery related?<br />
|-<br />
| 0x0080 || Resume flag || Set when unit is resuming<br />
|-<br />
| 0x007F || Wakeup reason || Indicates why the unit has been powered on. May be a bitflag or an enumeration.<br />
|}<br />
<br />
== Boot Controls Info ==<br />
<br />
This information can be parsed the same way as in [[SceSyscon#Types|SceSysconControl]].<br />
<br />
Keys combo:<br />
* Enter Safe mode: Power + PS + R<br />
* Rebuild Database: Power + PS + R + (Square or Cross)<br />
* Set Production Mode On for Prototype: Power + PS + Square + Cross + Up + Left<br />
* Set Production Mode On: Power + PS + R + Square + Cross (not present on FW 0.931, present on FWs 0.940+)<br />
<br />
Note:<br />
* Set Production Mode On combos are not needed on genuine PSTV in Wakeup Factor flag 0x20 and are only checked when Wakeup Factor flags 0xB or 0x20 are set.<br />
* Set Production Mode On requires Jig connected else it fails with error 0x800F0A05 on set_pm STEP 8657.<br />
<br />
== Hardware Info ==<br />
<br />
Hardware Info is got from [[Ernie#CMD_0x0005_-_GetHardwareInfo|Ernie]].<br />
<br />
It can be obtained using [[SceSyscon#sceSysconGetHardwareInfoForDriver]]. It can also be seen in the packet header in [[Syscon Update]].<br />
<br />
The following list is ordered by [[Ernie]] version, that should approximately match the hardware revision order.<br />
<br />
* 0x00101003: supports FW 0.931.010<br />
* 0x00102003: supports FW 0.931.010<br />
* 0x00314000: supports FW 0.931.010<br />
* 0x00102403: supports FW 0.931.010-1.692.000<br />
* 0x00315000: certainly DEM-3000G (IRT-001), supports FW 0.931.010-1.692.000<br />
* 0x00102603: supports FW 0.940.000-3.680.011<br />
* 0x00315200: certainly DEM-3000H (IRT-001), supports FW 0.940.000-1.692.000<br />
* 0x00411000: supports FW 0.990.030-1.692.000, Product Sub Code 7, 9 or 0xA probably<br />
* 0x00414000: DEM-3000K (IRT-002), supports FW 0.990.030-1.692.000, Product Sub Code 9<br />
* 0x00415000: DEM-3000L (IRT-002), supports FW 0.995.070-1.692.000, Product Sub Code 0xB<br />
* 0x00415200: certainly DEM-3000P (IRT-002), supports FW 0.996.070-3.680.011, Product Sub Code 0xC probably<br />
* 0x00416000: PDEL-10XX, DEM-3000JEC third revision (IRT-002), supports FW 1.000-3.730, Product Sub Code 0xF, 0x10<br />
* 0x00404000: unknown DEX model, CEM-3000, supports FW 0.990-1.692.000<br />
* 0x00404100: unknown DEX model, CEM-3000, supports FW 0.990-1.692.000<br />
* 0x00404400: unknown DEX model, CEM-3000, supports FW 0.990-1.692.000<br />
* 0x00404600: DEX model, CEM-3000NE2, supports FW 0.990-1.692.000<br />
* 0x00404800: unknown DEX model, supports FW 1.660-1.692.000<br />
* 0x00405000: unknown DEX model, supports FW 1.660-3.720<br />
* 0x00405200: unknown DEX model, supports FW 1.660-3.720<br />
* 0x00406000: PCH-10XX / PTEL-10XX (Product Sub Code 0x10) (IRS-002 without 3G PCIe); ?CEM-3000VP1? / CEM-3000NP1 / TEFV-1000PV1 (Product Sub Code 0xF) -> supports FW 1.000-3.740<br />
* 0x00406002: PCH-11XX (IRS-002 with 3G PCIe), supports FW 1.040-3.740<br />
* 0x0051XXXX: Prototype PS TV.<br />
* 0x00601000: unknown TOOL/DEX/CEX model (IRS-1001), supports FW 1.800-3.740<br />
* 0x00602000: unknown DEX/CEX model (IRS-1001), supports FW 1.800-3.740<br />
* 0x00603000: unknown DEX/CEX model (IRS-1001), supports FW 1.800-3.740<br />
* 0x00603200: PCH-10XX / PCH-11XX (IRS-1001), supports FW 1.800-3.740<br />
* 0x00703000: CEM-3000P01 (DOL-1001), supports FW 2.500-3.740<br />
* 0x00703030: VTE-10XX (DOL-1001), supports FW 2.500-3.740<br />
* 0x00805038: PCH-20XX / PTEL-20XX (USS-1001), supports FW 2.500-3.740<br />
* 0x00723030: VTE-10XX (DOL-1002), supports FW 3.300-3.740<br />
* 0x00822238: PCH-20XX (USS-1002), supports FW 3.500-3.740<br />
* 0x0090XXXX: Unknown prototype.<br />
<br />
=== Bytes meaning ===<br />
<br />
As PS Vita uses little-endian, we describe here in the same order, from the lowest to the highest.<br />
<br />
==== First byte ====<br />
<br />
This byte indicates the presence of some components. It works by bit flags:<br />
* 0x01: ?has SD card reader? (some DevKits and prototypes)<br />
* 0x02: has WWAN (3G modem). This is what SceBbmc checks to know if 3G modem is supported.<br />
* 0x04: unknown<br />
* 0x08: ?has microUSB? (Slim only)<br />
* 0x10: is MC emu capable (Slim and PS TV only). MC Emulation is done by partitionning the internal memory [[EMMC]].<br />
* 0x20: has hw_info_2 (Slim and PS TV only)<br />
* 0x40: is Show mode<br />
* 0x80: is IDU mode<br />
<br />
==== Second byte ====<br />
<br />
This byte indicates the motherboard minor version. It is relative to the motherboard main version which is indicated by third byte.<br />
<br />
==== Third byte ====<br />
<br />
This byte indicates the motherboard main version:<br />
* 10 -> unknown prototype motherboard, has Syscon, maybe IRS-001<br />
* 31 -> IRT-001<br />
* 40 -> IRS-002<br />
* 41 -> IRT-002<br />
* 51 -> PS TV prototype motherboard<br />
* 60 -> IRS-1001<br />
* 70 -> DOL-1001<br />
* 72 -> DOL-1002<br />
* 80 -> USS-1001<br />
* 82 -> USS-1002<br />
* 90 -> unknown prototype motherboard<br />
<br />
We can also guess that flag 1 means that the console has a Communication Processor.<br />
<br />
==== Fourth byte ====<br />
<br />
This byte is reserved in case 3 bytes becomes not enough to handle all Hardware Info:<br />
* 00 -> default, unused<br />
<br />
== Power Info ==<br />
<br />
=== Experimental point of view ===<br />
- No AC connected + No POWER Button pressed: 0x0<br />
<br \>ex: rebooting by software PSVita when AC is not connected<br />
<br />
- No AC connected + POWER Button pressed: 0x4<br />
<br \>ex: booting PSVita by pressing POWER button when AC is not connected<br />
<br />
- AC connected + No POWER Button pressed: 0x8<br />
<br \>ex: rebooting by software PSVita when AC is connected<br />
<br \>ex: autobooting PSTV/IDU PSVita by pluging AC<br />
<br />
- AC connected + POWER Button pressed: 0xC<br />
<br \>ex: powering off by software PSTV then booting it by pressing POWER button<br />
<br \>ex: booting PSVita by pressing POWER button when AC is connected<br />
<br />
=== Bit flags point of view ===<br />
<br />
{| class="wikitable"<br />
! Bit !! Description<br />
|-<br />
| 0 || AC: connected: 1 - disconnected: 0 (note that PSTV always has AC connected)<br />
|-<br />
| 1 || POWER button: pressed: 1 - not pressed: 0<br />
|}<br />
<br />
== Hardware Info 2 ==<br />
<br />
Hardware Info 2 is supported since System Software version 2.10. It is an extension to [[#Hardware Info|Hardware Info]]<br />
<br />
Hardware Info 2 is got from [[Ernie|Ernie]] command 6.<br />
<br />
It can be obtained using [[SceSyscon#sceSysconGetHardwareInfo2ForDriver]].<br />
<br />
{| class="wikitable"<br />
! Bit !! Description<br />
|-<br />
| 1 (0x2) || unknown<br />
|-<br />
| 4 (0x8) || Related to display<br />
|-<br />
| 5 (0x20) || unknown<br />
|-<br />
| 6 (0x40) || Conexant Codec IC (1 = present, 0 = not present)<br />
|-<br />
| 7 (0x80) || unknown<br />
|-<br />
| 14 (0x4000) || unknown<br />
|}<br />
<br />
Seen values:<br />
* 0 on a Fat PS Vita with IRS-002<br />
* 7 on a Slim PS Vita with USS-1001<br />
* 0x247 on a Slim PS Vita with USS-1002<br />
<br />
== Types ==<br />
<br />
<source lang="C"><br />
typedef struct SceDIPSW {<br />
uint32_t cp_timestamp_1;<br />
uint16_t cp_version;<br />
uint16_t cp_build_id;<br />
uint32_t cp_timestamp_2;<br />
uint32_t aslr_seed;<br />
uint32_t sce_sdk_flags;<br />
uint32_t shell_flags;<br />
uint32_t debug_control_flags;<br />
uint32_t system_control_flags;<br />
} SceDIPSW;<br />
<br />
typedef struct SceKblParam {<br />
uint16_t version;<br />
uint16_t size;<br />
uint32_t current_fw_version;<br />
uint32_t min_fw_version;<br />
uint32_t unk_C;<br />
uint32_t unk_10;<br />
uint8_t unk_14[0xC];<br />
uint8_t qa_flags[0x10];<br />
uint8_t boot_flags[0x10];<br />
SceDIPSW dipsw;<br />
SceKernelPARange dram;<br />
uint32_t unk_68;<br />
uint32_t boot_type_indicator_1;<br />
SceOpenPsId openpsid;<br />
SceKernelPARange secure_kernel_enp;<br />
SceKernelPARange context_auth_sm_self;<br />
SceKernelPARange kprx_auth_sm_self;<br />
SceKernelPARange prog_rvk_srvk;<br />
ScePsCode pscode;<br />
uint32_t __stack_chk_guard;<br />
uint8_t unk_AC[4];<br />
uint8_t session_id[0x10];<br />
uint32_t sleep_factor;<br />
uint32_t wakeup_factor;<br />
uint32_t unk_C8;<br />
uint32_t boot_controls_info;<br />
uint32_t resume_context_paddr;<br />
uint32_t hardware_info;<br />
uint32_t power_info;<br />
uint8_t unk_DC[0xC];<br />
uint8_t hardware_info_2[0x10];<br />
uint32_t bootldr_revision;<br />
uint32_t magic;<br />
uint8_t coredump_session_key[0x20];<br />
uint8_t unused[0xE0];<br />
} __attribute__((packed)) SceKblParam;<br />
</source><br />
<br />
[[Category:Cmep]]<br />
[[Category:ARM]]<br />
[[Category:Startup]]<br />
[[Category:Kernel]]<br />
[[Category:Formats]]</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=Ernie&diff=20871
Ernie
2023-12-26T17:55:59Z
<p>CreepNT: /* NVS */ Add note for NVS 0x486</p>
<hr />
<div>Ernie is the codename for the Syscon chip. The Syscon is for exemple responsible for handling button input (including power button), reading/writing to non-volatile storage (NVS) for storing system flags (mostly encrypted and signed). For example IDU flag is stored in NVS. Syscon is also responsible for maintaining the physical address to the resume buffer during [[Suspend]]. Communication between [[Kermit]] and Syscon is mainly through SPI (see [[SceSyscon]]) but there are also some GPIO pins connecting the two. The chip model is NEC/Renesas <code>uPD79F0109</code> and is likely custom designed for Sony.<br />
<br />
See also: [[Ernie Secure]]<br />
<br />
= Boot Process =<br />
<br />
The following is logged from boot. The timestamp is in seconds (the starting time is irrelevant). The arrow at the start indicates direction: '>' means Kermit to Syscon (MOSI) and '<' means Syscon to Kermit (MISO). Then there is a 2 byte command id or response code, followed by a flag byte (response only), the payload, a [[#Packet checksum|checksum byte]], and an (response only) unknown byte. Please note that the packets are listed in transfer order but this may not represent the logical order of the packets. It is currently unknown what the logical order should be, but one can guess that a response is "close to" a request.<br />
<br />
First some version information seems to be sent from Syscon to Kermit. This is same for cold boot and resume boot. The last response indicates the type of boot where 0xFF80 is resume and 0xFF14 is regular boot.<br />
<br />
<pre><br />
< [2.048118000000000] 0x0004, flags=00, payload=[0D 06 00 01 | ....], chk=0xE1, unk=0x00<br />
> [2.048118000000000] 0x0001, payload=[ | ], chk=0xFD<br />
< [2.048659583333333] 0x0004, flags=00, payload=[00 60 40 00 | .`@.], chk=0x55, unk=0x00<br />
> [2.048659583333333] 0x0005, payload=[ | ], chk=0xF9<br />
< [2.049330083333333] 0x0004, flags=00, payload=[32 30 31 32 31 31 30 38 31 37 30 34 | 201211081704], chk=0x92, unk=0x00<br />
> [2.049330083333333] 0x0002, payload=[ | ], chk=0xFC<br />
< [2.054004333333333] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x30<br />
> [2.054004333333333] 0x0080, payload=[12 00 | ..], chk=0x6A<br />
< [2.058172916666666] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x30<br />
> [2.058172916666666] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.062716333333333] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x30<br />
> [2.062716333333333] 0x0080, payload=[12 00 | ..], chk=0x6A<br />
< [2.111457750000000] 0x0004, flags=00, payload=[14 FF | ..], chk=0xE4, unk=0x32<br />
</pre><br />
<br />
Next some encrypted session is established. A 8 byte nonce is sent from Syscon (it appears random for each boot, cold or warm). Encrypted data from this point on always differs each boot.<br />
<br />
<pre><br />
> [2.111457750000000] 0x0010, payload=[ | ], chk=0xEE<br />
< [2.133389000000000] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0xFF<br />
> [2.133389000000000] 0x00A0, payload=[30 00 00 0B 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | 0.......................................], chk=0xFB<br />
< [2.150567250000000] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0xFF<br />
> [2.150567250000000] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.155149500000000] 0x0024, flags=00, payload=[30 01 00 0B 00 00 00 00 A4 B0 EF 23 D6 9A 3A 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | 0..........#..:.........................], chk=0x5F, unk=0x00<br />
> [2.155149500000000] 0x00A0, payload=[30 00 00 0B 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | 0.......................................], chk=0xFB<br />
< [2.163572000000000] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x01<br />
> [2.163572000000000] 0x00A0, payload=[30 02 00 0B 01 00 00 00 6C 7F E0 79 AA 03 4B B0 96 B7 42 F0 BC F8 62 7A 35 27 53 68 3D 0D ED A7 13 F2 32 77 46 2D 54 F8 | 0.......l..y..K...B...bz5'Sh=.....2wF-T.], chk=0x9B<br />
< [2.189271166666667] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x01<br />
> [2.189271166666667] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.193866583333334] 0x0024, flags=00, payload=[30 03 00 0B 00 00 00 00 7A 44 6E C8 F5 FA 35 CB 9B E9 E6 A0 B6 5C 85 1D FB A8 89 5C 9C 04 0B 29 34 59 55 EB 1D 98 AB 83 | 0.......zDn...5......\.....\...)4YU.....], chk=0xC6, unk=0x00<br />
> [2.193866583333334] 0x00A0, payload=[30 02 00 0B 01 00 00 00 6C 7F E0 79 AA 03 4B B0 96 B7 42 F0 BC F8 62 7A 35 27 53 68 3D 0D ED A7 13 F2 32 77 46 2D 54 F8 | 0.......l..y..K...B...bz5'Sh=.....2wF-T.], chk=0x9B<br />
</pre><br />
<br />
Some more data is exchanged. Up until this point all the plaintext payloads appear to be the same from coldboot and warmboot.<br />
<br />
<pre><br />
< [2.202246333333334] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x03<br />
> [2.202246333333334] 0x088E, payload=[01 22 | ."], chk=0x43<br />
< [2.206411750000000] 0x0004, flags=00, payload=[ | ], chk=0xF9, unk=0x03<br />
> [2.206411750000000] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.217062666666667] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x03<br />
> [2.217062666666667] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.221620916666667] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x03<br />
> [2.221620916666667] 0x088E, payload=[01 22 | ."], chk=0x43<br />
< [2.229805500000000] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x03<br />
> [2.229805500000000] 0x1082, payload=[80 04 08 | ...], chk=0xDD<br />
< [2.233887583333333] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x03<br />
> [2.233887583333333] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.238363416666667] 0x0024, flags=00, payload=[FF FF FF FF 01 FF FF FF | ........], chk=0xD7, unk=0x44<br />
> [2.238363416666667] 0x1082, payload=[80 04 08 | ...], chk=0xDD<br />
< [2.246473916666667] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0xFF<br />
</pre><br />
<br />
Now, there appears to be a branch. The next sequence only shows up for cold boots.<br />
<br />
<pre><br />
> [2.246473916666667] 0x1082, payload=[A0 04 01 | ...], chk=0xC4<br />
< [2.250555000000000] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0xFF<br />
> [2.250555000000000] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.255030833333334] 0x0024, flags=00, payload=[FF | .], chk=0xD9, unk=0x00<br />
> [2.255030833333334] 0x1082, payload=[A0 04 01 | ...], chk=0xC4<br />
< [2.259176583333333] 0x0004, flags=00, payload=[01 01 13 00 | ....], chk=0xE0, unk=0xFF<br />
> [2.259176583333333] 0x1100, payload=[ | ], chk=0xED<br />
< [2.263720583333333] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x01<br />
> [2.263720583333333] 0x00D0, payload=[30 00 00 0F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | 0.......................................], chk=0xC7<br />
< [2.267827000000000] 0x0004, flags=00, payload=[ | ], chk=0xF9, unk=0x01<br />
> [2.267827000000000] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.278339666666667] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x01<br />
> [2.278339666666667] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.282830833333333] 0x0024, flags=00, payload=[30 01 00 0F 00 00 00 00 E1 CA 65 96 BB 7E 81 7A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | 0.........e..~.z........................], chk=0x97, unk=0x00<br />
> [2.282830833333333] 0x00D0, payload=[30 00 00 0F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | 0.......................................], chk=0xC7<br />
< [2.291023500000000] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x01<br />
> [2.291023500000000] 0x00D0, payload=[30 02 00 0F 01 00 00 00 4E D7 C0 7C D5 E8 BB D7 3E 9E 43 7B B2 E3 4D 81 23 C8 C4 BF B8 4D 9B 25 0A 3D C7 45 E6 0D 23 43 | 0.......N..|....>.C{..M.#....M.%.=.E..#C], chk=0x38<br />
< [2.295129250000000] 0x0004, flags=00, payload=[ | ], chk=0xF9, unk=0x01<br />
> [2.295129250000000] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.305641750000000] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x01<br />
> [2.305641750000000] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.310132916666667] 0x0024, flags=00, payload=[30 03 00 0F 00 00 00 00 5B 3E 5C 5F 11 F9 E4 6A 85 0D 1E 06 9E F9 33 25 9B 95 55 21 39 48 FC 55 C7 BF A7 E4 32 AD FC 65 | 0.......[>\_...j......3%..U!9H.U....2..e], chk=0x55, unk=0x00<br />
> [2.310132916666667] 0x00D0, payload=[30 02 00 0F 01 00 00 00 4E D7 C0 7C D5 E8 BB D7 3E 9E 43 7B B2 E3 4D 81 23 C8 C4 BF B8 4D 9B 25 0A 3D C7 45 E6 0D 23 43 | 0.......N..|....>.C{..M.#....M.%.=.E..#C], chk=0x38<br />
< [2.318358166666667] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x03<br />
> [2.318358166666667] 0x00D0, payload=[30 04 00 0F 00 00 00 00 52 8D 6D BC 90 C9 00 EE FA CA 47 63 10 D1 4A E5 5A FD BB 91 3A 6C DA EF 64 CA 71 01 4A A9 D5 31 | 0.......R.m.......Gc..J.Z...:l..d.q.J..1], chk=0x4B<br />
< [2.322464250000000] 0x0004, flags=00, payload=[ | ], chk=0xF9, unk=0x03<br />
> [2.322464250000000] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.332976833333333] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x03<br />
> [2.332976833333333] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.337468000000000] 0x0024, flags=00, payload=[30 05 00 0F 00 00 00 00 52 8D 6D BC 90 C9 00 EE FA CA 47 63 10 D1 4A E5 5A FD BB 91 3A 6C DA EF 64 CA 71 01 4A A9 D5 31 | 0.......R.m.......Gc..J.Z...:l..d.q.J..1], chk=0xF5, unk=0x00<br />
> [2.337468000000000] 0x00D0, payload=[30 04 00 0F 00 00 00 00 52 8D 6D BC 90 C9 00 EE FA CA 47 63 10 D1 4A E5 5A FD BB 91 3A 6C DA EF 64 CA 71 01 4A A9 D5 31 | 0.......R.m.......Gc..J.Z...:l..d.q.J..1], chk=0x4B<br />
< [2.345696333333333] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x05<br />
</pre><br />
<br />
Then another set of shared sequence. Some differences in the warmboot responses though. On line 18, <pre>FF BF FF 74</pre> becomes <pre>FF FF FF 74</pre>. On line 12, the <pre>00 00 00 00</pre> becomes the physical address of the resume context buffer. Example:<br />
<pre>F0 1E 1F 41</pre><br />
<br />
<pre><br />
> [2.345696333333333] 0x00D2, payload=[20 7A 3E 7B 31 DE FC 3A 11 5F 64 E7 AB A4 EC 17 | .z>{1..:._d.....], chk=0x77<br />
< [2.349790333333333] 0x0004, flags=00, payload=[ | ], chk=0xF9, unk=0x05<br />
> [2.349790333333333] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.360448916666666] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x05<br />
> [2.360448916666666] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.364930250000000] 0x0024, flags=00, payload=[9D 0B BC 4D BA 66 40 2C 63 BE F3 79 D0 31 26 1E 47 3A 64 DE 68 2F AE E2 8A B6 F0 27 37 46 89 16 0E 71 04 FA BF C9 4A A1 DF 4B EF D3 3D 0D 39 CD | ...M.f@,c..y.1&.G:d.h/.....'7F...q....J..K..=.9.], chk=0x11, unk=0x00<br />
> [2.364930250000000] 0x00D2, payload=[20 7A 3E 7B 31 DE FC 3A 11 5F 64 E7 AB A4 EC 17 | .z>{1..:._d.....], chk=0x77<br />
< [2.373236666666667] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x0B<br />
> [2.373236666666667] 0x0090, payload=[0C 00 04 | ...], chk=0x5B<br />
< [2.377318583333333] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x0B<br />
> [2.377318583333333] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.381794416666667] 0x0024, flags=00, payload=[00 00 00 00 | ....], chk=0xD5, unk=0x66<br />
> [2.381794416666667] 0x0090, payload=[0C 00 04 | ...], chk=0x5B<br />
< [2.385879750000000] 0x0004, flags=00, payload=[40 00 | @.], chk=0xB7, unk=0x00<br />
> [2.385879750000000] 0x0800, payload=[ | ], chk=0xF6<br />
< [2.386382583333333] 0x0004, flags=00, payload=[FF BF FF 74 | ...t], chk=0xC4, unk=0x66<br />
> [2.386382583333333] 0x0100, payload=[ | ], chk=0xFD<br />
< [2.386871833333333] 0x0004, flags=00, payload=[10 00 00 00 | ....], chk=0xE5, unk=0x66<br />
> [2.386871833333333] 0x0003, payload=[ | ], chk=0xFB<br />
< [2.387380083333333] 0x0000, flags=3F, payload=[ | ], chk=0xBE, unk=0x00<br />
> [2.387380083333333] 0x0006, payload=[ | ], chk=0xF8<br />
< [2.481997666666667] 0x0000, flags=80, payload=[ | ], chk=0x7D, unk=0x00<br />
> [2.481986333333333] 0x00D2, payload=[30 14 F4 B8 84 89 81 AB 3D 07 66 DE AE B6 D3 24 | 0.......=.f....$], chk=0x10<br />
< [2.514678500000000] 0x0020, flags=00, payload=[ | ], chk=0xDD, unk=0x00<br />
> [2.514678500000000] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.519163916666667] 0x0020, flags=00, payload=[1A 1F BC 74 AA 16 59 D6 5C E7 FF 5B E0 85 B2 C8 39 2D D6 95 98 2F B7 4B 71 64 34 D7 8D 2C 94 A1 91 CB 73 D7 8D E1 D0 07 E6 1E 0F DA E7 51 BC 69 | ...t..Y.\..[....9-.../.Kqd4..,....s..........Q.i], chk=0x3C, unk=0x00<br />
> [2.519163916666667] 0x00D2, payload=[30 14 F4 B8 84 89 81 AB 3D 07 66 DE AE B6 D3 24 | 0.......=.f....$], chk=0x10<br />
< [2.527551416666667] 0x0000, flags=80, payload=[ | ], chk=0x7D, unk=0x1F<br />
> [2.527540083333333] 0x088E, payload=[02 29 | .)], chk=0x3B<br />
< [2.531619416666667] 0x0000, flags=00, payload=[ | ], chk=0xFD, unk=0x1F<br />
> [2.531619416666667] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.542392416666666] 0x0020, flags=00, payload=[ | ], chk=0xDD, unk=0x1F<br />
> [2.542392416666666] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.546867583333333] 0x0020, flags=00, payload=[ | ], chk=0xDD, unk=0x1F<br />
> [2.546867583333333] 0x088E, payload=[02 29 | .)], chk=0x3B<br />
</pre><br />
<br />
Then, the two boot paths diverge completely (also note the time jump). It is suspected that at this point the kernel is started up on coldboot, and the kernel resumes for warmboot. For cold boot only, we see the beginning init sequence again, which is likely done in [[SceSyscon]].<br />
<br />
<pre><br />
< [3.322105750000000] 0x0000, flags=00, payload=[0D 06 00 01 | ....], chk=0xE5, unk=0x16<br />
> [3.322105750000000] 0x0001, payload=[ | ], chk=0xFD<br />
< [3.326563916666667] 0x0000, flags=00, payload=[32 30 31 32 31 31 30 38 31 37 30 34 | 201211081704], chk=0x96, unk=0x85<br />
> [3.326552583333333] 0x0002, payload=[ | ], chk=0xFC<br />
< [3.331090666666667] 0x0000, flags=80, payload=[ | ], chk=0x7D, unk=0x30<br />
> [3.331079333333333] 0x0080, payload=[12 00 | ..], chk=0x6A<br />
< [3.331576333333333] 0x0020, flags=00, payload=[ | ], chk=0xDD, unk=0x30<br />
> [3.331576333333333] 0x0080, payload=[12 00 | ..], chk=0x6A<br />
< [3.332068833333333] 0x0000, flags=00, payload=[10 00 00 00 | ....], chk=0xE9, unk=0x31<br />
> [3.332068833333333] 0x0004, payload=[ | ], chk=0xFA<br />
< [3.332541666666667] 0x0000, flags=00, payload=[00 FF 04 00 | ....], chk=0xF6, unk=0x31<br />
> [3.332541666666667] 0x0103, payload=[ | ], chk=0xFA<br />
< [3.336980333333333] 0x0000, flags=00, payload=[10 00 00 00 | ....], chk=0xE9, unk=0x31<br />
> [3.336980333333333] 0x0003, payload=[ | ], chk=0xFB<br />
...<br />
</pre><br />
<br />
= Packet checksum =<br />
The checksum byte of the packet is calculated as the binary negation of the sum of all the bytes of the packet (including the 2 bytes of the command id and the byte for the length).<br />
The checksum calculation can be implemented as follows:<br />
<source lang="c"><br />
void syscon_calc_checksum(unsigned char packet[32], int length)<br />
{<br />
int i;<br />
unsigned char hash = 0;<br />
<br />
for (i = 0; i < 3 + length; i++)<br />
hash += packet[i];<br />
<br />
packet[3 + length] = ~hash;<br />
}<br />
</source><br />
<br />
= Commands =<br />
<br />
Commands are listed in the order seen in cold boot. The numbers in the captured packets indicate the assumed order with some unused packets filtered out (they appear to be resent). The ordering and grouping are assumed and may contain errors.<br />
<br />
== CMD 0x0001 - GetBaryonVersion ==<br />
<br />
Gets version of the current installed Ernie firmware. Can also be seen in the packet header in [[Syscon Update]]. Also sent at kernel boot.<br />
<br />
<pre><br />
SEND 1 > [2.881037083333333] 0x0001, payload=[ | ], chk=0xFD<br />
RESP 1 < [2.881037083333333] 0x0004, flags=00, payload=[0D 06 00 01 | ....], chk=0xE1, unk=0x71<br />
</pre><br />
<pre><br />
SEND 23 > [4.167151583333333] 0x0001, payload=[ | ], chk=0xFD<br />
RESP 23 < [4.167151583333333] 0x0000, flags=00, payload=[0D 06 00 01 | ....], chk=0xE5, unk=0x32<br />
</pre><br />
<br />
== CMD 0x0005 - GetHardwareInfo ==<br />
<br />
See [[KBL Param#Hardware_Info]].<br />
<br />
<pre><br />
SEND 2 > [2.881578833333333] 0x0005, payload=[ | ], chk=0xF9<br />
RESP 2 < [2.881578833333333] 0x0004, flags=00, payload=[00 60 40 00 | .`@.], chk=0x55, unk=0x71<br />
</pre><br />
<br />
== CMD 0x0002 - GetBaryonTimestamp ==<br />
<br />
Gets syscon firmware timestamp. Also sent at kernel boot.<br />
<br />
<pre><br />
SEND 3 > [2.882249083333333] 0x0002, payload=[ | ], chk=0xFC<br />
RESP 3 < [2.882249083333333] 0x0004, flags=00, payload=[32 30 31 32 31 31 30 38 31 37 30 34 | 201211081704], chk=0x92, unk=0x00<br />
</pre><br />
<pre><br />
SEND 24 > [4.171598000000000] 0x0002, payload=[ | ], chk=0xFC<br />
RESP 24 < [4.171598000000000] 0x0000, flags=00, payload=[32 30 31 32 31 31 30 38 31 37 30 34 | 201211081704], chk=0x96, unk=0xF7<br />
</pre><br />
<br />
== CMD 0x0080 ==<br />
<br />
Unknown. Sends data 0x0012 on FW 3.60. Does not get return data. Also sent at kernel boot.<br />
<br />
<pre><br />
SEND 4 > [2.895635416666666] 0x0080, payload=[12 00 | ..], chk=0x6A<br />
RESP 4 < [2.886923416666667] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x30<br />
RESP 4 < [2.891092083333333] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x30<br />
RESP 4 < [2.895635416666666] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x30<br />
</pre><br />
<pre><br />
SEND 25 > [4.176620750000000] 0x0080, payload=[12 00 | ..], chk=0x6A<br />
RESP 25 < [4.176123750000000] 0x0000, flags=80, payload=[ | ], chk=0x7D, unk=0x30<br />
RESP 25 < [4.176620750000000] 0x0020, flags=00, payload=[ | ], chk=0xDD, unk=0x30<br />
</pre><br />
<br />
== CMD 0x0010 - GetWakeupFactor ==<br />
<br />
See [[KBL Param#Wakeup factor|Wakeup factor]].<br />
<br />
Boot type indicator. 0xFF14 on cold boot. 0xFF80 on resume boot.<br />
<pre><br />
SEND 5 > [2.950546416666667] 0x0010, payload=[ | ], chk=0xEE<br />
RESP 5 < [2.950546416666667] 0x0004, flags=00, payload=[14 FF | ..], chk=0xE4, unk=0x32<br />
</pre><br />
<br />
== CMD 0x00A0 ==<br />
<br />
Runs twice. Appears to contain a 8 byte inner header. First packet sends all zeros and gets back a 8 byte random response. This is likely a nonce or challenge. This likely establishes an encrypted session. Encrypted data differs on each boot. There does not appear to be data transferred using the established session.<br />
<br />
<pre><br />
SEND 6 > [2.994470666666667] 0x00A0, payload=[30 00 00 0B 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | 0.......................................], chk=0xFB<br />
RESP 6 < [2.972471333333333] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0xFF<br />
RESP 6 < [2.989889500000000] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0xFF<br />
RESP 6 < [2.994470666666667] 0x0024, flags=00, payload=[30 01 00 0B 00 00 00 00 CA 71 11 BA 86 87 EF 0D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | 0........q..............................], chk=0x66, unk=0x00<br />
<br />
SEND 7 > [3.033187750000000] 0x00A0, payload=[30 02 00 0B 01 00 00 00 92 45 B4 A5 49 15 CE F2 39 0E 9E 4C BF FA 19 E6 5D CF BA 5A 6E C3 7C ED 2A 6D 4E 79 84 28 1C 2A | 0........E..I...9..L....]..Zn.|.*mNy.(.*], chk=0x97<br />
RESP 7 < [3.002893083333333] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x01<br />
RESP 7 < [3.028592333333334] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x01<br />
RESP 7 < [3.033187750000000] 0x0024, flags=00, payload=[30 03 00 0B 00 00 00 00 12 77 A5 98 67 F7 38 9B B4 54 48 FE 84 82 CF 84 41 42 87 A2 EA D1 CF 9C 5B D1 2A 3F 1E 50 B9 3D | 0........w..g.8..TH.....AB......[.*?.P.=], chk=0x0A, unk=0x00<br />
</pre><br />
<br />
== CMD 0x088E - CtrlVoltage ==<br />
<br />
Controls voltage. Sends value 0x2201 on FW 3.60 and does not get any response.<br />
<br />
<pre><br />
SEND 8 > [3.061354583333333] 0x088E, payload=[01 22 | ."], chk=0x43<br />
RESP 8 < [3.041713500000000] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x03<br />
RESP 8 < [3.046148250000000] 0x0004, flags=00, payload=[ | ], chk=0xF9, unk=0x03<br />
RESP 8 < [3.056796250000000] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x03<br />
RESP 8 < [3.061354583333333] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x03<br />
</pre><br />
<br />
== CMD 0x1082 - NVS Read ==<br />
<br />
Get data from [[#NVS|NVS]]. 2-byte offset followed by 1 byte length. For example used to fetch boot-time flags, like Update Mode.<br />
<br />
<pre><br />
Get Qaf Token area:<br />
SEND 9 > [3.078212500000000] 0x1082, payload=[80 04 08 | ...], chk=0xDD<br />
RESP 9 < [3.069790250000000] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x03<br />
RESP 9 < [3.073736583333333] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x03<br />
RESP 9 < [3.078212500000000] 0x0024, flags=00, payload=[FF FF FF FF 01 FF FF FF | ........], chk=0xD7, unk=0x77<br />
<br />
Get Update Mode:<br />
SEND 10 > [3.094879833333333] 0x1082, payload=[A0 04 01 | ...], chk=0xC4<br />
RESP 10 < [3.086322916666667] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0xFF<br />
RESP 10 < [3.090404000000000] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0xFF<br />
RESP 10 < [3.094879833333333] 0x0024, flags=00, payload=[FF | .], chk=0xD9, unk=0x00<br />
</pre><br />
<br />
== CMD 0x1100 - GetErnieDLVersion ==<br />
<br />
Gets Ernie DownLoader Version i.e. version of Ernie firmware.<br />
<br />
<pre><br />
SEND 11 > [3.099025500000000] 0x1100, payload=[ | ], chk=0xED<br />
RESP 11 < [3.099025500000000] 0x0004, flags=00, payload=[01 01 13 00 | ....], chk=0xE0, unk=0xFF<br />
</pre><br />
<br />
== CMD 0x00D0 ==<br />
Some encrypted transfer that looks close to [[Syscon#CMD 0x00A0]] in format. Different on each boot.<br />
<pre><br />
SEND 12 > [3.122679833333333] 0x00D0, payload=[30 00 00 0F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | 0.......................................], chk=0xC7<br />
RESP 12 < [3.103569583333333] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x01<br />
RESP 12 < [3.107676166666667] 0x0004, flags=00, payload=[ | ], chk=0xF9, unk=0x01<br />
RESP 12 < [3.118188666666667] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x01<br />
RESP 12 < [3.122679833333333] 0x0024, flags=00, payload=[30 01 00 0F 00 00 00 00 9F CC 4A 69 73 E9 C0 5A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | 0.........Jis..Z........................], chk=0xDD, unk=0x00<br />
<br />
SEND 13 > [3.150031916666667] 0x00D0, payload=[30 02 00 0F 01 00 00 00 98 6D 3A 1E C5 B1 E9 AF 54 65 55 91 3B DF 2B A8 0F AD B0 73 A0 A2 0F EE 5D 0A AF 41 A5 6D 32 20 | 0........m:.....TeU.;.+....s....]..A.m2.], chk=0xF4<br />
RESP 13 < [3.130872500000000] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x01<br />
RESP 13 < [3.134978166666667] 0x0004, flags=00, payload=[ | ], chk=0xF9, unk=0x01<br />
RESP 13 < [3.145539833333333] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x01<br />
RESP 13 < [3.150031916666667] 0x0024, flags=00, payload=[30 03 00 0F 00 00 00 00 F5 19 C0 67 09 80 C6 DB 58 8D FB E1 86 22 D1 00 DA BB D2 AF AA 51 F9 57 7C 56 92 0A 94 D6 60 4D | 0..........g....X....".......Q.W|V....`M], chk=0xF0, unk=0x00<br />
<br />
SEND 14 > [3.177452416666667] 0x00D0, payload=[30 04 00 0F 00 00 00 00 87 4E 59 41 22 98 F8 62 BD B4 C8 4F 4C 0A 81 90 47 1E 1E 70 D6 51 57 42 E5 EC 07 A2 D4 CF E5 02 | 0........NYA"..b...OL...G..p.QWB........], chk=0x9A<br />
RESP 14 < [3.158257166666667] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x03<br />
RESP 14 < [3.162363250000000] 0x0004, flags=00, payload=[ | ], chk=0xF9, unk=0x03<br />
RESP 14 < [3.172875666666667] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x03<br />
RESP 14 < [3.177452416666667] 0x0024, flags=00, payload=[30 05 00 0F 00 00 00 00 87 4E 59 41 22 98 F8 62 BD B4 C8 4F 4C 0A 81 90 47 1E 1E 70 D6 51 57 42 E5 EC 07 A2 D4 CF E5 02 | 0........NYA"..b...OL...G..p.QWB........], chk=0x44, unk=0x00<br />
</pre><br />
<br />
== CMD 0x00D2 - SNVS RW ==<br />
This command is used twice during boot and also quite often after boot. Data is different on each boot. Encrypted session using key from handshake above. Second transaction seems to be the firmware version data written during the update process. Likely firmware version check is done here.<br />
<pre><br />
SEND 15 > [3.204733083333333] 0x00D2, payload=[32 78 88 CF 3E 63 56 19 75 3A 0A 2D F3 49 63 E2 | 2x..>cV.u:.-.Ic.], chk=0xA4<br />
RESP 15 < [3.185595250000000] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x05<br />
RESP 15 < [3.189740333333333] 0x0004, flags=00, payload=[ | ], chk=0xF9, unk=0x05<br />
RESP 15 < [3.200251666666666] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x05<br />
RESP 15 < [3.204733083333333] 0x0024, flags=00, payload=[D3 57 9B F2 A2 45 E2 7A 2A FC 84 12 97 8E 23 5F C8 AB FB 58 97 EC DE 20 94 0A 78 28 C6 EE C5 45 18 29 00 F4 56 22 53 AF 24 47 8E FF B1 5C DA 2F | .W...E.z*.....#_...X......x(...E.)..V"S.$G...\./], chk=0x4C, unk=0xFF<br />
</pre><br />
<pre><br />
SEND 21 > [3.359112250000000] 0x00D2, payload=[1C 0B 9E FF FB 68 90 4B FD C2 05 CD D8 67 4D D0 | .....h.K.....gM.], chk=0x2D<br />
RESP 21 < [3.321934500000000] 0x0000, flags=80, payload=[ | ], chk=0x7D, unk=0x00<br />
RESP 21 < [3.354626666666667] 0x0020, flags=00, payload=[ | ], chk=0xDD, unk=0x00<br />
RESP 21 < [3.359112250000000] 0x0020, flags=00, payload=[6C B4 26 F3 CD 32 D3 3E 6F 80 F2 0F 68 F7 E2 96 58 DB 2F BB AB A6 98 DD 26 14 DD 61 12 E4 55 BA BB 32 1D 1F 75 D5 D1 4C 7E 4A 19 42 E5 B0 C6 AB | l.&..2.>o...h...X./.....&..a..U..2..u..L~J.B....], chk=0x84, unk=0xFF<br />
</pre><br />
<br />
== CMD 0x0090 - Scratch Pad Read ==<br />
<br />
This command reads data from Ernie Scratch Pad. This is the inverse of command 0x91.<br />
<br />
This is used for example to fetch the saved resume context buffer physical address. Kernel sets this before suspending and this value is passed to the resume function. See [[Suspend]]. The format is 2 byte offset and 1 byte length.<br />
<br />
<pre><br />
SEND 16 > [3.221743166666667] 0x0090, payload=[0C 00 04 | ...], chk=0x5B<br />
RESP 16 < [3.213273166666667] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x57<br />
RESP 16 < [3.217267333333333] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x57<br />
RESP 16 < [3.221743166666667] 0x0024, flags=00, payload=[F0 0E 1F 41 | ...A], chk=0x77, unk=0x45<br />
</pre><br />
<br />
== CMD 0x0091 - Scratch Pad Write ==<br />
<br />
This command writes data to Ernie Scratch Pad. This is the inverse of command 0x90.<br />
<br />
== CMD 0x0800 - Get USB Info ==<br />
<br />
See [[KBL Param]].<br />
<br />
<pre><br />
SEND 17 > [3.225828583333334] 0x0800, payload=[ | ], chk=0xF6<br />
RESP 17 < [3.225828583333334] 0x0004, flags=00, payload=[40 00 | @.], chk=0xB7, unk=0x41<br />
</pre><br />
<br />
== CMD 0x0100 - GetControlsInfo ==<br />
<br />
See [[KBL Param#Boot Controls Info|Boot Controls Info]].<br />
<br />
<pre><br />
SEND 18 > [3.226331500000000] 0x0100, payload=[ | ], chk=0xFD<br />
RESP 18 < [3.226331500000000] 0x0004, flags=00, payload=[FF BF FF 74 | ...t], chk=0xC4, unk=0x45<br />
</pre><br />
<br />
== CMD 0x0003 - GetSleepFactor ==<br />
<br />
See [[KBL Param#Sleep Factor|Sleep Factor]].<br />
<br />
<pre><br />
SEND 19 > [3.226820750000000] 0x0003, payload=[ | ], chk=0xFB<br />
RESP 19 < [3.226820750000000] 0x0004, flags=00, payload=[10 00 00 00 | ....], chk=0xE5, unk=0x45<br />
</pre><br />
<br />
== CMD 0x0006 - Get Hardware flags ==<br />
<br />
See [[KBL Param#Hardware flags|Hardware flags]].<br />
<br />
<pre><br />
SEND 20 > [3.227328833333333] 0x0006, payload=[ | ], chk=0xF8<br />
RESP 20 < [3.227328833333333] 0x0000, flags=3F, payload=[ | ], chk=0xBE, unk=0x00<br />
</pre><br />
<br />
== CMD 0x088E ==<br />
Unknown. Appears to be the last command sent before a time-jump (likely indicating completion of early-boot). Might be some status indicator to tell Syscon that we're done.<br />
<pre><br />
SEND 22 > [3.386554833333333] 0x088E, payload=[02 29 | .)], chk=0x3B<br />
RESP 22 < [3.367488416666667] 0x0000, flags=80, payload=[ | ], chk=0x7D, unk=0xB4<br />
RESP 22 < [3.371567833333333] 0x0000, flags=00, payload=[ | ], chk=0xFD, unk=0xB4<br />
RESP 22 < [3.382079833333334] 0x0020, flags=00, payload=[ | ], chk=0xDD, unk=0xB4<br />
RESP 22 < [3.386554833333333] 0x0020, flags=00, payload=[ | ], chk=0xDD, unk=0xB4<br />
</pre><br />
<br />
== CMD 0x0004 ==<br />
Unknown. Likely happens after initial boot.<br />
<pre><br />
SEND 26 > [4.177113250000000] 0x0004, payload=[ | ], chk=0xFA<br />
RESP 26 < [4.177113250000000] 0x0000, flags=00, payload=[10 00 00 00 | ....], chk=0xE9, unk=0x31<br />
</pre><br />
<br />
== CMD 0x0103 - Get Multi Connector Info ==<br />
<br />
Likely happens after initial boot.<br />
<br />
<pre><br />
SEND 27 > [4.177586083333333] 0x0103, payload=[ | ], chk=0xFA<br />
RESP 27 < [4.177586083333333] 0x0000, flags=00, payload=[00 FF 04 00 | ....], chk=0xF6, unk=0x31<br />
</pre><br />
<br />
= Syscon Scratch Pad =<br />
<br />
{| class="wikitable"<br />
|-<br />
! Offset !! Size !! Name !! Comment !! Used by<br />
|-<br />
| 0x0 || 8 || unknown || ||<br />
|-<br />
| 0x8 || 4 || Syscon power on time || ex on DevKit: 0xA, 0x16, 0x1F, 0x24. ex on retail: 0x01BC0CD0, 0x05AC1AF7, 0x80000269 || [[SceRtc#sceRtcSetCurrentTickForDriver]]<br />
|-<br />
| 0xC || 4 || Resume context physical address || Set on retail. Not set on DevKit. ex: 0x411F1EF0 || second_loader<br />
|-<br />
| 0x10 || 5 || Current Tick || Set on retail and DevKit. Stored in microseconds since 01/01/0001 divided by 2^19. || [[SceRtc#sceRtcSetCurrentTickForDriver]]<br />
|-<br />
| 0x15 || 3 || Padding of Current Tick || ||<br />
|-<br />
| 0x18 || 5 || Current Secure Tick || Set on retail. Not set on DevKit. || [[SceRtc#sceRtcSetCurrentSecureTickForDriver]]<br />
|-<br />
| 0x1D || 5 || Current Network Tick || Always a bit earlier than Current Tick and Current Secure Tick. || [[SceRtc#sceRtcSetCurrentNetworkTickForDriver]]<br />
|-<br />
| 0x22 || 5 || Current ?Debug Secure?/?Tool Secure? Tick || Set on DevKit. Not set on retail. || [[SceRtc#sceRtcGetCurrentToolSecureTickForDriver]]<br />
|-<br />
| 0x27 || 5 || Current Aux Tick || || [[SceRtc#sceRtcSetCurrentAuxTickForDriver]]<br />
|-<br />
| 0x2C || 5 || Current Debug Network Tick || || [[SceRtc#sceRtcSetCurrentDebugNetworkTickForDriver]]<br />
|-<br />
| 0x31 || 0x8F || unknown || Maybe reserved. Probably unused. ||<br />
|-<br />
| 0xE0 || 0x20 || [[KBL Param|CP DIP Switches]] || Set on DevKit having a CP. Hence not set on Retail nor TestKit. || ?secure_kernel? before system suspend, second_loader after system resume<br />
|}<br />
<br />
== Types ==<br />
<br />
<source lang="C"><br />
typedef struct SceSysconRtcTick { // size is 5 bytes<br />
uint8_t tick[5];<br />
} SceSysconRtcTick;<br />
<br />
typedef struct SceSysconScratchPad { // size is 0x100 bytes<br />
uint8_t unk_0[8];<br />
SceUInt32 powerOnTime;<br />
void *resumeContextPA;<br />
SceRtcSysconTick currentTick;<br />
uint8_t padding[3];<br />
SceSysconRtcTick currentSecureTick;<br />
SceSysconRtcTick currentNetworkTick;<br />
SceSysconRtcTick unk_0x22;<br />
SceSysconRtcTick currentAuxTick;<br />
SceSysconRtcTick currentDebugNetworkTick;<br />
uint8_t reserved[0x8F];<br />
SceDIPSW dipsw;<br />
} SceSysconScratchPad;<br />
</source><br />
<br />
= NVS =<br />
<br />
Ernie Non-volatile storage (NVS) is a persistent storage allocated on Ernie Data Flash that is used by PS Vita OS for data required at boot time. Indeed, reading NVS requires no driver except the driver to communicate with Syscon, whilst reading PS Vita eMMC requires its AES-XTS decryption.<br />
<br />
Not every NVS sector is directly readable from Kermit: the first sectors are part of [[Ernie Secure#SNVS|SNVS]] (Secure NVS) which means that they are XTS-encrypted and must be accessed through a Secure handshake.<br />
<br />
NVS actual size is 0xBA0 bytes on new Syscon hardware revisions and 0xC20 on old. However, only 0xB60 bytes are accessible from Kermit on System Software 3.600.011 and more recent. The hidden area is probably used internally by Syscon as it is not blanked nor 0xFFed.<br />
<br />
On FW 3.60, NVS size accessible from Kermit is 0xB60 bytes:<br />
* Area from 0 to 0x3FF is named [[Ernie Secure#SNVS]]. It has an additional level of encryption. It cannot be read using [[SceSblSsMgr#sceSblNvsReadForKernel]] nor written using [[SceSblSsMgr#sceSblNvsWriteForKernel]]. This area is handled by [[Secure Modules]].<br />
* Area from 0x400 to 0x75F is handled by Non-secure Kernel [[SceSblSsMgr]] module.<br />
* Area from 0x760 to 0xB5F is reserved for Test and Tool consoles. However this area seems unused.<br />
* Area from 0xB60 to the end of NVS is not accessible from Kermit.<br />
<br />
{| class="wikitable"<br />
|-<br />
! Offset !! Size !! Name !! Comment !! Used by<br />
|-<br />
| 0 || 0x400 || SNVS || See [[Ernie Secure#SNVS]]. ||<br />
|-<br />
| 0x400 || 0x80 || Qaf Token || || second_loader<br />
|-<br />
| 0x480 || 0x1 || Qaf Token Flag || 1 when Qaf Token is not set (FFed), 0 when Qaf Token is set || second_loader<br />
|-<br />
| 0x481 || 0x1 || Extra UART Flag || See [[KBL Param#Boot flags]]. || second_loader<br />
|-<br />
| 0x482 || 0x1 || Unknown || || [[SceSblSsMgr#sceSblSsGetNvsDataForDriver]], [[SceSblSsMgr#sceSblSsSetNvsDataForDriver]]<br />
|-<br />
| 0x483 || 0x1 || Safe Mode Flag || See [[KBL Param#Boot flags]]. || [[SceSblSsMgr#sceSblSsGetNvsDataForDriver]], [[SceSblSsMgr#sceSblSsSetNvsDataForDriver]], second_loader<br />
|-<br />
| 0x484 || 0x1 || <code>KervResult</code>/<code>KervDiagResultFlag</code> || || Factory test <code>preCheckFactTest</code><br />
|-<br />
| 0x485 || 0x1 || Unknown || ||<br />
|-<br />
| 0x486 || 0x1 || Internal Storage Flag || Bit 0 is called <code>ValidationMCEmu</code> flag. See [[KBL Param#Boot flags]].<br>Not present on FWs 0.931-0.990. Present on FW 3.60. || [[SceSblSsMgr#sceSblSsGetNvsDataForDriver]], [[SceSblSsMgr#sceSblSsSetNvsDataForDriver]], second_loader<br />
|-<br />
| 0x487 || 0x1 || Unknown || See [[KBL Param#Boot flags]]. || second_loader<br />
|-<br />
| 0x4A0 || 0x1 || Update Mode || See [[KBL Param#Boot flags]]. || [[SceSblUpdateMgr#sceSblUsGetUpdateModeForUser]], [[SceSblUpdateMgr#sceSblUsSetUpdateModeForUser]]<br />
|-<br />
| 0x4A1 || 0x3 || Unknown. Unused. || ||<br />
|-<br />
| 0x4A4 || 0x4 || System Language || || [[SceRegistryMgr]], [[SceSblSsMgr#sceSblSsGetNvsDataForDriver]], [[SceSblSsMgr#sceSblSsSetNvsDataForDriver]]<br />
|-<br />
| 0x4A8 || 0x1C || Unknown. Unused. || ||<br />
|-<br />
| 0x4C4 || 0x1 || Unknown. Set to 0 by default. || || <br />
|-<br />
| 0x4C5 || 0x1B || Unknown. Unused. || ||<br />
|-<br />
| 0x4E0 || 0x20 || KibanID || || [[SceSblSsMgr#sceSblSsGetNvsDataForDriver]], [[SceSblSsMgr#sceSblSsSetNvsDataForDriver]]<br />
|-<br />
| 0x500 || 0x1 || Wlan/Bt Flag || || [[SceSblSsMgr#sceSblSsGetNvsDataForDriver]], [[SceSblSsMgr#sceSblSsSetNvsDataForDriver]], [[SceWlanBt]] module_start<br />
|-<br />
| 0x501 || 0x1F || Unknown. Unused. || ||<br />
|-<br />
| 0x520 || 0x80 || Activation Area || first 0x20 bytes are SceNVSKitActivationData || [[SceSblSsMgr]], [[SceSblPostSsMgr]]<br />
|-<br />
| 0x5A0 || 0x100 || Qaf Token RSA signature || Not present on FW 0.990. Present on FW 3.60. Maybe added on FW 1.80. || second_loader<br />
|-<br />
| 0x6A0 || 0xC0 || Unknown. Unused. || ||<br />
|-<br />
| 0x760 || 0x400 || Reserved for Test and Tool. || Seems unused. ||<br />
|}<br />
<br />
== Types ==<br />
<br />
<source lang="C"><br />
typedef struct SceNVSKitActivationData { // size is 0x20 bytes<br />
char magic[4]; // "act\n"<br />
uint32_t issue_no;<br />
uint32_t end_date;<br />
uint32_t start_date;<br />
char cmac_hash[0x10];<br />
} SceNVSKitActivationData;<br />
</source><br />
<br />
= Config Storage =<br />
<br />
Config Storage is a similar storage than [[#NVS|NVS]] but is accessed in a different manner. Whilst [[#NVS|NVS]] is read and written by 32-byte sectors and is physically stored with a sort of history, Config Storage is written by sending scripts from [[Kermit]] to Syscon, and is not really readable but instead affects [[KBL Param#Hardware Info]].<br />
<br />
== Sample scripts ==<br />
<br />
Below are sample configstorage scripts hardcoded in [[SceSyscon]]:<br />
<source lang="C"><br />
const char syscon_idu_set_config[0x20] = {<br />
0x1F, 0x54, 0x35, 0x63, 0x38, 0x62, 0x31, 0x64,<br />
0x61, 0x63, 0x62, 0x38, 0x33, 0x36, 0x64, 0x64,<br />
0x36, 0x63, 0x39, 0x39, 0x36, 0x38, 0x65, 0x34,<br />
0x63, 0x30, 0x35, 0x30, 0x61, 0x36, 0x66, 0x35<br />
};<br />
<br />
const char syscon_idu_set_config2[0x20] = {<br />
0x07, 0x57, 0xA8, 0x01, 0x01, 0x00, 0x0D, 0x00,<br />
0x01, 0x4E, 0x15, 0x48, 0x51, 0xBD, 0x52, 0x2C,<br />
0x4C, 0x83, 0x70, 0xDA, 0x4D, 0xF3, 0x8E, 0x82,<br />
0x6B, 0xD6, 0x34, 0x98, 0x3A, 0xFD, 0xA6, 0x94<br />
};<br />
<br />
const char syscon_show_set_config[0x20] = {<br />
0x1F, 0x54, 0x66, 0x63, 0x33, 0x39, 0x38, 0x39,<br />
0x30, 0x61, 0x33, 0x32, 0x64, 0x30, 0x66, 0x32,<br />
0x37, 0x36, 0x31, 0x35, 0x62, 0x65, 0x36, 0x65,<br />
0x63, 0x64, 0x63, 0x35, 0x65, 0x32, 0x63, 0x63<br />
};<br />
<br />
const char syscon_show_set_config2[0x20] = {<br />
0x07, 0x57, 0xA8, 0x01, 0x03, 0x00, 0x10, 0x00,<br />
0x01, 0x4E, 0x15, 0x48, 0xB8, 0x1A, 0x54, 0xD1,<br />
0xF2, 0xA0, 0xD1, 0x05, 0x18, 0xEA, 0x22, 0x09,<br />
0x0A, 0x02, 0x2E, 0xAE, 0x00, 0x08, 0x25, 0xF1<br />
};<br />
<br />
const char syscon_clear_config[0x20] = {<br />
0x1F, 0x54, 0x65, 0x34, 0x61, 0x65, 0x38, 0x62,<br />
0x37, 0x61, 0x65, 0x38, 0x36, 0x33, 0x32, 0x65,<br />
0x64, 0x64, 0x39, 0x61, 0x61, 0x65, 0x38, 0x38,<br />
0x38, 0x39, 0x66, 0x30, 0x65, 0x65, 0x61, 0x38<br />
};<br />
<br />
const char syscon_clear_config2[0x20] = {<br />
0x07, 0x57, 0xA8, 0x01, 0x00, 0x00, 0x00, 0x00,<br />
0x01, 0x4E, 0x15, 0x48, 0x88, 0xEA, 0xC7, 0xAD,<br />
0x65, 0xB1, 0x73, 0xC1, 0xCF, 0x48, 0xC7, 0x29,<br />
0x1B, 0x2B, 0x8A, 0x32, 0x89, 0xCF, 0xB3, 0xC1<br />
};<br />
</source><br />
<br />
The only actual differences between those scripts are:<br />
* the ascii string: we do not know how it is generated and what it means<br />
* the mode value:<br />
** A8 01 00 00 00 00 = mode clear<br />
** A8 01 01 00 0D 00 = idu mode set<br />
** A8 01 03 00 10 00 = show mode set<br />
<br />
== Types ==<br />
<br />
<source lang="C"><br />
// TODO<br />
</source><br />
<br />
{| class="wikitable"<br />
|-<br />
! Offset !! Size !! Name !! Sample value !! Comment<br />
|-<br />
| 0 || 1 || ascii_data_size || 0x1F ||<br />
|-<br />
| 1 || 1 || ascii_data_flag || 0x54 ||<br />
|-<br />
| 2 || 0x1E || ascii_data || || ASCII hexadecimal string so maybe a hash<br />
|-<br />
| 0x20 || 1 || unk_7_data_size || 7 ||<br />
|-<br />
| 0x21 || 1 || unk_7_data_flag || ||<br />
|-<br />
| 0x22 || 6 || unk_7_data || ||<br />
|-<br />
| 0x28 || 1 || unk_1_data_size || 1 ||<br />
|-<br />
| 0x29 || 1 || unk_1_data_flag || 0x4E ||<br />
|-<br />
| 0x2A || 1 || sha1_hash_size || 0x15 ||<br />
|-<br />
| 0x2B || 1 || sha1_hash_flag || 0x48 ||<br />
|-<br />
| 0x2C || 0x14 || sha1_hash || || sha1 hash of the previous blocks (data from 0 of size 0x2A)<br />
|}<br />
<br />
Config storage scripts have in theory a variable size. It is the concatenation of some blocks where the first byte is the length of the body, followed by the body of variable size. Body structure is always the same: 1 byte representing the flag, followed by data of variable size.<br />
<br />
== Usage ==<br />
<br />
Theory by CelesteBlue (untested):<br />
* 0) Begin Transaction<br />
<br />
* 1) Load Script (part 1)<br />
* A) configstorage data is read from SceSyscon memory<br />
* B) configstorage data is sent by SceSyscon to Ernie<br />
* C) Ernie FW checks hash of data and returns xx on success<br />
<br />
if success:<br />
* 2) Load Script (part 2)<br />
* A) configstorage data is read from SceSyscon memory<br />
* B) configstorage data is sent by SceSyscon to Ernie using Load<br />
* C) Ernie FW loads data to memory and executes it<br />
<br />
*6) Commit Transaction<br />
*7) End Transaction<br />
<br />
= Pinout =<br />
<br />
[[File:ernie-package.png|600px|Ernie BGA package.]]<br />
<br />
A candidate package for this chip is Renesas' [https://www.renesas.com/us/en/package-image/pdf/outdrawing/p121f1-50-bal.pdf P121F1-50-BAL-1]. It has the same size and number of pins.<br />
<br />
=== UART ===<br />
<br />
{| class='wikitable'<br />
! Name || Pin || Description<br />
|-<br />
| CTS0 || J7 || UART0 clear to send<br />
|-<br />
| RTS0 || C6 || UART0 request to send<br />
|-<br />
| TX0 || B6 || UART0 transmit<br />
|-<br />
| RX0 || F11 || UART0 receive<br />
|-<br />
| SW0 || A8 || Switch, see [[UART Console#OLED PSVita UART0 location]]<br />
|}<br />
<br />
=== SPI ===<br />
<br />
Main communication with [[Kermit]].<br />
<br />
{| class='wikitable'<br />
! Name || Pin || Description<br />
|-<br />
| SS || A7 || Slave Select (often active low, output from master)<br />
|-<br />
| MISO || A6 || Master In Slave Out (data output from slave)<br />
|-<br />
| MOSI || C7 || Master Out Slave In (data output from master)<br />
|-<br />
| SCLK || B7 || Serial Clock (output from master)<br />
|}<br />
<br />
=== Other ===<br />
<br />
{| class='wikitable'<br />
! Name || Pin || Description<br />
|-<br />
| ? || C11 || [[UDC]] pin 11<br />
|-<br />
| ? || F9 || [[UDC]] pin 12<br />
|-<br />
| ? || G4 || [[UDC]] pin 13<br />
|-<br />
| ? || G8 || [[SN99057]] pin 38<br />
|-<br />
| PWR_SW || G6 || Power switch through two transistor buffers<br />
|}<br />
<br />
= Versions =<br />
<br />
== Hardware Versions ==<br />
<br />
There are three hardware versions of Ernie:<br />
* NEC 78K0R/Kx3-L: present on early PS Vita prototypes (never seen)<br />
* NEC 78K0R/Kx3: present on Fat PS Vita and PS TV models, including some prototypes such as DEM-3000L<br />
* Renesas RL78/G13: present on Slim PS Vita models<br />
<br />
=== NEC 78K0R/Kx3-L ===<br />
<br />
Never seen yet but exists according to Ernie update packages.<br />
<br />
=== NEC 78K0R/Kx3 ===<br />
<br />
NEC D79F0109 (78K0R/KH3, 121 pin)<br />
<br />
Device Name : D79F0109<br />
<br />
Other Device Name : SK0RT02N200GV120 (on DEM-3000L and PCH-1000)<br />
<br />
Label:<br />
<pre><br />
Model <- always D79F0109<br />
Revision <- on DEM-3000H: ES1.0, blank on others<br />
Build <- XXYYZZWWW <- XX: year, YY: week, ZZ: 2 letters (unknown usage), WWW: serial number<br />
Manufacturing country <- always "MALAYSIA"<br />
</pre><br />
<br />
=== Renesas RL78/G13 ===<br />
<br />
Renesas R5F1ZCRK (RL78/G13, 121 pin)<br />
<br />
<pre><br />
R5F1ZCRKABG#U0<br />
R5 Renesas MCU<br />
F Flash<br />
1 RL78<br />
Z Customer specific<br />
C Product group<br />
R 121-pin<br />
K 384KB<br />
A Consumer grade<br />
BG VFBGA 0.4mm<br />
#U0 Tray*2<br />
</pre><br />
<br />
<pre><br />
Device Name : R5F1ZCRK<br />
Device Code : 10 00 06<br />
Firmware Version : V3.03<br />
Code Flash 1 (Address : 0x00000000, Size : 384 K, Erase Size : 1 K)<br />
Data Flash 1 (Address : 0x000F1000, Size : 8 K, Erase Size : 1 K)<br />
</pre><br />
<br />
Label:<br />
<pre><br />
(C) XXXX <- Year<br />
Revision <- A0xxx SCEI<br />
Build <- XXYYZZWWW <- XX: year, YY: week, ZZ: 2 letters (unknown usage), WWW: serial number<br />
Unknown data<br />
</pre><br />
<br />
== Block sizes ==<br />
<br />
Ernie flash memory is erasable in blocks. Size of one block in bytes depends on the hardware version:<br />
* NEC 78K0R/Kx3-L: 0x800<br />
* NEC 78K0R/Kx3: 0x400<br />
* Renesas RL78/G13: 0x400<br />
<br />
See also [https://playstationdev.wiki/psvitadevwiki/index.php?title=Ernie].<br />
<br />
== Software Versions ==<br />
<br />
See also [https://playstationdev.wiki/psvitadevwiki/index.php?title=System_Controller_Firmware].<br />
<br />
Ernie firmware can be partly updated and downgraded with software updates embedded in PUP.<br />
<br />
Ernie firmware is dependant of the hardware version and detects it based on [[KBL Param#Hardware_Info|Hardware Info]].<br />
<br />
=== Examples ===<br />
<br />
With DevKit connected, <code>psp2ctrl info</code> queries return the following results: <br />
<br />
DEM-3000H running FW 0.990:<br />
<source>SysConVersion: 591105</source> -> converted to hexadecimal: 0x00090501 -> 0.9.5.1<br />
<br />
PDEL-1001 running FW 1.692: <br />
<source>SCVersion: 0.9.2.4</source><br />
<br />
PDEL-1001 running FW 3.600-3.680:<br />
<source>SCVersion: 1.0.3.6</source><br />
<br />
=== Downgrade ===<br />
<br />
Syscon is downgradable on DEM/PDEL/PTEL/QAF units. It might also be downgraded on retail when using a downgrade enabler like modoru.<br />
<br />
= Firmware =<br />
<br />
See [[Ernie Firmware]]<br />
<br />
[[Category:Devices]]</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=IdStorage&diff=20870
IdStorage
2023-12-26T12:16:36Z
<p>CreepNT: /* Leaf content */ Move string emptyness being 0 into conventions</p>
<hr />
<div>See also [https://playstationdev.wiki/pspdevwiki/index.php?title=IDStorage].<br />
<br />
= Description =<br />
<br />
Region of the PSVita eMMC where perconsole info is stored.<br />
<br />
= Location =<br />
<br />
Idstorage data is stored at first raw partition (code 0x1). Use [https://github.com/TeamMolecule/sceutils/blob/master/extract_idstorage.py] to extract.<br />
<br />
= Structure =<br />
<br />
The IdStorage partition is divided in two parts: the mapping table and the leaves.<br />
<br />
== Mapping table ==<br />
<br />
The mapping table is located at the start of the partition. It's an array of 16-bit leaf IDs that serves as a leaf ID->index mapping table. The mapping table must be at least one-sector wide but may be bigger.<br />
<br />
There are two leaf IDs reserved for usage in the mapping table: all entries corresponding to the mapping table (i.e. the first <code>M</code> entries for an </code>M</code> sectors sized table) must hold the value <code>0xFFF5</code>, and all unallocated leaves hold the value <code>0xFFFF</code>.<br />
<br />
To lookup a leaf index based on its ID, use the following algorithm:<br />
<source lang="C"><br />
#define M /* implementation defined */<br />
#define SECTOR_SIZE (512)<br />
<br />
#define NUM_TABLE_ITEMS ((M * SECTOR_SIZE) / sizeof(uint16_t))<br />
uint16_t g_mappingTable[NUM_TABLE_ITEMS];<br />
<br />
int leafIndexFromId(unsigned id) {<br />
if (id >= 0xFFF0)<br />
return /* ERROR: invalid leaf ID */;<br />
<br />
for (int i = 0; i < NUM_TABLE_ITEMS; i++) {<br />
if (g_mappingTable[i] == id)<br />
return i;<br />
}<br />
return /* ERROR: leaf ID is not in mapping table */;<br />
}<br />
</source><br />
<br />
== Leaves ==<br />
<br />
Leaves are sector-sized (512 bytes) areas in the IdStorage partition used to store arbitrary data. While the data stored may be smaller, a leaf always occupies one sector in the partition.<br />
<br />
To read a leaf's data, obtain the leaf index (this can be known directly, or obtained from a leaf ID using the previously mentioned algorithm) then read 512 bytes starting at offset <code>512 * leafIndex</code> in the IdStorage partition.<br />
<br />
== Limits ==<br />
<br />
The number of leaves that can be stored in an IdStorage partition is limited by three factors: the size of the partition, the size of the mapping table and the size of leaf IDs.<br />
<br />
* An <code>M</code> sectors wide mapping table can hold up to <code>255 * M</code> leaves<br />
** This is because a single-sector mapping table can reference <code>SECTOR_SIZE/sizeof(u16) - 1 = 255</code> leaves (the <code>- 1</code> is needed because a table consumes one entry for itself)<br />
* A <code>P</code> sectors wide partition can hold up to <code>P - M</code> leaves<br />
** This is because leaves are sector-sized, and the mapping table consumes <code>M</code> sectors<br />
* There are 65520 leaf IDs available<br />
** While an unsigned 16-bit variable can hold 65536 values, IDs superior or equal to 0xFFF0 are reserved and cannot be used<br />
<br />
From this, we can conclude that an IdStorage partition of <code>P</code> sectors with an <code>M</code> sectors mapping table can hold up to <code>min(255*M, P-M, 65520)</code> leaves. We can also deduce an IdStorage partition is optimally shaped (no space is non-allocatable) when <code>P = 256 * M</code>.<br />
<br />
On Vita, the IdStorage partition is 512KiB and 32 sectors are reserved for the indexing table (<code>P = 1024, M = 32</code>, a non-optimal choice), which means the console's partition can hold '''up to 992 IdStorage leaves'''.<br />
<br />
= Leaf content =<br />
<br />
In this section, the following conventions and terms are used:<br />
* Empty: area has all bits set to 1 (i.e., 0xFF)<br />
* Present / Not present: the leaf exists in IdStorage partition<br />
* The content of a leaf always starts at offset 0.<br />
* If leaf contents are smaller than 512 bytes, the unused parts are left empty.<br />
* Strings are padded with NUL bytes if the content is smaller than maximum size, but may be non-NUL terminated<br />
<br />
Leaves not listed in this section have not been found in any unit, and leaves listed in this section are not all found in every unit.<br />
<br />
The following information may not be valid for all pre-production units (DEM/CEM).<br />
<br />
== Idps certificates ==<br />
<br />
Leaves 0x000~0x07F are written to IdStorage during manufacturing by a function called '''<code>_writeIdpsCert</code>'''.<br />
<br />
Leaf 0x07E contains the signed SHA-256 digest of leaves 0x000~0x07D (signed using RSA-2048). The public key used for signature verification can be found in <code>factTest.self</code>.<br />
<br />
Leaf 0x07F is not covered by the signature but is flashed in <code>_writeIdpsCert</code> nonetheless.<br />
<br />
=== Empty leaves ===<br />
<br />
The following leaves have always been observed to only contain zeroes:<br />
* 0x008~0x01F<br />
* 0x028~0x03F<br />
* 0x050~0x07D<br />
* 0x7F<br />
<br />
=== 0x000~0x007 - SceIdStoragePspCertificates ===<br />
<br />
Identical across all units and duplicated in leaves 0x020 to 0x027.<br />
<br />
=== 0x040~0x047 - SceIdStoragePsp2Certificates ===<br />
<br />
Console-unique.<br />
<br />
=== 0x048~0x04F ===<br />
<br />
Console-unique. May be certificate(s).<br />
<br />
=== 0x07E ===<br />
<br />
Console-unique.<br />
<br />
The RSA-2048 signature of the Idps certificates (2048 bits/256 bytes) is located at offset 0x60 of this leaf.<br />
<br />
Data contained between 0x0 and 0x5F is unknown, and data between 0x160 and 0x1FF is unused (always 00).<br />
<br />
== 0x80 - SMI ==<br />
<br />
Service / Manufacturing Information (SMI)<br />
<br />
Console-unique. Contains minimal firmware version (checked in [[Second Loader|<code>second_loader</code>]]).<br />
<br />
<source lang="c"><br />
struct SMILeaf {<br />
uint8_t magic[4]; //'SMI\0'<br />
uint32_t version; //1<br />
uint32_t min_fwv; //Minimal firmware version<br />
uint8_t unused[0x80 - 0xC];<br />
//Encrypted with per-console keys.<br />
//This is used to verify the leaf has not been modified.<br />
uint8_t encrypted_data[0x200 - 0x80];<br />
};<br />
</source><br />
<br />
== 0x100 ==<br />
<br />
Name may be <code>Idlog</code>.<br />
<br />
Console-unique. Two strings related to manufacturing.<br />
<br />
Both strings are 0x100 bytes wide; one starts at offset 0 and one at offset 0x100.<br />
<br />
The string at offset 0x100 is written at a different stage (end of manufacturing?) than the string at offset 0, so it is possible to find units with only first string written (e.g., a Dolphin CEM-3000 unit).<br />
<br />
== 0x102 ==<br />
<br />
Console-unique. Per-console factory/service product information.<br />
<br />
== 0x103 ==<br />
<br />
Console-unique. Unit hardware information.<br />
<br />
{| class="wikitable" style="text-align:center"<br />
|-<br />
! Offset<br />
! Size<br />
! Name<br />
! Description<br />
|-<br />
| 0x000<br />
| 0x4<br />
| ErnieHwInfo<br />
| style="text-align:left;" | [[KBL_Param#Hardware_Info|Ernie (Syscon) Hardware Information]]<br />
|-<br />
| 0x004<br />
| 0x4<br />
| ErnieFwVersion<br />
| style="text-align:left;" | [[SceSyscon#sceSysconGetErnieVersionForDriver|Ernie Firmware Version]] (also called Ernie Verison)<br />
|-<br />
| 0x008<br />
| 0x4<br />
| ErnieDlVersion<br />
| style="text-align:left;" | [[SceSyscon#sceSysconGetErnieDLVersionForDriver|ErnieDlVersion]]<br />
|-<br />
| 0x00C<br />
| 0x2<br />
| ErnieCfgVersion<br />
| style="text-align:left;" | Obtained from <code>scePdPowerGetConfigStorageInfo</code>. Part of the [[Syscon]] "ConfZZ" header.<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x00E<br />
| 0x12<br />
| colspan="2" | Empty<br />
|-<br />
| 0x020<br />
| 0x8<br />
| EmmcFwVersion<br />
| style="text-align:left;" | Vendor ID (1 byte), empty space (1 byte) and Device Version (6 bytes)<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x028<br />
| 0x8<br />
| colspan="2" | Empty<br />
|-<br />
| 0x030<br />
| 0x8<br />
| EmmcFwVersion2<br />
| style="text-align:left;" | Vendor ID (1 byte), Device Version (6 bytes) and an additional byte (for Samsung eMMC, 0 otherwise)<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x038<br />
| 0x8<br />
| colspan="2" | Empty<br />
|-<br />
| 0x040<br />
| 0x2<br />
| ElmoFWVer<br />
| style="text-align:left;" | [[SceSyscon#sceSysconGetElmoFwVersionForDriver|Elmo Firmware Version]]<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x042<br />
| 0x1E<br />
| colspan="2" | Empty<br />
|-<br />
| 0x060<br />
| 0x2<br />
| CookieFWVer<br />
| style="text-align:left;" | [[SceSyscon#sceSysconGetCookieFwVersionForDriver|Cookie Firmware Version]]<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x062<br />
| 0x1E<br />
| colspan="2" | Empty<br />
|-<br />
| 0x080<br />
| 0x2<br />
| BarkleyFwVersion<br />
| rowspan="2" style="text-align:left;" | [[SceSyscon#sceSysconMotionGetDeviceInfoForDriver|Motion Device]] Firmware Version/Hardware Information<br />
|-<br />
| 0x082<br />
| 0x2<br />
| BarkleyHwInfo<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x084<br />
| 0x1C<br />
| colspan="2" | Empty<br />
|-<br />
| 0x0A0<br />
| 0x2<br />
| AbbyHWVersion<br />
| rowspan="3" style="text-align:left;" | [[SceSyscon#sceSysconGetBatteryVersionForDriver|Abby HW/FW/DF Version]]<br />
|-<br />
| 0x0A2<br />
| 0x2<br />
| AbbyFWVersion<br />
|-<br />
| 0x0A4<br />
| 0x2<br />
| AbbyDFVersion<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x0A6<br />
| 0x02<br />
| colspan="2" | Empty<br />
|-<br />
| 0x0A8<br />
| 0x02<br />
| BatteryVoltageCalib<br />
| rowspan="2" style="text-align:left;" | Battery calibration data (for Abby)<br />
|-<br />
| 0x0AA<br />
| 0x02<br />
| BatteryCurrentCalib<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x0AC<br />
| 0x14<br />
| colspan="2" | Empty<br />
|-<br />
| 0x0C0<br />
| 0x8<br />
| TouchpanelFWVersion<br />
| style="text-align:left;" | [[SceSyscon#sceSysconGetTouchpanelDeviceInfoForDriver|Touchpanel Version info]] (4 <code>u16</code>s)<br />
|-<br />
| 0x0C8<br />
| 0x4<br />
| TouchpanelConfigVersion<br />
| style="text-align:left;" | 2 <code>u16</code>s<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x0CC<br />
| 0x4<br />
| colspan="2" | Empty<br />
|-<br />
| 0x0D0<br />
| 0x10<br />
| TouchpanelLotInfo<br />
| style="text-align:left;" | 8 bytes for each panel<br />
|-<br />
| 0x0E0<br />
| 0x4<br />
| WlanBtHWRevision<br />
| style="text-align:left;" | WLAN/Bluetooth Hardware Revision<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x0E4<br />
| 0x4<br />
| colspan="2" | Empty<br />
|-<br />
| 0x0E8<br />
| 0x6<br />
| WlanMacAddress<br />
| style="text-align:left;" | WLAN MAC Address<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x0EE<br />
| 0x2<br />
| colspan="2" | Empty<br />
|-<br />
| 0x0F0<br />
| 0x6<br />
| BtMacAddress<br />
| style="text-align:left;" | Bluetooth MAC Address (usually equal to WlanMacAddress + 1)<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x0F6<br />
| 0xA<br />
| colspan="2" | Empty<br />
|-<br />
| 0x100<br />
| 0x20<br />
| BatteryLotInfo<br />
| style="text-align:left;" | ASCII string<br />
|-<br />
| 0x120<br />
| 0x84<br />
| <br />
| style="text-align:left;" | An ASCII string containing a date.<br />
|-<br />
| 0x184<br />
| 0x10<br />
| OLEDLotInfo<br />
| style="text-align:left;" | ASCII string<br />
|-<br />
| 0x194<br />
| 0x10<br />
| <br />
| style="text-align:left;" | An ASCII string (usually starting with TDA).<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x1A4<br />
| 0x4<br />
| colspan="2" | Empty<br />
|-<br />
| 0x1A8<br />
| 0x20<br />
| LcdModLotInfo<br />
| style="text-align:left;" | ASCII string<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x1C8<br />
| 0x38<br />
| colspan="2" | Empty<br />
|}<br />
<br />
== 0x104 ==<br />
<br />
Console-unique. Test/diagnostic results.<br />
<br />
This leaf is only present if diagnostic software has been executed on the unit or some factory tests failed.<br />
<br />
== 0x110 - WlanRegion ==<br />
<br />
The following algorithm is used to derive it from PsCode:<br />
<source lang="c"><br />
byte WlanRegion[3]; //Leaf contains only 3 bytes of data<br />
<br />
switch(pscode.product_code) {<br />
case 0x100:<br />
case 0x101:<br />
case 0x102:<br />
case 0x104:<br />
case 0x10B:<br />
case 0x10F:<br />
case 0x110:<br />
case 0x111:<br />
WlanRegion[2] = 0;<br />
WlanRegion[1] = 7;<br />
break;<br />
case 0x103:<br />
case 0x106:<br />
case 0x108:<br />
case 0x10A:<br />
case 0x10D:<br />
case 0x10E:<br />
WlanRegion[2] = 0;<br />
WlanRegion[1] = 0x1F;<br />
break;<br />
case 0x105:<br />
case 0x107:<br />
case 0x109:<br />
case 0x10C:<br />
WlanRegion[2] = 1;<br />
WlanRegion[1] = 0x1F;<br />
break;<br />
default:<br />
goto error;<br />
}<br />
WlanRegion[0] = 0xFF;<br />
</source><br />
<br />
== 0x111 - WlanMacAddress ==<br />
<br />
Console-unique. The MAC address of the Wireless LAN adapter (6 bytes).<br />
<br />
== 0x112 - MtpSerial ==<br />
<br />
Console-unique. The serial number reported via the MTP protocol (32 UTF-16 characters).<br />
<br />
== 0x113 ==<br />
<br />
Console-unique on 3G units and empty on all others. Contains informations related to the 3G modem.<br />
<br />
== 0x114 - DeviceLocation ==<br />
<br />
Identical for all consoles of a generation (one kind for Fat, one kind for Slim, empty on PSTV).<br />
<br />
Contains four <code>struct DeviceLocation</code>s describing the location of physical devices in the unit.<br />
<br />
<source lang="c><br />
struct DeviceLocation { //size is 0x10 bytes<br />
//0x00 - Front camera<br />
//0x01 - Back camera<br />
//0x10 - Accelerometer<br />
//0x11 - Gyro<br />
uint32_t type;<br />
int32_t x;<br />
int32_t y;<br />
int32_t z;<br />
};<br />
</source><br />
<br />
The structures are usually found in the following order: Cameras followed by Motion (Acc + Gyro).<br />
<br />
There is also an unknown int32 flag at offset 0x100.<br />
<br />
== 0x115 - ProductTypeInfo ==<br />
<br />
Identical for all consoles "with same SKU". A string of 16 characters containing information about the product type.<br />
<br />
Example values:<br />
* <code>PDEL100000010000</code> (PDEL-1000)<br />
* <code>PCH01004ZAZ20000</code> (PCH-1004 - Call of Duty: Black Ops Declassified limited edition)<br />
* <code>PCH01100AA010002</code> (Crystal Black PCH-1100 - docomo carrier)<br />
* <code>PCH02000ZA120000</code> (White PCH-2000)<br />
<br />
Decomposition: <code>FFFF NNNN PPPP xxx O</code><br />
* <code>FFFF-NNNN PPPP</code> is usually printed on the product's box<br />
** <code>FFFF</code> = family (e.g., PCH, PDEL)<br />
** <code>NNNN</code> = number (e.g., 1000, 1004, 1100)<br />
** <code>PPPP</code> = variant code (e.g., 0001, ZAZ2, AA01, ZA12)<br />
* <code>xxx</code> = ? (always 000?)<br />
* <code>O</code> = Product target operator (carrier ID for 3G models - usually matches offset 0x88 of leaf 0x113 on SIM-locked models).<br />
** 1: US operator<br />
** 2: JP operator<br />
** 3: EU generic<br />
** 4: Asia generic<br />
** 5: Canada operator<br />
** 6: Mexico generic<br />
<br />
== 0x116 - ColorVariation ==<br />
<br />
Used for wave color by SceShell if present. ([https://github.com/Princess-of-Sleeping/psp2wpp/blob/master/src/main.c#L441-L467 Patch example])<br />
<br />
<source lang="c"><br />
struct ColorVariation {<br />
uint8_t unk0;<br />
uint16_t unk1; //maybe just two uint8_t?<br />
uint8_t unk3;<br />
/* rest of the leaf is empty */<br />
};<br />
</source><br />
<br />
Example values:<br />
* Call of Duty: Black Ops Declassified limited edition PCH-1004: <code>{ 0x01, 0x0000, 0x00 }</code><br />
* Glacier White PCH-2000 / White PSTV: <code>{ 0x01, 0x000C, 0x00 }</code><br />
<br />
== 0x117 - TemperatureThreashold ==<br />
<br />
The typo in this leaf's name is present in SCE code.<br />
<br />
Contains 4 elements of 1 byte each, which are always all zeroes when the leaf is present.<br />
<br />
Sent to Syscon?<br />
<br />
== 0x118 - AudioParam ==<br />
<br />
1 byte. If set to 0 (or the leaf is absent?), AVLS is never forcefully enabled.<br />
<br />
Should be 0x0 except on units with PsCode Product Code 0x105 (Europe/East/Africa), 0x107 (Great Britain/United Kingdom) or 0x109 (Australia/New Zealand).<br />
<br />
== 0x119 - EtherMacAddress ==<br />
<br />
Console-unique. The MAC address of the Ethernet adapter (6 bytes).<br />
<br />
Empty or not present for non-PSTV units.<br />
<br />
== 0x11A - WebBrowserParam ==<br />
<br />
1 byte.<br />
<br />
Seen:<br />
0x02 on PCH200X, 0x11 on PSTV<br />
<br />
Should be 0x1 on Fat CEX/DEX, 0x2 on Slim, 0x11 on PSTV and 0x0 on all other units.<br />
<br />
== 0x11B - ShutterParam ==<br />
<br />
1 byte. When leaf is present and contains 0x01, the value returned by <code>sceAVConfigGetShutterVol()</code> changes from 30 to 26.<br />
<br />
Seen: 0x01 on PCH200X, 0x00 on PSTV.<br />
<br />
Should be 0x1 on Slim units and 0x0 on all others.<br />
<br />
== 0x11C - LedInfoParam ==<br />
<br />
1 byte.<br />
<br />
Seen: 0x01 on PCH200X, 0x00 on PSTV<br />
<br />
Should be 0x1 on Slim units and 0x0 on all others.</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=IdStorage&diff=20869
IdStorage
2023-12-26T01:32:47Z
<p>CreepNT: /* 0x103 */ Replace with a formatted table</p>
<hr />
<div>See also [https://playstationdev.wiki/pspdevwiki/index.php?title=IDStorage].<br />
<br />
= Description =<br />
<br />
Region of the PSVita eMMC where perconsole info is stored.<br />
<br />
= Location =<br />
<br />
Idstorage data is stored at first raw partition (code 0x1). Use [https://github.com/TeamMolecule/sceutils/blob/master/extract_idstorage.py] to extract.<br />
<br />
= Structure =<br />
<br />
The IdStorage partition is divided in two parts: the mapping table and the leaves.<br />
<br />
== Mapping table ==<br />
<br />
The mapping table is located at the start of the partition. It's an array of 16-bit leaf IDs that serves as a leaf ID->index mapping table. The mapping table must be at least one-sector wide but may be bigger.<br />
<br />
There are two leaf IDs reserved for usage in the mapping table: all entries corresponding to the mapping table (i.e. the first <code>M</code> entries for an </code>M</code> sectors sized table) must hold the value <code>0xFFF5</code>, and all unallocated leaves hold the value <code>0xFFFF</code>.<br />
<br />
To lookup a leaf index based on its ID, use the following algorithm:<br />
<source lang="C"><br />
#define M /* implementation defined */<br />
#define SECTOR_SIZE (512)<br />
<br />
#define NUM_TABLE_ITEMS ((M * SECTOR_SIZE) / sizeof(uint16_t))<br />
uint16_t g_mappingTable[NUM_TABLE_ITEMS];<br />
<br />
int leafIndexFromId(unsigned id) {<br />
if (id >= 0xFFF0)<br />
return /* ERROR: invalid leaf ID */;<br />
<br />
for (int i = 0; i < NUM_TABLE_ITEMS; i++) {<br />
if (g_mappingTable[i] == id)<br />
return i;<br />
}<br />
return /* ERROR: leaf ID is not in mapping table */;<br />
}<br />
</source><br />
<br />
== Leaves ==<br />
<br />
Leaves are sector-sized (512 bytes) areas in the IdStorage partition used to store arbitrary data. While the data stored may be smaller, a leaf always occupies one sector in the partition.<br />
<br />
To read a leaf's data, obtain the leaf index (this can be known directly, or obtained from a leaf ID using the previously mentioned algorithm) then read 512 bytes starting at offset <code>512 * leafIndex</code> in the IdStorage partition.<br />
<br />
== Limits ==<br />
<br />
The number of leaves that can be stored in an IdStorage partition is limited by three factors: the size of the partition, the size of the mapping table and the size of leaf IDs.<br />
<br />
* An <code>M</code> sectors wide mapping table can hold up to <code>255 * M</code> leaves<br />
** This is because a single-sector mapping table can reference <code>SECTOR_SIZE/sizeof(u16) - 1 = 255</code> leaves (the <code>- 1</code> is needed because a table consumes one entry for itself)<br />
* A <code>P</code> sectors wide partition can hold up to <code>P - M</code> leaves<br />
** This is because leaves are sector-sized, and the mapping table consumes <code>M</code> sectors<br />
* There are 65520 leaf IDs available<br />
** While an unsigned 16-bit variable can hold 65536 values, IDs superior or equal to 0xFFF0 are reserved and cannot be used<br />
<br />
From this, we can conclude that an IdStorage partition of <code>P</code> sectors with an <code>M</code> sectors mapping table can hold up to <code>min(255*M, P-M, 65520)</code> leaves. We can also deduce an IdStorage partition is optimally shaped (no space is non-allocatable) when <code>P = 256 * M</code>.<br />
<br />
On Vita, the IdStorage partition is 512KiB and 32 sectors are reserved for the indexing table (<code>P = 1024, M = 32</code>, a non-optimal choice), which means the console's partition can hold '''up to 992 IdStorage leaves'''.<br />
<br />
= Leaf content =<br />
<br />
In this section, the following conventions and terms are used:<br />
* Empty: area has all bits set to 1 (i.e., 0xFF)<br />
* Present / Not present: the leaf exists in IdStorage partition<br />
* The content of a leaf always starts at offset 0.<br />
* If leaf contents are smaller than 512 bytes, the unused parts are left empty.<br />
<br />
Leaves not listed in this section have not been found in any unit, and leaves listed in this section are not all found in every unit.<br />
<br />
The following information may not be valid for all pre-production units (DEM/CEM).<br />
<br />
== Idps certificates ==<br />
<br />
Leaves 0x000~0x07F are written to IdStorage during manufacturing by a function called '''<code>_writeIdpsCert</code>'''.<br />
<br />
Leaf 0x07E contains the signed SHA-256 digest of leaves 0x000~0x07D (signed using RSA-2048). The public key used for signature verification can be found in <code>factTest.self</code>.<br />
<br />
Leaf 0x07F is not covered by the signature but is flashed in <code>_writeIdpsCert</code> nonetheless.<br />
<br />
=== Empty leaves ===<br />
<br />
The following leaves have always been observed to only contain zeroes:<br />
* 0x008~0x01F<br />
* 0x028~0x03F<br />
* 0x050~0x07D<br />
* 0x7F<br />
<br />
=== 0x000~0x007 - SceIdStoragePspCertificates ===<br />
<br />
Identical across all units and duplicated in leaves 0x020 to 0x027.<br />
<br />
=== 0x040~0x047 - SceIdStoragePsp2Certificates ===<br />
<br />
Console-unique.<br />
<br />
=== 0x048~0x04F ===<br />
<br />
Console-unique. May be certificate(s).<br />
<br />
=== 0x07E ===<br />
<br />
Console-unique.<br />
<br />
The RSA-2048 signature of the Idps certificates (2048 bits/256 bytes) is located at offset 0x60 of this leaf.<br />
<br />
Data contained between 0x0 and 0x5F is unknown, and data between 0x160 and 0x1FF is unused (always 00).<br />
<br />
== 0x80 - SMI ==<br />
<br />
Service / Manufacturing Information (SMI)<br />
<br />
Console-unique. Contains minimal firmware version (checked in [[Second Loader|<code>second_loader</code>]]).<br />
<br />
<source lang="c"><br />
struct SMILeaf {<br />
uint8_t magic[4]; //'SMI\0'<br />
uint32_t version; //1<br />
uint32_t min_fwv; //Minimal firmware version<br />
uint8_t unused[0x80 - 0xC];<br />
//Encrypted with per-console keys.<br />
//This is used to verify the leaf has not been modified.<br />
uint8_t encrypted_data[0x200 - 0x80];<br />
};<br />
</source><br />
<br />
== 0x100 ==<br />
<br />
Name may be <code>Idlog</code>.<br />
<br />
Console-unique. Strings related to manufacturing.<br />
<br />
One string starts at offset 0, and one string starts at offset 0x100. Both strings occupy 0x100 bytes (unused space is filled with zeroes).<br />
<br />
The string at offset 0x100 is written at a different stage (end of manufacturing?) than the string at offset 0, so it is possible to find units with only first string written (e.g., a Dolphin CEM-3000 unit).<br />
<br />
== 0x102 ==<br />
<br />
Console-unique. Per-console factory/service product information.<br />
<br />
== 0x103 ==<br />
<br />
Console-unique. Unit hardware information.<br />
<br />
{| class="wikitable" style="text-align:center"<br />
|-<br />
! Offset<br />
! Size<br />
! Name<br />
! Description<br />
|-<br />
| 0x000<br />
| 0x4<br />
| ErnieHwInfo<br />
| style="text-align:left;" | [[KBL_Param#Hardware_Info|Ernie (Syscon) Hardware Information]]<br />
|-<br />
| 0x004<br />
| 0x4<br />
| ErnieFwVersion<br />
| style="text-align:left;" | [[SceSyscon#sceSysconGetErnieVersionForDriver|Ernie Firmware Version]] (also called Ernie Verison)<br />
|-<br />
| 0x008<br />
| 0x4<br />
| ErnieDlVersion<br />
| style="text-align:left;" | [[SceSyscon#sceSysconGetErnieDLVersionForDriver|ErnieDlVersion]]<br />
|-<br />
| 0x00C<br />
| 0x2<br />
| ErnieCfgVersion<br />
| style="text-align:left;" | Obtained from <code>scePdPowerGetConfigStorageInfo</code>. Part of the [[Syscon]] "ConfZZ" header.<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x00E<br />
| 0x12<br />
| colspan="2" | Empty<br />
|-<br />
| 0x020<br />
| 0x8<br />
| EmmcFwVersion<br />
| style="text-align:left;" | Vendor ID (1 byte), empty space (1 byte) and Device Version (6 bytes)<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x028<br />
| 0x8<br />
| colspan="2" | Empty<br />
|-<br />
| 0x030<br />
| 0x8<br />
| EmmcFwVersion2<br />
| style="text-align:left;" | Vendor ID (1 byte), Device Version (6 bytes) and an additional byte (for Samsung eMMC, 0 otherwise)<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x038<br />
| 0x8<br />
| colspan="2" | Empty<br />
|-<br />
| 0x040<br />
| 0x2<br />
| ElmoFWVer<br />
| style="text-align:left;" | [[SceSyscon#sceSysconGetElmoFwVersionForDriver|Elmo Firmware Version]]<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x042<br />
| 0x1E<br />
| colspan="2" | Empty<br />
|-<br />
| 0x060<br />
| 0x2<br />
| CookieFWVer<br />
| style="text-align:left;" | [[SceSyscon#sceSysconGetCookieFwVersionForDriver|Cookie Firmware Version]]<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x062<br />
| 0x1E<br />
| colspan="2" | Empty<br />
|-<br />
| 0x080<br />
| 0x2<br />
| BarkleyFwVersion<br />
| rowspan="2" style="text-align:left;" | [[SceSyscon#sceSysconMotionGetDeviceInfoForDriver|Motion Device]] Firmware Version/Hardware Information<br />
|-<br />
| 0x082<br />
| 0x2<br />
| BarkleyHwInfo<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x084<br />
| 0x1C<br />
| colspan="2" | Empty<br />
|-<br />
| 0x0A0<br />
| 0x2<br />
| AbbyHWVersion<br />
| rowspan="3" style="text-align:left;" | [[SceSyscon#sceSysconGetBatteryVersionForDriver|Abby HW/FW/DF Version]]<br />
|-<br />
| 0x0A2<br />
| 0x2<br />
| AbbyFWVersion<br />
|-<br />
| 0x0A4<br />
| 0x2<br />
| AbbyDFVersion<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x0A6<br />
| 0x02<br />
| colspan="2" | Empty<br />
|-<br />
| 0x0A8<br />
| 0x02<br />
| BatteryVoltageCalib<br />
| rowspan="2" style="text-align:left;" | Battery calibration data (for Abby)<br />
|-<br />
| 0x0AA<br />
| 0x02<br />
| BatteryCurrentCalib<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x0AC<br />
| 0x14<br />
| colspan="2" | Empty<br />
|-<br />
| 0x0C0<br />
| 0x8<br />
| TouchpanelFWVersion<br />
| style="text-align:left;" | [[SceSyscon#sceSysconGetTouchpanelDeviceInfoForDriver|Touchpanel Version info]] (4 <code>u16</code>s)<br />
|-<br />
| 0x0C8<br />
| 0x4<br />
| TouchpanelConfigVersion<br />
| style="text-align:left;" | 2 <code>u16</code>s<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x0CC<br />
| 0x4<br />
| colspan="2" | Empty<br />
|-<br />
| 0x0D0<br />
| 0x10<br />
| TouchpanelLotInfo<br />
| style="text-align:left;" | 8 bytes for each panel<br />
|-<br />
| 0x0E0<br />
| 0x4<br />
| WlanBtHWRevision<br />
| style="text-align:left;" | WLAN/Bluetooth Hardware Revision<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x0E4<br />
| 0x4<br />
| colspan="2" | Empty<br />
|-<br />
| 0x0E8<br />
| 0x6<br />
| WlanMacAddress<br />
| style="text-align:left;" | WLAN MAC Address<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x0EE<br />
| 0x2<br />
| colspan="2" | Empty<br />
|-<br />
| 0x0F0<br />
| 0x6<br />
| BtMacAddress<br />
| style="text-align:left;" | Bluetooth MAC Address (usually equal to WlanMacAddress + 1)<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x0F6<br />
| 0xA<br />
| colspan="2" | Empty<br />
|-<br />
| 0x100<br />
| 0x20<br />
| BatteryLotInfo<br />
| style="text-align:left;" | ASCII string<br />
|-<br />
| 0x120<br />
| 0x84<br />
| <br />
| style="text-align:left;" | An ASCII string containing a date.<br />
|-<br />
| 0x184<br />
| 0x10<br />
| OLEDLotInfo<br />
| style="text-align:left;" | ASCII string<br />
|-<br />
| 0x194<br />
| 0x10<br />
| <br />
| style="text-align:left;" | An ASCII string (usually starting with TDA).<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x1A4<br />
| 0x4<br />
| colspan="2" | Empty<br />
|-<br />
| 0x1A8<br />
| 0x20<br />
| LcdModLotInfo<br />
| style="text-align:left;" | ASCII string<br />
|- style="font-style:italic; font-family:serif !important;"<br />
| 0x1C8<br />
| 0x38<br />
| colspan="2" | Empty<br />
|}<br />
<br />
== 0x104 ==<br />
<br />
Console-unique. Test/diagnostic results.<br />
<br />
This leaf is only present if diagnostic software has been executed on the unit or some factory tests failed.<br />
<br />
== 0x110 - WlanRegion ==<br />
<br />
The following algorithm is used to derive it from PsCode:<br />
<source lang="c"><br />
byte WlanRegion[3]; //Leaf contains only 3 bytes of data<br />
<br />
switch(pscode.product_code) {<br />
case 0x100:<br />
case 0x101:<br />
case 0x102:<br />
case 0x104:<br />
case 0x10B:<br />
case 0x10F:<br />
case 0x110:<br />
case 0x111:<br />
WlanRegion[2] = 0;<br />
WlanRegion[1] = 7;<br />
break;<br />
case 0x103:<br />
case 0x106:<br />
case 0x108:<br />
case 0x10A:<br />
case 0x10D:<br />
case 0x10E:<br />
WlanRegion[2] = 0;<br />
WlanRegion[1] = 0x1F;<br />
break;<br />
case 0x105:<br />
case 0x107:<br />
case 0x109:<br />
case 0x10C:<br />
WlanRegion[2] = 1;<br />
WlanRegion[1] = 0x1F;<br />
break;<br />
default:<br />
goto error;<br />
}<br />
WlanRegion[0] = 0xFF;<br />
</source><br />
<br />
== 0x111 - WlanMacAddress ==<br />
<br />
Console-unique. The MAC address of the Wireless LAN adapter (6 bytes).<br />
<br />
== 0x112 - MtpSerial ==<br />
<br />
Console-unique. The serial number reported via the MTP protocol (32 UTF-16 characters).<br />
<br />
== 0x113 ==<br />
<br />
Console-unique on 3G units and empty on all others. Contains informations related to the 3G modem.<br />
<br />
== 0x114 - DeviceLocation ==<br />
<br />
Identical for all consoles of a generation (one kind for Fat, one kind for Slim, empty on PSTV).<br />
<br />
Contains four <code>struct DeviceLocation</code>s describing the location of physical devices in the unit.<br />
<br />
<source lang="c><br />
struct DeviceLocation { //size is 0x10 bytes<br />
//0x00 - Front camera<br />
//0x01 - Back camera<br />
//0x10 - Accelerometer<br />
//0x11 - Gyro<br />
uint32_t type;<br />
int32_t x;<br />
int32_t y;<br />
int32_t z;<br />
};<br />
</source><br />
<br />
The structures are usually found in the following order: Cameras followed by Motion (Acc + Gyro).<br />
<br />
There is also an unknown int32 flag at offset 0x100.<br />
<br />
== 0x115 - ProductTypeInfo ==<br />
<br />
Identical for all consoles "with same SKU". A string of 16 characters containing information about the product type.<br />
<br />
Example values:<br />
* <code>PDEL100000010000</code> (PDEL-1000)<br />
* <code>PCH01004ZAZ20000</code> (PCH-1004 - Call of Duty: Black Ops Declassified limited edition)<br />
* <code>PCH01100AA010002</code> (Crystal Black PCH-1100 - docomo carrier)<br />
* <code>PCH02000ZA120000</code> (White PCH-2000)<br />
<br />
Decomposition: <code>FFFF NNNN PPPP xxx O</code><br />
* <code>FFFF-NNNN PPPP</code> is usually printed on the product's box<br />
** <code>FFFF</code> = family (e.g., PCH, PDEL)<br />
** <code>NNNN</code> = number (e.g., 1000, 1004, 1100)<br />
** <code>PPPP</code> = variant code (e.g., 0001, ZAZ2, AA01, ZA12)<br />
* <code>xxx</code> = ? (always 000?)<br />
* <code>O</code> = Product target operator (carrier ID for 3G models - usually matches offset 0x88 of leaf 0x113 on SIM-locked models).<br />
** 1: US operator<br />
** 2: JP operator<br />
** 3: EU generic<br />
** 4: Asia generic<br />
** 5: Canada operator<br />
** 6: Mexico generic<br />
<br />
== 0x116 - ColorVariation ==<br />
<br />
Used for wave color by SceShell if present. ([https://github.com/Princess-of-Sleeping/psp2wpp/blob/master/src/main.c#L441-L467 Patch example])<br />
<br />
<source lang="c"><br />
struct ColorVariation {<br />
uint8_t unk0;<br />
uint16_t unk1; //maybe just two uint8_t?<br />
uint8_t unk3;<br />
/* rest of the leaf is empty */<br />
};<br />
</source><br />
<br />
Example values:<br />
* Call of Duty: Black Ops Declassified limited edition PCH-1004: <code>{ 0x01, 0x0000, 0x00 }</code><br />
* Glacier White PCH-2000 / White PSTV: <code>{ 0x01, 0x000C, 0x00 }</code><br />
<br />
== 0x117 - TemperatureThreashold ==<br />
<br />
The typo in this leaf's name is present in SCE code.<br />
<br />
Contains 4 elements of 1 byte each, which are always all zeroes when the leaf is present.<br />
<br />
Sent to Syscon?<br />
<br />
== 0x118 - AudioParam ==<br />
<br />
1 byte. If set to 0 (or the leaf is absent?), AVLS is never forcefully enabled.<br />
<br />
Should be 0x0 except on units with PsCode Product Code 0x105 (Europe/East/Africa), 0x107 (Great Britain/United Kingdom) or 0x109 (Australia/New Zealand).<br />
<br />
== 0x119 - EtherMacAddress ==<br />
<br />
Console-unique. The MAC address of the Ethernet adapter (6 bytes).<br />
<br />
Empty or not present for non-PSTV units.<br />
<br />
== 0x11A - WebBrowserParam ==<br />
<br />
1 byte.<br />
<br />
Seen:<br />
0x02 on PCH200X, 0x11 on PSTV<br />
<br />
Should be 0x1 on Fat CEX/DEX, 0x2 on Slim, 0x11 on PSTV and 0x0 on all other units.<br />
<br />
== 0x11B - ShutterParam ==<br />
<br />
1 byte. When leaf is present and contains 0x01, the value returned by <code>sceAVConfigGetShutterVol()</code> changes from 30 to 26.<br />
<br />
Seen: 0x01 on PCH200X, 0x00 on PSTV.<br />
<br />
Should be 0x1 on Slim units and 0x0 on all others.<br />
<br />
== 0x11C - LedInfoParam ==<br />
<br />
1 byte.<br />
<br />
Seen: 0x01 on PCH200X, 0x00 on PSTV<br />
<br />
Should be 0x1 on Slim units and 0x0 on all others.</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=IdStorage&diff=20868
IdStorage
2023-12-25T21:11:26Z
<p>CreepNT: /* Leaf content */ Rework descriptions and move leaf names in subsection title when applicable</p>
<hr />
<div>See also [https://playstationdev.wiki/pspdevwiki/index.php?title=IDStorage].<br />
<br />
= Description =<br />
<br />
Region of the PSVita eMMC where perconsole info is stored.<br />
<br />
= Location =<br />
<br />
Idstorage data is stored at first raw partition (code 0x1). Use [https://github.com/TeamMolecule/sceutils/blob/master/extract_idstorage.py] to extract.<br />
<br />
= Structure =<br />
<br />
The IdStorage partition is divided in two parts: the mapping table and the leaves.<br />
<br />
== Mapping table ==<br />
<br />
The mapping table is located at the start of the partition. It's an array of 16-bit leaf IDs that serves as a leaf ID->index mapping table. The mapping table must be at least one-sector wide but may be bigger.<br />
<br />
There are two leaf IDs reserved for usage in the mapping table: all entries corresponding to the mapping table (i.e. the first <code>M</code> entries for an </code>M</code> sectors sized table) must hold the value <code>0xFFF5</code>, and all unallocated leaves hold the value <code>0xFFFF</code>.<br />
<br />
To lookup a leaf index based on its ID, use the following algorithm:<br />
<source lang="C"><br />
#define M /* implementation defined */<br />
#define SECTOR_SIZE (512)<br />
<br />
#define NUM_TABLE_ITEMS ((M * SECTOR_SIZE) / sizeof(uint16_t))<br />
uint16_t g_mappingTable[NUM_TABLE_ITEMS];<br />
<br />
int leafIndexFromId(unsigned id) {<br />
if (id >= 0xFFF0)<br />
return /* ERROR: invalid leaf ID */;<br />
<br />
for (int i = 0; i < NUM_TABLE_ITEMS; i++) {<br />
if (g_mappingTable[i] == id)<br />
return i;<br />
}<br />
return /* ERROR: leaf ID is not in mapping table */;<br />
}<br />
</source><br />
<br />
== Leaves ==<br />
<br />
Leaves are sector-sized (512 bytes) areas in the IdStorage partition used to store arbitrary data. While the data stored may be smaller, a leaf always occupies one sector in the partition.<br />
<br />
To read a leaf's data, obtain the leaf index (this can be known directly, or obtained from a leaf ID using the previously mentioned algorithm) then read 512 bytes starting at offset <code>512 * leafIndex</code> in the IdStorage partition.<br />
<br />
== Limits ==<br />
<br />
The number of leaves that can be stored in an IdStorage partition is limited by three factors: the size of the partition, the size of the mapping table and the size of leaf IDs.<br />
<br />
* An <code>M</code> sectors wide mapping table can hold up to <code>255 * M</code> leaves<br />
** This is because a single-sector mapping table can reference <code>SECTOR_SIZE/sizeof(u16) - 1 = 255</code> leaves (the <code>- 1</code> is needed because a table consumes one entry for itself)<br />
* A <code>P</code> sectors wide partition can hold up to <code>P - M</code> leaves<br />
** This is because leaves are sector-sized, and the mapping table consumes <code>M</code> sectors<br />
* There are 65520 leaf IDs available<br />
** While an unsigned 16-bit variable can hold 65536 values, IDs superior or equal to 0xFFF0 are reserved and cannot be used<br />
<br />
From this, we can conclude that an IdStorage partition of <code>P</code> sectors with an <code>M</code> sectors mapping table can hold up to <code>min(255*M, P-M, 65520)</code> leaves. We can also deduce an IdStorage partition is optimally shaped (no space is non-allocatable) when <code>P = 256 * M</code>.<br />
<br />
On Vita, the IdStorage partition is 512KiB and 32 sectors are reserved for the indexing table (<code>P = 1024, M = 32</code>, a non-optimal choice), which means the console's partition can hold '''up to 992 IdStorage leaves'''.<br />
<br />
= Leaf content =<br />
<br />
In this section, the following conventions and terms are used:<br />
* Empty: area has all bits set to 1 (i.e., 0xFF)<br />
* Present / Not present: the leaf exists in IdStorage partition<br />
* The content of a leaf always starts at offset 0.<br />
* If leaf contents are smaller than 512 bytes, the unused parts are left empty.<br />
<br />
Leaves not listed in this section have not been found in any unit, and leaves listed in this section are not all found in every unit.<br />
<br />
The following information may not be valid for all pre-production units (DEM/CEM).<br />
<br />
== Idps certificates ==<br />
<br />
Leaves 0x000~0x07F are written to IdStorage during manufacturing by a function called '''<code>_writeIdpsCert</code>'''.<br />
<br />
Leaf 0x07E contains the signed SHA-256 digest of leaves 0x000~0x07D (signed using RSA-2048). The public key used for signature verification can be found in <code>factTest.self</code>.<br />
<br />
Leaf 0x07F is not covered by the signature but is flashed in <code>_writeIdpsCert</code> nonetheless.<br />
<br />
=== Empty leaves ===<br />
<br />
The following leaves have always been observed to only contain zeroes:<br />
* 0x008~0x01F<br />
* 0x028~0x03F<br />
* 0x050~0x07D<br />
* 0x7F<br />
<br />
=== 0x000~0x007 - SceIdStoragePspCertificates ===<br />
<br />
Identical across all units and duplicated in leaves 0x020 to 0x027.<br />
<br />
=== 0x040~0x047 - SceIdStoragePsp2Certificates ===<br />
<br />
Console-unique.<br />
<br />
=== 0x048~0x04F ===<br />
<br />
Console-unique. May be certificate(s).<br />
<br />
=== 0x07E ===<br />
<br />
Console-unique.<br />
<br />
The RSA-2048 signature of the Idps certificates (2048 bits/256 bytes) is located at offset 0x60 of this leaf.<br />
<br />
Data contained between 0x0 and 0x5F is unknown, and data between 0x160 and 0x1FF is unused (always 00).<br />
<br />
== 0x80 - SMI ==<br />
<br />
Service / Manufacturing Information (SMI)<br />
<br />
Console-unique. Contains minimal firmware version (checked in [[Second Loader|<code>second_loader</code>]]).<br />
<br />
<source lang="c"><br />
struct SMILeaf {<br />
uint8_t magic[4]; //'SMI\0'<br />
uint32_t version; //1<br />
uint32_t min_fwv; //Minimal firmware version<br />
uint8_t unused[0x80 - 0xC];<br />
//Encrypted with per-console keys.<br />
//This is used to verify the leaf has not been modified.<br />
uint8_t encrypted_data[0x200 - 0x80];<br />
};<br />
</source><br />
<br />
== 0x100 ==<br />
<br />
Name may be <code>Idlog</code>.<br />
<br />
Console-unique. Strings related to manufacturing.<br />
<br />
One string starts at offset 0, and one string starts at offset 0x100. Both strings occupy 0x100 bytes (unused space is filled with zeroes).<br />
<br />
The string at offset 0x100 is written at a different stage (end of manufacturing?) than the string at offset 0, so it is possible to find units with only first string written (e.g., a Dolphin CEM-3000 unit).<br />
<br />
== 0x102 ==<br />
<br />
Console-unique. Per-console factory/service product information.<br />
<br />
== 0x103 ==<br />
<br />
Console-unique. Unit hardware information.<br />
<br />
* 0x000-0x003: [[KBL_Param#Hardware_Info|ErnieHwInfo]]<br />
* 0x004-0x007: [[SceSyscon#sceSysconGetErnieVersionForDriver|ErnieFwVersion]] (also called Ernie Verison)<br />
* 0x008-0x00B: [[SceSyscon#sceSysconGetErnieDLVersionForDriver|ErnieDlVersion]]<br />
* 0x00C-0x00D: [[Ernie]]CfgVersion (version from ConfigStorageInfo; part of [[Syscon]] "ConfZZ" header)<br />
* 0x00E-0x00F: Padding<br />
* 0x010-0x01F: unknown<br />
* 0x020-0x028: EmmcFwVersion - 1 byte (Vendor ID), 1 empty byte, then 6 bytes (Device Version) // identical on PCH-10xx and PDEL-100x, PS TV has different padding, PCH-20xx has different values<br />
* 0x029-0x02F: unknown<br />
* 0x030-0x037: EmmcFwVersion2 - 1 byte (Vendor ID), 6 bytes (Device Version) and 1 byte (only filled for Samsung eMMC, 0 otherwise)<br />
* 0x038-0x03F: unknown<br />
* 0x040-0x041: [[SceSyscon#sceSysconGetElmoFwVersionForDriver|ElmoFwVersion]]<br />
* 0x042-0x05F: Empty?<br />
* 0x060-0x061: [[SceSyscon#sceSysconGetCookieFwVersionForDriver|CookieFwVersion]]<br />
* 0x062-0x07F: Empty?<br />
* 0x080-0x083: [[SceSyscon#sceSysconMotionGetDeviceInfoForDriver|Motion Device Info]]: <code>BarkleyFwVersion</code> (u16) followed by <code>BarkleyHwInfo</code> (u16)<br />
* 0x084-0x09F: Empty?<br />
* 0x0A0-0x0A5: [[SceSyscon#sceSysconGetBatteryVersionForDriver|Battery (Abby or Bert) Version]]. Empty on PS TV and PDEL-10xx.<br />
* 0x0A6-0x0A7: Empty?<br />
* 0x0A8-0x0AC: Battery calibration data. <code>BatteryVoltageCalib</code> (u16) followed by <code>BatteryCurrentCalib</code> (u16)<br />
* 0x0AC-0x0BF: Empty?<br />
* 0x0C0-0x0CB: [[SceSyscon#sceSysconGetTouchpanelDeviceInfoForDriver|<code>TouchpanelFWVersion</code> (4 u16)]] followed by [[SceSyscon#sceSysconGetTouchpanelDeviceInfo2ForDriver|<code>TouchpanelConfigVersion</code> (2 u16)]]<br />
* 0x0CC-0x0CF: Empty?<br />
* 0x0D0-0x0DF: <code>TouchpanelLotInfo</code>: 2 u32 for each panel<br />
* 0x0E0-0x0E3: Wlan/Bt HW Revision (ex: 50 00 00 00 on PCH-10xx/PCH-20xx/PS TV/PDEL-10xx)<br />
* 0x0E4-0x0E7: Empty?<br />
* 0x0E8-0x0ED: WlanMacAddress - WLAN MAC Address<br />
* 0x0EE-0x0EF: Empty?<br />
* 0x0F0-0x0F5: BtMacAddress - Bluetooh MAC Address<br />
* 0x0F6-0x0FF: Empty?<br />
* 0x100-0x11F: <code>BatteryLotInfo</code> (battery lot serial number in ASCII)<br />
* 0x120-0x183: unknown<br />
* 0x184-0x193: OLEDLotInfo<br />
* 0x194-0x1A3: 4 elements of 0x4 bytes<br />
* 0x1A4-0x1A7: unknown<br />
* 0x1A8-0x1C7: LcdModLotInfo<br />
<br />
== 0x104 ==<br />
<br />
Console-unique. Test/diagnostic results.<br />
<br />
This leaf is only present if diagnostic software has been executed on the unit or some factory tests failed.<br />
<br />
== 0x110 - WlanRegion ==<br />
<br />
The following algorithm is used to derive it from PsCode:<br />
<source lang="c"><br />
byte WlanRegion[3]; //Leaf contains only 3 bytes of data<br />
<br />
switch(pscode.product_code) {<br />
case 0x100:<br />
case 0x101:<br />
case 0x102:<br />
case 0x104:<br />
case 0x10B:<br />
case 0x10F:<br />
case 0x110:<br />
case 0x111:<br />
WlanRegion[2] = 0;<br />
WlanRegion[1] = 7;<br />
break;<br />
case 0x103:<br />
case 0x106:<br />
case 0x108:<br />
case 0x10A:<br />
case 0x10D:<br />
case 0x10E:<br />
WlanRegion[2] = 0;<br />
WlanRegion[1] = 0x1F;<br />
break;<br />
case 0x105:<br />
case 0x107:<br />
case 0x109:<br />
case 0x10C:<br />
WlanRegion[2] = 1;<br />
WlanRegion[1] = 0x1F;<br />
break;<br />
default:<br />
goto error;<br />
}<br />
WlanRegion[0] = 0xFF;<br />
</source><br />
<br />
== 0x111 - WlanMacAddress ==<br />
<br />
Console-unique. The MAC address of the Wireless LAN adapter (6 bytes).<br />
<br />
== 0x112 - MtpSerial ==<br />
<br />
Console-unique. The serial number reported via the MTP protocol (32 UTF-16 characters).<br />
<br />
== 0x113 ==<br />
<br />
Console-unique on 3G units and empty on all others. Contains informations related to the 3G modem.<br />
<br />
== 0x114 - DeviceLocation ==<br />
<br />
Identical for all consoles of a generation (one kind for Fat, one kind for Slim, empty on PSTV).<br />
<br />
Contains four <code>struct DeviceLocation</code>s describing the location of physical devices in the unit.<br />
<br />
<source lang="c><br />
struct DeviceLocation { //size is 0x10 bytes<br />
//0x00 - Front camera<br />
//0x01 - Back camera<br />
//0x10 - Accelerometer<br />
//0x11 - Gyro<br />
uint32_t type;<br />
int32_t x;<br />
int32_t y;<br />
int32_t z;<br />
};<br />
</source><br />
<br />
The structures are usually found in the following order: Cameras followed by Motion (Acc + Gyro).<br />
<br />
There is also an unknown int32 flag at offset 0x100.<br />
<br />
== 0x115 - ProductTypeInfo ==<br />
<br />
Identical for all consoles "with same SKU". A string of 16 characters containing information about the product type.<br />
<br />
Example values:<br />
* <code>PDEL100000010000</code> (PDEL-1000)<br />
* <code>PCH01004ZAZ20000</code> (PCH-1004 - Call of Duty: Black Ops Declassified limited edition)<br />
* <code>PCH01100AA010002</code> (Crystal Black PCH-1100 - docomo carrier)<br />
* <code>PCH02000ZA120000</code> (White PCH-2000)<br />
<br />
Decomposition: <code>FFFF NNNN PPPP xxx O</code><br />
* <code>FFFF-NNNN PPPP</code> is usually printed on the product's box<br />
** <code>FFFF</code> = family (e.g., PCH, PDEL)<br />
** <code>NNNN</code> = number (e.g., 1000, 1004, 1100)<br />
** <code>PPPP</code> = variant code (e.g., 0001, ZAZ2, AA01, ZA12)<br />
* <code>xxx</code> = ? (always 000?)<br />
* <code>O</code> = Product target operator (carrier ID for 3G models - usually matches offset 0x88 of leaf 0x113 on SIM-locked models).<br />
** 1: US operator<br />
** 2: JP operator<br />
** 3: EU generic<br />
** 4: Asia generic<br />
** 5: Canada operator<br />
** 6: Mexico generic<br />
<br />
== 0x116 - ColorVariation ==<br />
<br />
Used for wave color by SceShell if present. ([https://github.com/Princess-of-Sleeping/psp2wpp/blob/master/src/main.c#L441-L467 Patch example])<br />
<br />
<source lang="c"><br />
struct ColorVariation {<br />
uint8_t unk0;<br />
uint16_t unk1; //maybe just two uint8_t?<br />
uint8_t unk3;<br />
/* rest of the leaf is empty */<br />
};<br />
</source><br />
<br />
Example values:<br />
* Call of Duty: Black Ops Declassified limited edition PCH-1004: <code>{ 0x01, 0x0000, 0x00 }</code><br />
* Glacier White PCH-2000 / White PSTV: <code>{ 0x01, 0x000C, 0x00 }</code><br />
<br />
== 0x117 - TemperatureThreashold ==<br />
<br />
The typo in this leaf's name is present in SCE code.<br />
<br />
Contains 4 elements of 1 byte each, which are always all zeroes when the leaf is present.<br />
<br />
Sent to Syscon?<br />
<br />
== 0x118 - AudioParam ==<br />
<br />
1 byte. If set to 0 (or the leaf is absent?), AVLS is never forcefully enabled.<br />
<br />
Should be 0x0 except on units with PsCode Product Code 0x105 (Europe/East/Africa), 0x107 (Great Britain/United Kingdom) or 0x109 (Australia/New Zealand).<br />
<br />
== 0x119 - EtherMacAddress ==<br />
<br />
Console-unique. The MAC address of the Ethernet adapter (6 bytes).<br />
<br />
Empty or not present for non-PSTV units.<br />
<br />
== 0x11A - WebBrowserParam ==<br />
<br />
1 byte.<br />
<br />
Seen:<br />
0x02 on PCH200X, 0x11 on PSTV<br />
<br />
Should be 0x1 on Fat CEX/DEX, 0x2 on Slim, 0x11 on PSTV and 0x0 on all other units.<br />
<br />
== 0x11B - ShutterParam ==<br />
<br />
1 byte. When leaf is present and contains 0x01, the value returned by <code>sceAVConfigGetShutterVol()</code> changes from 30 to 26.<br />
<br />
Seen: 0x01 on PCH200X, 0x00 on PSTV.<br />
<br />
Should be 0x1 on Slim units and 0x0 on all others.<br />
<br />
== 0x11C - LedInfoParam ==<br />
<br />
1 byte.<br />
<br />
Seen: 0x01 on PCH200X, 0x00 on PSTV<br />
<br />
Should be 0x1 on Slim units and 0x0 on all others.</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=IdStorage&diff=20867
IdStorage
2023-12-25T20:22:43Z
<p>CreepNT: /* 0x11C */ Add expected values based on unit type</p>
<hr />
<div>See also [https://playstationdev.wiki/pspdevwiki/index.php?title=IDStorage].<br />
<br />
= Description =<br />
<br />
Region of the PSVita eMMC where perconsole info is stored.<br />
<br />
= Location =<br />
<br />
Idstorage data is stored at first raw partition (code 0x1). Use [https://github.com/TeamMolecule/sceutils/blob/master/extract_idstorage.py] to extract.<br />
<br />
= Structure =<br />
<br />
The IdStorage partition is divided in two parts: the mapping table and the leaves.<br />
<br />
== Mapping table ==<br />
<br />
The mapping table is located at the start of the partition. It's an array of 16-bit leaf IDs that serves as a leaf ID->index mapping table. The mapping table must be at least one-sector wide but may be bigger.<br />
<br />
There are two leaf IDs reserved for usage in the mapping table: all entries corresponding to the mapping table (i.e. the first <code>M</code> entries for an </code>M</code> sectors sized table) must hold the value <code>0xFFF5</code>, and all unallocated leaves hold the value <code>0xFFFF</code>.<br />
<br />
To lookup a leaf index based on its ID, use the following algorithm:<br />
<source lang="C"><br />
#define M /* implementation defined */<br />
#define SECTOR_SIZE (512)<br />
<br />
#define NUM_TABLE_ITEMS ((M * SECTOR_SIZE) / sizeof(uint16_t))<br />
uint16_t g_mappingTable[NUM_TABLE_ITEMS];<br />
<br />
int leafIndexFromId(unsigned id) {<br />
if (id >= 0xFFF0)<br />
return /* ERROR: invalid leaf ID */;<br />
<br />
for (int i = 0; i < NUM_TABLE_ITEMS; i++) {<br />
if (g_mappingTable[i] == id)<br />
return i;<br />
}<br />
return /* ERROR: leaf ID is not in mapping table */;<br />
}<br />
</source><br />
<br />
== Leaves ==<br />
<br />
Leaves are sector-sized (512 bytes) areas in the IdStorage partition used to store arbitrary data. While the data stored may be smaller, a leaf always occupies one sector in the partition.<br />
<br />
To read a leaf's data, obtain the leaf index (this can be known directly, or obtained from a leaf ID using the previously mentioned algorithm) then read 512 bytes starting at offset <code>512 * leafIndex</code> in the IdStorage partition.<br />
<br />
== Limits ==<br />
<br />
The number of leaves that can be stored in an IdStorage partition is limited by three factors: the size of the partition, the size of the mapping table and the size of leaf IDs.<br />
<br />
* An <code>M</code> sectors wide mapping table can hold up to <code>255 * M</code> leaves<br />
** This is because a single-sector mapping table can reference <code>SECTOR_SIZE/sizeof(u16) - 1 = 255</code> leaves (the <code>- 1</code> is needed because a table consumes one entry for itself)<br />
* A <code>P</code> sectors wide partition can hold up to <code>P - M</code> leaves<br />
** This is because leaves are sector-sized, and the mapping table consumes <code>M</code> sectors<br />
* There are 65520 leaf IDs available<br />
** While an unsigned 16-bit variable can hold 65536 values, IDs superior or equal to 0xFFF0 are reserved and cannot be used<br />
<br />
From this, we can conclude that an IdStorage partition of <code>P</code> sectors with an <code>M</code> sectors mapping table can hold up to <code>min(255*M, P-M, 65520)</code> leaves. We can also deduce an IdStorage partition is optimally shaped (no space is non-allocatable) when <code>P = 256 * M</code>.<br />
<br />
On Vita, the IdStorage partition is 512KiB and 32 sectors are reserved for the indexing table (<code>P = 1024, M = 32</code>, a non-optimal choice), which means the console's partition can hold '''up to 992 IdStorage leaves'''.<br />
<br />
= Leaf content =<br />
<br />
Leaves not present in this section have not been found in any unit.<br />
<br />
In the following section, "empty" means that the area has all bits set to 1 (i.e., 0xFF).<br />
"Present"/"Not present" means whether or not a leaf exists in IdStorage.<br />
<br />
When a size is indicated, this means only the first X bytes of the leaf are used, and the rest is empty.<br />
<br />
The following information may not be valid for pre-production units.<br />
<br />
== Idps certificates ==<br />
<br />
Leaves 0x000~0x07F are written to IdStorage during manufacturing by a function called '''<code>_writeIdpsCert</code>'''.<br />
<br />
Leaf 0x07E contains the signed SHA-256 digest of leaves 0x000~0x07D (signed using RSA-2048). The public key used for signature verification can be found in <code>factTest.self</code>.<br />
<br />
Leaf 0x07F is not covered by the signature but is flashed in <code>_writeIdpsCert</code> nonetheless.<br />
<br />
=== Empty leaves ===<br />
<br />
The following leaves have always been observed to only contain zeroes:<br />
* 0x008~0x01F<br />
* 0x028~0x03F<br />
* 0x050~0x07D<br />
* 0x7F<br />
<br />
=== 0x000~0x007 ===<br />
<br />
SceIdStoragePspCertificates<br />
<br />
Identical across all units and duplicated in leaves 0x020 to 0x027.<br />
<br />
=== 0x040~0x047 ===<br />
<br />
SceIdStoragePsp2Certificates.<br />
<br />
Console-unique.<br />
<br />
=== 0x048~0x04F ===<br />
<br />
Console-unique. May be certificate(s).<br />
<br />
=== 0x07E ===<br />
<br />
Console-unique.<br />
<br />
The RSA-2048 signature of the Idps certificates (2048 bits/256 bytes) is located at offset 0x60 of this leaf.<br />
<br />
Data contained between 0x0 and 0x5F is unknown, and data between 0x160 and 0x1FF is unused (always 00).<br />
<br />
== 0x80 ==<br />
<br />
Service / Manufacturing Information (SMI)<br />
<br />
Console-unique. Contains minimal firmware version (checked in [[Second Loader|<code>second_loader</code>]]).<br />
<br />
<source lang="c"><br />
struct SMILeaf {<br />
uint8_t magic[4]; //'SMI\0'<br />
uint32_t version; //1<br />
uint32_t min_fwv; //Minimal firmware version<br />
uint8_t unused[0x80 - 0xC];<br />
//Encrypted with per-console keys.<br />
//This is used to verify the leaf has not been modified.<br />
uint8_t encrypted_data[0x200 - 0x80];<br />
};<br />
</source><br />
<br />
== 0x100 ==<br />
<br />
Console-unique. Build data strings. One string starts at offset 0, and one string starts at offset 0x100. Both strings are 0x100 characters long.<br />
<br />
In a 0.920 minfw unit, this leaf instead contains 0x0 at offset 0, 0x10 at offset 0x10, etc up to offset 0xF0, while all other bytes are zeroes.<br />
<br />
== 0x102 ==<br />
<br />
Console-unique. Per-console factory/service product information.<br />
<br />
== 0x103 ==<br />
<br />
Console-unique. Motherboard information.<br />
<br />
* 0x000-0x003: [[KBL_Param#Hardware_Info|ErnieHwInfo]]<br />
* 0x004-0x007: [[SceSyscon#sceSysconGetErnieVersionForDriver|ErnieFwVersion]] (also called Ernie Verison)<br />
* 0x008-0x00B: [[SceSyscon#sceSysconGetErnieDLVersionForDriver|ErnieDlVersion]]<br />
* 0x00C-0x00D: [[Ernie]]CfgVersion (version from ConfigStorageInfo; part of [[Syscon]] "ConfZZ" header)<br />
* 0x00E-0x00F: Padding<br />
* 0x010-0x01F: unknown<br />
* 0x020-0x028: EmmcFwVersion - 1 byte (Vendor ID), 1 empty byte, then 6 bytes (Device Version) // identical on PCH-10xx and PDEL-100x, PS TV has different padding, PCH-20xx has different values<br />
* 0x029-0x02F: unknown<br />
* 0x030-0x037: EmmcFwVersion2 - 1 byte (Vendor ID), 6 bytes (Device Version) and 1 byte (only filled for Samsung eMMC, 0 otherwise)<br />
* 0x038-0x03F: unknown<br />
* 0x040-0x041: [[SceSyscon#sceSysconGetElmoFwVersionForDriver|ElmoFwVersion]]<br />
* 0x042-0x05F: Empty?<br />
* 0x060-0x061: [[SceSyscon#sceSysconGetCookieFwVersionForDriver|CookieFwVersion]]<br />
* 0x062-0x07F: Empty?<br />
* 0x080-0x083: [[SceSyscon#sceSysconMotionGetDeviceInfoForDriver|Motion Device Info]]: <code>BarkleyFwVersion</code> (u16) followed by <code>BarkleyHwInfo</code> (u16)<br />
* 0x084-0x09F: Empty?<br />
* 0x0A0-0x0A5: [[SceSyscon#sceSysconGetBatteryVersionForDriver|Battery (Abby or Bert) Version]]. Empty on PS TV and PDEL-10xx.<br />
* 0x0A6-0x0A7: Empty?<br />
* 0x0A8-0x0AC: Battery calibration data. <code>BatteryVoltageCalib</code> (u16) followed by <code>BatteryCurrentCalib</code> (u16)<br />
* 0x0AC-0x0BF: Empty?<br />
* 0x0C0-0x0CB: [[SceSyscon#sceSysconGetTouchpanelDeviceInfoForDriver|<code>TouchpanelFWVersion</code> (4 u16)]] followed by [[SceSyscon#sceSysconGetTouchpanelDeviceInfo2ForDriver|<code>TouchpanelConfigVersion</code> (2 u16)]]<br />
* 0x0CC-0x0CF: Empty?<br />
* 0x0D0-0x0DF: <code>TouchpanelLotInfo</code>: 2 u32 for each panel<br />
* 0x0E0-0x0E3: Wlan/Bt HW Revision (ex: 50 00 00 00 on PCH-10xx/PCH-20xx/PS TV/PDEL-10xx)<br />
* 0x0E4-0x0E7: Empty?<br />
* 0x0E8-0x0ED: WlanMacAddress - WLAN MAC Address<br />
* 0x0EE-0x0EF: Empty?<br />
* 0x0F0-0x0F5: BtMacAddress - Bluetooh MAC Address<br />
* 0x0F6-0x0FF: Empty?<br />
* 0x100-0x11F: <code>BatteryLotInfo</code> (battery lot serial number in ASCII)<br />
* 0x120-0x183: unknown<br />
* 0x184-0x193: OLEDLotInfo<br />
* 0x194-0x1A3: 4 elements of 0x4 bytes<br />
* 0x1A4-0x1A7: unknown<br />
* 0x1A8-0x1C7: LcdModLotInfo<br />
<br />
== 0x104 ==<br />
<br />
Console-unique. Test/diagnostic results.<br />
<br />
Only present if diagnostic software has been executed on the unit or some factory tests failed.<br />
<br />
== 0x110 ==<br />
<br />
WlanRegion (3 bytes)<br />
<br />
The following algorithm is used to derive it from PsCode:<br />
<source lang="c"><br />
byte WlanRegion[3];<br />
switch(pscode.product_code) {<br />
case 0x100:<br />
case 0x101:<br />
case 0x102:<br />
case 0x104:<br />
case 0x10B:<br />
case 0x10F:<br />
case 0x110:<br />
case 0x111:<br />
WlanRegion[2] = 0;<br />
WlanRegion[1] = 7;<br />
break;<br />
case 0x103:<br />
case 0x106:<br />
case 0x108:<br />
case 0x10A:<br />
case 0x10D:<br />
case 0x10E:<br />
WlanRegion[2] = 0;<br />
WlanRegion[1] = 0x1F;<br />
break;<br />
case 0x105:<br />
case 0x107:<br />
case 0x109:<br />
case 0x10C:<br />
WlanRegion[2] = 1;<br />
WlanRegion[1] = 0x1F;<br />
break;<br />
default:<br />
goto error;<br />
}<br />
WlanRegion[0] = 0xFF;<br />
</source><br />
<br />
== 0x111 ==<br />
<br />
WlanMacAddress (6 bytes)<br />
<br />
Console-unique. The MAC address of the Wireless LAN adapter.<br />
<br />
== 0x112 ==<br />
<br />
MtpSerial (<code>wchar_t[0x20]</code>)<br />
<br />
Console-unique. The serial number sent via the MTP protocol.<br />
<br />
== 0x113 ==<br />
<br />
Console-unique. Information related to the 3G modem.<br />
<br />
Empty on non-3G models.<br />
<br />
== 0x114 ==<br />
<br />
DeviceLocation (four of <code>struct DeviceLocation</code>)<br />
<br />
The location of physical devices in the unit.<br />
<br />
<source lang="c><br />
struct DeviceLocation {<br />
//0x00 - Front camera<br />
//0x01 - Back camera<br />
//0x10 - Accelerometer<br />
//0x11 - Gyro<br />
uint32_t type;<br />
int32_t x;<br />
int32_t y;<br />
int32_t z;<br />
};<br />
</source><br />
<br />
Usually, Cameras are at offsets 0x00 and 0x10 while Motion is at 0x20 and 0x30<br />
<br />
There's unknown int32 flag at 0x100.<br />
<br />
Identical for all consoles of a generation (one kind for Fat, one kind for Slim).<br />
<br />
Empty on PSTV.<br />
<br />
== 0x115 ==<br />
<br />
ProductTypeInfo (<code>char[16]</code>)<br />
<br />
Identical for consoles of the same "type".<br />
<br />
Example values:<br />
* <code>PDEL100000010000</code> (PDEL-1000)<br />
* <code>PCH01004ZAZ20000</code> (PCH-1004 - Call of Duty: Black Ops Declassified limited edition)<br />
* <code>PCH01100AA010002</code> (Crystal Black PCH-1100 - docomo carrier)<br />
* <code>PCH02000ZA120000</code> (White PCH-2000)<br />
<br />
Decomposition: <code>FFFF NNNN PPPP xxx O</code><br />
* <code>FFFF-NNNN PPPP</code> is usually printed on the product's box<br />
** <code>FFFF</code> = family (e.g., PCH, PDEL)<br />
** <code>NNNN</code> = number (e.g., 1000, 1004, 1100)<br />
** <code>PPPP</code> = variant code (e.g., 0001, ZAZ2, AA01, ZA12)<br />
* <code>xxx</code> = ? (always 000?)<br />
* <code>O</code> = Product target operator (carrier ID for 3G models - usually matches offset 0x88 of leaf 0x113 on SIM-locked models).<br />
** 1: US operator<br />
** 2: JP operator<br />
** 3: EU generic<br />
** 4: Asia generic<br />
** 5: Canada operator<br />
** 6: Mexico generic<br />
<br />
== 0x116 ==<br />
<br />
ColorVariation (4 bytes)<br />
<br />
Not present on all units.<br />
<br />
Used for wave color by SceShell. ([https://github.com/Princess-of-Sleeping/psp2wpp/blob/master/src/main.c#L441-L467 Patch example])<br />
<br />
<source lang="c"><br />
struct ColorVariation {<br />
uint8_t unk0;<br />
uint16_t unk1; //maybe just two uint8_t?<br />
uint8_t unk3;<br />
/* rest of the leaf is empty */<br />
};<br />
</source><br />
<br />
Example values:<br />
* Call of Duty: Black Ops Declassified limited edition PCH-1004: <code>{ 0x01, 0x0000, 0x00 }</code><br />
* Glacier White PCH-2000 / White PSTV: <code>{ 0x01, 0x000C, 0x00 }</code><br />
<br />
== 0x117 ==<br />
<br />
TemperatureThreashold[https://en.wikipedia.org/wiki/Sic <sup>[sic<nowiki>]</nowiki></sup>] (4 elements of 1 byte each)<br />
<br />
Not present on all units, and always all zeroes when present. Sent to Syscon?<br />
<br />
== 0x118 ==<br />
<br />
AudioParam (1 byte)<br />
<br />
Not present on all units.<br />
<br />
If set to 0 (or the leaf is absent?), AVLS is never forcefully enabled.<br />
<br />
Set to 1 on units with PsCode Product Code 0x105 (Europe/East/Africa), 0x107 (Great Britain/United Kingdom) and 0x109 (Australia/New Zealand).<br />
<br />
== 0x119 ==<br />
<br />
EtherMacAddress (6 bytes)<br />
<br />
Console-unique. The MAC address of the Ethernet adapter.<br />
<br />
Present on PSTV and PCH-2000 (empty for the latter).<br />
<br />
== 0x11A ==<br />
<br />
WebBrowserParam (1 byte)<br />
<br />
Seen:<br />
0x02 on PCH200X, 0x11 on PSTV<br />
<br />
Should be 0x0 for TOOL, 0x1 for Fat CEX/DEX, 0x2 for Slim CEX/DEX and 0x11 for PSTV.<br />
<br />
== 0x11B ==<br />
<br />
ShutterParam (1 byte)<br />
<br />
When leaf is present and contains 0x01, the value returned by <code>sceAVConfigGetShutterVol()</code> changes from 30 to 26.<br />
<br />
Seen: 0x01 on PCH200X, 0x00 on PSTV.<br />
<br />
Should be 0x1 on Slim units, 0x0 otherwise.<br />
<br />
== 0x11C ==<br />
<br />
LedInfoParam (1 byte)<br />
<br />
Seen: 0x01 on PCH200X, 0x00 on PSTV<br />
<br />
Should be 0x1 on Slim units, 0x0 otherwise.</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=IdStorage&diff=20866
IdStorage
2023-12-25T20:21:55Z
<p>CreepNT: /* 0x11B */ Add expected values based on unit type</p>
<hr />
<div>See also [https://playstationdev.wiki/pspdevwiki/index.php?title=IDStorage].<br />
<br />
= Description =<br />
<br />
Region of the PSVita eMMC where perconsole info is stored.<br />
<br />
= Location =<br />
<br />
Idstorage data is stored at first raw partition (code 0x1). Use [https://github.com/TeamMolecule/sceutils/blob/master/extract_idstorage.py] to extract.<br />
<br />
= Structure =<br />
<br />
The IdStorage partition is divided in two parts: the mapping table and the leaves.<br />
<br />
== Mapping table ==<br />
<br />
The mapping table is located at the start of the partition. It's an array of 16-bit leaf IDs that serves as a leaf ID->index mapping table. The mapping table must be at least one-sector wide but may be bigger.<br />
<br />
There are two leaf IDs reserved for usage in the mapping table: all entries corresponding to the mapping table (i.e. the first <code>M</code> entries for an </code>M</code> sectors sized table) must hold the value <code>0xFFF5</code>, and all unallocated leaves hold the value <code>0xFFFF</code>.<br />
<br />
To lookup a leaf index based on its ID, use the following algorithm:<br />
<source lang="C"><br />
#define M /* implementation defined */<br />
#define SECTOR_SIZE (512)<br />
<br />
#define NUM_TABLE_ITEMS ((M * SECTOR_SIZE) / sizeof(uint16_t))<br />
uint16_t g_mappingTable[NUM_TABLE_ITEMS];<br />
<br />
int leafIndexFromId(unsigned id) {<br />
if (id >= 0xFFF0)<br />
return /* ERROR: invalid leaf ID */;<br />
<br />
for (int i = 0; i < NUM_TABLE_ITEMS; i++) {<br />
if (g_mappingTable[i] == id)<br />
return i;<br />
}<br />
return /* ERROR: leaf ID is not in mapping table */;<br />
}<br />
</source><br />
<br />
== Leaves ==<br />
<br />
Leaves are sector-sized (512 bytes) areas in the IdStorage partition used to store arbitrary data. While the data stored may be smaller, a leaf always occupies one sector in the partition.<br />
<br />
To read a leaf's data, obtain the leaf index (this can be known directly, or obtained from a leaf ID using the previously mentioned algorithm) then read 512 bytes starting at offset <code>512 * leafIndex</code> in the IdStorage partition.<br />
<br />
== Limits ==<br />
<br />
The number of leaves that can be stored in an IdStorage partition is limited by three factors: the size of the partition, the size of the mapping table and the size of leaf IDs.<br />
<br />
* An <code>M</code> sectors wide mapping table can hold up to <code>255 * M</code> leaves<br />
** This is because a single-sector mapping table can reference <code>SECTOR_SIZE/sizeof(u16) - 1 = 255</code> leaves (the <code>- 1</code> is needed because a table consumes one entry for itself)<br />
* A <code>P</code> sectors wide partition can hold up to <code>P - M</code> leaves<br />
** This is because leaves are sector-sized, and the mapping table consumes <code>M</code> sectors<br />
* There are 65520 leaf IDs available<br />
** While an unsigned 16-bit variable can hold 65536 values, IDs superior or equal to 0xFFF0 are reserved and cannot be used<br />
<br />
From this, we can conclude that an IdStorage partition of <code>P</code> sectors with an <code>M</code> sectors mapping table can hold up to <code>min(255*M, P-M, 65520)</code> leaves. We can also deduce an IdStorage partition is optimally shaped (no space is non-allocatable) when <code>P = 256 * M</code>.<br />
<br />
On Vita, the IdStorage partition is 512KiB and 32 sectors are reserved for the indexing table (<code>P = 1024, M = 32</code>, a non-optimal choice), which means the console's partition can hold '''up to 992 IdStorage leaves'''.<br />
<br />
= Leaf content =<br />
<br />
Leaves not present in this section have not been found in any unit.<br />
<br />
In the following section, "empty" means that the area has all bits set to 1 (i.e., 0xFF).<br />
"Present"/"Not present" means whether or not a leaf exists in IdStorage.<br />
<br />
When a size is indicated, this means only the first X bytes of the leaf are used, and the rest is empty.<br />
<br />
The following information may not be valid for pre-production units.<br />
<br />
== Idps certificates ==<br />
<br />
Leaves 0x000~0x07F are written to IdStorage during manufacturing by a function called '''<code>_writeIdpsCert</code>'''.<br />
<br />
Leaf 0x07E contains the signed SHA-256 digest of leaves 0x000~0x07D (signed using RSA-2048). The public key used for signature verification can be found in <code>factTest.self</code>.<br />
<br />
Leaf 0x07F is not covered by the signature but is flashed in <code>_writeIdpsCert</code> nonetheless.<br />
<br />
=== Empty leaves ===<br />
<br />
The following leaves have always been observed to only contain zeroes:<br />
* 0x008~0x01F<br />
* 0x028~0x03F<br />
* 0x050~0x07D<br />
* 0x7F<br />
<br />
=== 0x000~0x007 ===<br />
<br />
SceIdStoragePspCertificates<br />
<br />
Identical across all units and duplicated in leaves 0x020 to 0x027.<br />
<br />
=== 0x040~0x047 ===<br />
<br />
SceIdStoragePsp2Certificates.<br />
<br />
Console-unique.<br />
<br />
=== 0x048~0x04F ===<br />
<br />
Console-unique. May be certificate(s).<br />
<br />
=== 0x07E ===<br />
<br />
Console-unique.<br />
<br />
The RSA-2048 signature of the Idps certificates (2048 bits/256 bytes) is located at offset 0x60 of this leaf.<br />
<br />
Data contained between 0x0 and 0x5F is unknown, and data between 0x160 and 0x1FF is unused (always 00).<br />
<br />
== 0x80 ==<br />
<br />
Service / Manufacturing Information (SMI)<br />
<br />
Console-unique. Contains minimal firmware version (checked in [[Second Loader|<code>second_loader</code>]]).<br />
<br />
<source lang="c"><br />
struct SMILeaf {<br />
uint8_t magic[4]; //'SMI\0'<br />
uint32_t version; //1<br />
uint32_t min_fwv; //Minimal firmware version<br />
uint8_t unused[0x80 - 0xC];<br />
//Encrypted with per-console keys.<br />
//This is used to verify the leaf has not been modified.<br />
uint8_t encrypted_data[0x200 - 0x80];<br />
};<br />
</source><br />
<br />
== 0x100 ==<br />
<br />
Console-unique. Build data strings. One string starts at offset 0, and one string starts at offset 0x100. Both strings are 0x100 characters long.<br />
<br />
In a 0.920 minfw unit, this leaf instead contains 0x0 at offset 0, 0x10 at offset 0x10, etc up to offset 0xF0, while all other bytes are zeroes.<br />
<br />
== 0x102 ==<br />
<br />
Console-unique. Per-console factory/service product information.<br />
<br />
== 0x103 ==<br />
<br />
Console-unique. Motherboard information.<br />
<br />
* 0x000-0x003: [[KBL_Param#Hardware_Info|ErnieHwInfo]]<br />
* 0x004-0x007: [[SceSyscon#sceSysconGetErnieVersionForDriver|ErnieFwVersion]] (also called Ernie Verison)<br />
* 0x008-0x00B: [[SceSyscon#sceSysconGetErnieDLVersionForDriver|ErnieDlVersion]]<br />
* 0x00C-0x00D: [[Ernie]]CfgVersion (version from ConfigStorageInfo; part of [[Syscon]] "ConfZZ" header)<br />
* 0x00E-0x00F: Padding<br />
* 0x010-0x01F: unknown<br />
* 0x020-0x028: EmmcFwVersion - 1 byte (Vendor ID), 1 empty byte, then 6 bytes (Device Version) // identical on PCH-10xx and PDEL-100x, PS TV has different padding, PCH-20xx has different values<br />
* 0x029-0x02F: unknown<br />
* 0x030-0x037: EmmcFwVersion2 - 1 byte (Vendor ID), 6 bytes (Device Version) and 1 byte (only filled for Samsung eMMC, 0 otherwise)<br />
* 0x038-0x03F: unknown<br />
* 0x040-0x041: [[SceSyscon#sceSysconGetElmoFwVersionForDriver|ElmoFwVersion]]<br />
* 0x042-0x05F: Empty?<br />
* 0x060-0x061: [[SceSyscon#sceSysconGetCookieFwVersionForDriver|CookieFwVersion]]<br />
* 0x062-0x07F: Empty?<br />
* 0x080-0x083: [[SceSyscon#sceSysconMotionGetDeviceInfoForDriver|Motion Device Info]]: <code>BarkleyFwVersion</code> (u16) followed by <code>BarkleyHwInfo</code> (u16)<br />
* 0x084-0x09F: Empty?<br />
* 0x0A0-0x0A5: [[SceSyscon#sceSysconGetBatteryVersionForDriver|Battery (Abby or Bert) Version]]. Empty on PS TV and PDEL-10xx.<br />
* 0x0A6-0x0A7: Empty?<br />
* 0x0A8-0x0AC: Battery calibration data. <code>BatteryVoltageCalib</code> (u16) followed by <code>BatteryCurrentCalib</code> (u16)<br />
* 0x0AC-0x0BF: Empty?<br />
* 0x0C0-0x0CB: [[SceSyscon#sceSysconGetTouchpanelDeviceInfoForDriver|<code>TouchpanelFWVersion</code> (4 u16)]] followed by [[SceSyscon#sceSysconGetTouchpanelDeviceInfo2ForDriver|<code>TouchpanelConfigVersion</code> (2 u16)]]<br />
* 0x0CC-0x0CF: Empty?<br />
* 0x0D0-0x0DF: <code>TouchpanelLotInfo</code>: 2 u32 for each panel<br />
* 0x0E0-0x0E3: Wlan/Bt HW Revision (ex: 50 00 00 00 on PCH-10xx/PCH-20xx/PS TV/PDEL-10xx)<br />
* 0x0E4-0x0E7: Empty?<br />
* 0x0E8-0x0ED: WlanMacAddress - WLAN MAC Address<br />
* 0x0EE-0x0EF: Empty?<br />
* 0x0F0-0x0F5: BtMacAddress - Bluetooh MAC Address<br />
* 0x0F6-0x0FF: Empty?<br />
* 0x100-0x11F: <code>BatteryLotInfo</code> (battery lot serial number in ASCII)<br />
* 0x120-0x183: unknown<br />
* 0x184-0x193: OLEDLotInfo<br />
* 0x194-0x1A3: 4 elements of 0x4 bytes<br />
* 0x1A4-0x1A7: unknown<br />
* 0x1A8-0x1C7: LcdModLotInfo<br />
<br />
== 0x104 ==<br />
<br />
Console-unique. Test/diagnostic results.<br />
<br />
Only present if diagnostic software has been executed on the unit or some factory tests failed.<br />
<br />
== 0x110 ==<br />
<br />
WlanRegion (3 bytes)<br />
<br />
The following algorithm is used to derive it from PsCode:<br />
<source lang="c"><br />
byte WlanRegion[3];<br />
switch(pscode.product_code) {<br />
case 0x100:<br />
case 0x101:<br />
case 0x102:<br />
case 0x104:<br />
case 0x10B:<br />
case 0x10F:<br />
case 0x110:<br />
case 0x111:<br />
WlanRegion[2] = 0;<br />
WlanRegion[1] = 7;<br />
break;<br />
case 0x103:<br />
case 0x106:<br />
case 0x108:<br />
case 0x10A:<br />
case 0x10D:<br />
case 0x10E:<br />
WlanRegion[2] = 0;<br />
WlanRegion[1] = 0x1F;<br />
break;<br />
case 0x105:<br />
case 0x107:<br />
case 0x109:<br />
case 0x10C:<br />
WlanRegion[2] = 1;<br />
WlanRegion[1] = 0x1F;<br />
break;<br />
default:<br />
goto error;<br />
}<br />
WlanRegion[0] = 0xFF;<br />
</source><br />
<br />
== 0x111 ==<br />
<br />
WlanMacAddress (6 bytes)<br />
<br />
Console-unique. The MAC address of the Wireless LAN adapter.<br />
<br />
== 0x112 ==<br />
<br />
MtpSerial (<code>wchar_t[0x20]</code>)<br />
<br />
Console-unique. The serial number sent via the MTP protocol.<br />
<br />
== 0x113 ==<br />
<br />
Console-unique. Information related to the 3G modem.<br />
<br />
Empty on non-3G models.<br />
<br />
== 0x114 ==<br />
<br />
DeviceLocation (four of <code>struct DeviceLocation</code>)<br />
<br />
The location of physical devices in the unit.<br />
<br />
<source lang="c><br />
struct DeviceLocation {<br />
//0x00 - Front camera<br />
//0x01 - Back camera<br />
//0x10 - Accelerometer<br />
//0x11 - Gyro<br />
uint32_t type;<br />
int32_t x;<br />
int32_t y;<br />
int32_t z;<br />
};<br />
</source><br />
<br />
Usually, Cameras are at offsets 0x00 and 0x10 while Motion is at 0x20 and 0x30<br />
<br />
There's unknown int32 flag at 0x100.<br />
<br />
Identical for all consoles of a generation (one kind for Fat, one kind for Slim).<br />
<br />
Empty on PSTV.<br />
<br />
== 0x115 ==<br />
<br />
ProductTypeInfo (<code>char[16]</code>)<br />
<br />
Identical for consoles of the same "type".<br />
<br />
Example values:<br />
* <code>PDEL100000010000</code> (PDEL-1000)<br />
* <code>PCH01004ZAZ20000</code> (PCH-1004 - Call of Duty: Black Ops Declassified limited edition)<br />
* <code>PCH01100AA010002</code> (Crystal Black PCH-1100 - docomo carrier)<br />
* <code>PCH02000ZA120000</code> (White PCH-2000)<br />
<br />
Decomposition: <code>FFFF NNNN PPPP xxx O</code><br />
* <code>FFFF-NNNN PPPP</code> is usually printed on the product's box<br />
** <code>FFFF</code> = family (e.g., PCH, PDEL)<br />
** <code>NNNN</code> = number (e.g., 1000, 1004, 1100)<br />
** <code>PPPP</code> = variant code (e.g., 0001, ZAZ2, AA01, ZA12)<br />
* <code>xxx</code> = ? (always 000?)<br />
* <code>O</code> = Product target operator (carrier ID for 3G models - usually matches offset 0x88 of leaf 0x113 on SIM-locked models).<br />
** 1: US operator<br />
** 2: JP operator<br />
** 3: EU generic<br />
** 4: Asia generic<br />
** 5: Canada operator<br />
** 6: Mexico generic<br />
<br />
== 0x116 ==<br />
<br />
ColorVariation (4 bytes)<br />
<br />
Not present on all units.<br />
<br />
Used for wave color by SceShell. ([https://github.com/Princess-of-Sleeping/psp2wpp/blob/master/src/main.c#L441-L467 Patch example])<br />
<br />
<source lang="c"><br />
struct ColorVariation {<br />
uint8_t unk0;<br />
uint16_t unk1; //maybe just two uint8_t?<br />
uint8_t unk3;<br />
/* rest of the leaf is empty */<br />
};<br />
</source><br />
<br />
Example values:<br />
* Call of Duty: Black Ops Declassified limited edition PCH-1004: <code>{ 0x01, 0x0000, 0x00 }</code><br />
* Glacier White PCH-2000 / White PSTV: <code>{ 0x01, 0x000C, 0x00 }</code><br />
<br />
== 0x117 ==<br />
<br />
TemperatureThreashold[https://en.wikipedia.org/wiki/Sic <sup>[sic<nowiki>]</nowiki></sup>] (4 elements of 1 byte each)<br />
<br />
Not present on all units, and always all zeroes when present. Sent to Syscon?<br />
<br />
== 0x118 ==<br />
<br />
AudioParam (1 byte)<br />
<br />
Not present on all units.<br />
<br />
If set to 0 (or the leaf is absent?), AVLS is never forcefully enabled.<br />
<br />
Set to 1 on units with PsCode Product Code 0x105 (Europe/East/Africa), 0x107 (Great Britain/United Kingdom) and 0x109 (Australia/New Zealand).<br />
<br />
== 0x119 ==<br />
<br />
EtherMacAddress (6 bytes)<br />
<br />
Console-unique. The MAC address of the Ethernet adapter.<br />
<br />
Present on PSTV and PCH-2000 (empty for the latter).<br />
<br />
== 0x11A ==<br />
<br />
WebBrowserParam (1 byte)<br />
<br />
Seen:<br />
0x02 on PCH200X, 0x11 on PSTV<br />
<br />
Should be 0x0 for TOOL, 0x1 for Fat CEX/DEX, 0x2 for Slim CEX/DEX and 0x11 for PSTV.<br />
<br />
== 0x11B ==<br />
<br />
ShutterParam (1 byte)<br />
<br />
When leaf is present and contains 0x01, the value returned by <code>sceAVConfigGetShutterVol()</code> changes from 30 to 26.<br />
<br />
Seen: 0x01 on PCH200X, 0x00 on PSTV.<br />
<br />
Should be 0x1 on Slim units, 0x0 otherwise.<br />
<br />
== 0x11C ==<br />
<br />
LedInfoParam (1 byte)<br />
<br />
Seen 0x01 on PCH200X, 0x00 on PSTV</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=IdStorage&diff=20865
IdStorage
2023-12-25T20:17:26Z
<p>CreepNT: /* 0x11A */ Add expected value based on unit kind</p>
<hr />
<div>See also [https://playstationdev.wiki/pspdevwiki/index.php?title=IDStorage].<br />
<br />
= Description =<br />
<br />
Region of the PSVita eMMC where perconsole info is stored.<br />
<br />
= Location =<br />
<br />
Idstorage data is stored at first raw partition (code 0x1). Use [https://github.com/TeamMolecule/sceutils/blob/master/extract_idstorage.py] to extract.<br />
<br />
= Structure =<br />
<br />
The IdStorage partition is divided in two parts: the mapping table and the leaves.<br />
<br />
== Mapping table ==<br />
<br />
The mapping table is located at the start of the partition. It's an array of 16-bit leaf IDs that serves as a leaf ID->index mapping table. The mapping table must be at least one-sector wide but may be bigger.<br />
<br />
There are two leaf IDs reserved for usage in the mapping table: all entries corresponding to the mapping table (i.e. the first <code>M</code> entries for an </code>M</code> sectors sized table) must hold the value <code>0xFFF5</code>, and all unallocated leaves hold the value <code>0xFFFF</code>.<br />
<br />
To lookup a leaf index based on its ID, use the following algorithm:<br />
<source lang="C"><br />
#define M /* implementation defined */<br />
#define SECTOR_SIZE (512)<br />
<br />
#define NUM_TABLE_ITEMS ((M * SECTOR_SIZE) / sizeof(uint16_t))<br />
uint16_t g_mappingTable[NUM_TABLE_ITEMS];<br />
<br />
int leafIndexFromId(unsigned id) {<br />
if (id >= 0xFFF0)<br />
return /* ERROR: invalid leaf ID */;<br />
<br />
for (int i = 0; i < NUM_TABLE_ITEMS; i++) {<br />
if (g_mappingTable[i] == id)<br />
return i;<br />
}<br />
return /* ERROR: leaf ID is not in mapping table */;<br />
}<br />
</source><br />
<br />
== Leaves ==<br />
<br />
Leaves are sector-sized (512 bytes) areas in the IdStorage partition used to store arbitrary data. While the data stored may be smaller, a leaf always occupies one sector in the partition.<br />
<br />
To read a leaf's data, obtain the leaf index (this can be known directly, or obtained from a leaf ID using the previously mentioned algorithm) then read 512 bytes starting at offset <code>512 * leafIndex</code> in the IdStorage partition.<br />
<br />
== Limits ==<br />
<br />
The number of leaves that can be stored in an IdStorage partition is limited by three factors: the size of the partition, the size of the mapping table and the size of leaf IDs.<br />
<br />
* An <code>M</code> sectors wide mapping table can hold up to <code>255 * M</code> leaves<br />
** This is because a single-sector mapping table can reference <code>SECTOR_SIZE/sizeof(u16) - 1 = 255</code> leaves (the <code>- 1</code> is needed because a table consumes one entry for itself)<br />
* A <code>P</code> sectors wide partition can hold up to <code>P - M</code> leaves<br />
** This is because leaves are sector-sized, and the mapping table consumes <code>M</code> sectors<br />
* There are 65520 leaf IDs available<br />
** While an unsigned 16-bit variable can hold 65536 values, IDs superior or equal to 0xFFF0 are reserved and cannot be used<br />
<br />
From this, we can conclude that an IdStorage partition of <code>P</code> sectors with an <code>M</code> sectors mapping table can hold up to <code>min(255*M, P-M, 65520)</code> leaves. We can also deduce an IdStorage partition is optimally shaped (no space is non-allocatable) when <code>P = 256 * M</code>.<br />
<br />
On Vita, the IdStorage partition is 512KiB and 32 sectors are reserved for the indexing table (<code>P = 1024, M = 32</code>, a non-optimal choice), which means the console's partition can hold '''up to 992 IdStorage leaves'''.<br />
<br />
= Leaf content =<br />
<br />
Leaves not present in this section have not been found in any unit.<br />
<br />
In the following section, "empty" means that the area has all bits set to 1 (i.e., 0xFF).<br />
"Present"/"Not present" means whether or not a leaf exists in IdStorage.<br />
<br />
When a size is indicated, this means only the first X bytes of the leaf are used, and the rest is empty.<br />
<br />
The following information may not be valid for pre-production units.<br />
<br />
== Idps certificates ==<br />
<br />
Leaves 0x000~0x07F are written to IdStorage during manufacturing by a function called '''<code>_writeIdpsCert</code>'''.<br />
<br />
Leaf 0x07E contains the signed SHA-256 digest of leaves 0x000~0x07D (signed using RSA-2048). The public key used for signature verification can be found in <code>factTest.self</code>.<br />
<br />
Leaf 0x07F is not covered by the signature but is flashed in <code>_writeIdpsCert</code> nonetheless.<br />
<br />
=== Empty leaves ===<br />
<br />
The following leaves have always been observed to only contain zeroes:<br />
* 0x008~0x01F<br />
* 0x028~0x03F<br />
* 0x050~0x07D<br />
* 0x7F<br />
<br />
=== 0x000~0x007 ===<br />
<br />
SceIdStoragePspCertificates<br />
<br />
Identical across all units and duplicated in leaves 0x020 to 0x027.<br />
<br />
=== 0x040~0x047 ===<br />
<br />
SceIdStoragePsp2Certificates.<br />
<br />
Console-unique.<br />
<br />
=== 0x048~0x04F ===<br />
<br />
Console-unique. May be certificate(s).<br />
<br />
=== 0x07E ===<br />
<br />
Console-unique.<br />
<br />
The RSA-2048 signature of the Idps certificates (2048 bits/256 bytes) is located at offset 0x60 of this leaf.<br />
<br />
Data contained between 0x0 and 0x5F is unknown, and data between 0x160 and 0x1FF is unused (always 00).<br />
<br />
== 0x80 ==<br />
<br />
Service / Manufacturing Information (SMI)<br />
<br />
Console-unique. Contains minimal firmware version (checked in [[Second Loader|<code>second_loader</code>]]).<br />
<br />
<source lang="c"><br />
struct SMILeaf {<br />
uint8_t magic[4]; //'SMI\0'<br />
uint32_t version; //1<br />
uint32_t min_fwv; //Minimal firmware version<br />
uint8_t unused[0x80 - 0xC];<br />
//Encrypted with per-console keys.<br />
//This is used to verify the leaf has not been modified.<br />
uint8_t encrypted_data[0x200 - 0x80];<br />
};<br />
</source><br />
<br />
== 0x100 ==<br />
<br />
Console-unique. Build data strings. One string starts at offset 0, and one string starts at offset 0x100. Both strings are 0x100 characters long.<br />
<br />
In a 0.920 minfw unit, this leaf instead contains 0x0 at offset 0, 0x10 at offset 0x10, etc up to offset 0xF0, while all other bytes are zeroes.<br />
<br />
== 0x102 ==<br />
<br />
Console-unique. Per-console factory/service product information.<br />
<br />
== 0x103 ==<br />
<br />
Console-unique. Motherboard information.<br />
<br />
* 0x000-0x003: [[KBL_Param#Hardware_Info|ErnieHwInfo]]<br />
* 0x004-0x007: [[SceSyscon#sceSysconGetErnieVersionForDriver|ErnieFwVersion]] (also called Ernie Verison)<br />
* 0x008-0x00B: [[SceSyscon#sceSysconGetErnieDLVersionForDriver|ErnieDlVersion]]<br />
* 0x00C-0x00D: [[Ernie]]CfgVersion (version from ConfigStorageInfo; part of [[Syscon]] "ConfZZ" header)<br />
* 0x00E-0x00F: Padding<br />
* 0x010-0x01F: unknown<br />
* 0x020-0x028: EmmcFwVersion - 1 byte (Vendor ID), 1 empty byte, then 6 bytes (Device Version) // identical on PCH-10xx and PDEL-100x, PS TV has different padding, PCH-20xx has different values<br />
* 0x029-0x02F: unknown<br />
* 0x030-0x037: EmmcFwVersion2 - 1 byte (Vendor ID), 6 bytes (Device Version) and 1 byte (only filled for Samsung eMMC, 0 otherwise)<br />
* 0x038-0x03F: unknown<br />
* 0x040-0x041: [[SceSyscon#sceSysconGetElmoFwVersionForDriver|ElmoFwVersion]]<br />
* 0x042-0x05F: Empty?<br />
* 0x060-0x061: [[SceSyscon#sceSysconGetCookieFwVersionForDriver|CookieFwVersion]]<br />
* 0x062-0x07F: Empty?<br />
* 0x080-0x083: [[SceSyscon#sceSysconMotionGetDeviceInfoForDriver|Motion Device Info]]: <code>BarkleyFwVersion</code> (u16) followed by <code>BarkleyHwInfo</code> (u16)<br />
* 0x084-0x09F: Empty?<br />
* 0x0A0-0x0A5: [[SceSyscon#sceSysconGetBatteryVersionForDriver|Battery (Abby or Bert) Version]]. Empty on PS TV and PDEL-10xx.<br />
* 0x0A6-0x0A7: Empty?<br />
* 0x0A8-0x0AC: Battery calibration data. <code>BatteryVoltageCalib</code> (u16) followed by <code>BatteryCurrentCalib</code> (u16)<br />
* 0x0AC-0x0BF: Empty?<br />
* 0x0C0-0x0CB: [[SceSyscon#sceSysconGetTouchpanelDeviceInfoForDriver|<code>TouchpanelFWVersion</code> (4 u16)]] followed by [[SceSyscon#sceSysconGetTouchpanelDeviceInfo2ForDriver|<code>TouchpanelConfigVersion</code> (2 u16)]]<br />
* 0x0CC-0x0CF: Empty?<br />
* 0x0D0-0x0DF: <code>TouchpanelLotInfo</code>: 2 u32 for each panel<br />
* 0x0E0-0x0E3: Wlan/Bt HW Revision (ex: 50 00 00 00 on PCH-10xx/PCH-20xx/PS TV/PDEL-10xx)<br />
* 0x0E4-0x0E7: Empty?<br />
* 0x0E8-0x0ED: WlanMacAddress - WLAN MAC Address<br />
* 0x0EE-0x0EF: Empty?<br />
* 0x0F0-0x0F5: BtMacAddress - Bluetooh MAC Address<br />
* 0x0F6-0x0FF: Empty?<br />
* 0x100-0x11F: <code>BatteryLotInfo</code> (battery lot serial number in ASCII)<br />
* 0x120-0x183: unknown<br />
* 0x184-0x193: OLEDLotInfo<br />
* 0x194-0x1A3: 4 elements of 0x4 bytes<br />
* 0x1A4-0x1A7: unknown<br />
* 0x1A8-0x1C7: LcdModLotInfo<br />
<br />
== 0x104 ==<br />
<br />
Console-unique. Test/diagnostic results.<br />
<br />
Only present if diagnostic software has been executed on the unit or some factory tests failed.<br />
<br />
== 0x110 ==<br />
<br />
WlanRegion (3 bytes)<br />
<br />
The following algorithm is used to derive it from PsCode:<br />
<source lang="c"><br />
byte WlanRegion[3];<br />
switch(pscode.product_code) {<br />
case 0x100:<br />
case 0x101:<br />
case 0x102:<br />
case 0x104:<br />
case 0x10B:<br />
case 0x10F:<br />
case 0x110:<br />
case 0x111:<br />
WlanRegion[2] = 0;<br />
WlanRegion[1] = 7;<br />
break;<br />
case 0x103:<br />
case 0x106:<br />
case 0x108:<br />
case 0x10A:<br />
case 0x10D:<br />
case 0x10E:<br />
WlanRegion[2] = 0;<br />
WlanRegion[1] = 0x1F;<br />
break;<br />
case 0x105:<br />
case 0x107:<br />
case 0x109:<br />
case 0x10C:<br />
WlanRegion[2] = 1;<br />
WlanRegion[1] = 0x1F;<br />
break;<br />
default:<br />
goto error;<br />
}<br />
WlanRegion[0] = 0xFF;<br />
</source><br />
<br />
== 0x111 ==<br />
<br />
WlanMacAddress (6 bytes)<br />
<br />
Console-unique. The MAC address of the Wireless LAN adapter.<br />
<br />
== 0x112 ==<br />
<br />
MtpSerial (<code>wchar_t[0x20]</code>)<br />
<br />
Console-unique. The serial number sent via the MTP protocol.<br />
<br />
== 0x113 ==<br />
<br />
Console-unique. Information related to the 3G modem.<br />
<br />
Empty on non-3G models.<br />
<br />
== 0x114 ==<br />
<br />
DeviceLocation (four of <code>struct DeviceLocation</code>)<br />
<br />
The location of physical devices in the unit.<br />
<br />
<source lang="c><br />
struct DeviceLocation {<br />
//0x00 - Front camera<br />
//0x01 - Back camera<br />
//0x10 - Accelerometer<br />
//0x11 - Gyro<br />
uint32_t type;<br />
int32_t x;<br />
int32_t y;<br />
int32_t z;<br />
};<br />
</source><br />
<br />
Usually, Cameras are at offsets 0x00 and 0x10 while Motion is at 0x20 and 0x30<br />
<br />
There's unknown int32 flag at 0x100.<br />
<br />
Identical for all consoles of a generation (one kind for Fat, one kind for Slim).<br />
<br />
Empty on PSTV.<br />
<br />
== 0x115 ==<br />
<br />
ProductTypeInfo (<code>char[16]</code>)<br />
<br />
Identical for consoles of the same "type".<br />
<br />
Example values:<br />
* <code>PDEL100000010000</code> (PDEL-1000)<br />
* <code>PCH01004ZAZ20000</code> (PCH-1004 - Call of Duty: Black Ops Declassified limited edition)<br />
* <code>PCH01100AA010002</code> (Crystal Black PCH-1100 - docomo carrier)<br />
* <code>PCH02000ZA120000</code> (White PCH-2000)<br />
<br />
Decomposition: <code>FFFF NNNN PPPP xxx O</code><br />
* <code>FFFF-NNNN PPPP</code> is usually printed on the product's box<br />
** <code>FFFF</code> = family (e.g., PCH, PDEL)<br />
** <code>NNNN</code> = number (e.g., 1000, 1004, 1100)<br />
** <code>PPPP</code> = variant code (e.g., 0001, ZAZ2, AA01, ZA12)<br />
* <code>xxx</code> = ? (always 000?)<br />
* <code>O</code> = Product target operator (carrier ID for 3G models - usually matches offset 0x88 of leaf 0x113 on SIM-locked models).<br />
** 1: US operator<br />
** 2: JP operator<br />
** 3: EU generic<br />
** 4: Asia generic<br />
** 5: Canada operator<br />
** 6: Mexico generic<br />
<br />
== 0x116 ==<br />
<br />
ColorVariation (4 bytes)<br />
<br />
Not present on all units.<br />
<br />
Used for wave color by SceShell. ([https://github.com/Princess-of-Sleeping/psp2wpp/blob/master/src/main.c#L441-L467 Patch example])<br />
<br />
<source lang="c"><br />
struct ColorVariation {<br />
uint8_t unk0;<br />
uint16_t unk1; //maybe just two uint8_t?<br />
uint8_t unk3;<br />
/* rest of the leaf is empty */<br />
};<br />
</source><br />
<br />
Example values:<br />
* Call of Duty: Black Ops Declassified limited edition PCH-1004: <code>{ 0x01, 0x0000, 0x00 }</code><br />
* Glacier White PCH-2000 / White PSTV: <code>{ 0x01, 0x000C, 0x00 }</code><br />
<br />
== 0x117 ==<br />
<br />
TemperatureThreashold[https://en.wikipedia.org/wiki/Sic <sup>[sic<nowiki>]</nowiki></sup>] (4 elements of 1 byte each)<br />
<br />
Not present on all units, and always all zeroes when present. Sent to Syscon?<br />
<br />
== 0x118 ==<br />
<br />
AudioParam (1 byte)<br />
<br />
Not present on all units.<br />
<br />
If set to 0 (or the leaf is absent?), AVLS is never forcefully enabled.<br />
<br />
Set to 1 on units with PsCode Product Code 0x105 (Europe/East/Africa), 0x107 (Great Britain/United Kingdom) and 0x109 (Australia/New Zealand).<br />
<br />
== 0x119 ==<br />
<br />
EtherMacAddress (6 bytes)<br />
<br />
Console-unique. The MAC address of the Ethernet adapter.<br />
<br />
Present on PSTV and PCH-2000 (empty for the latter).<br />
<br />
== 0x11A ==<br />
<br />
WebBrowserParam (1 byte)<br />
<br />
Seen:<br />
0x02 on PCH200X, 0x11 on PSTV<br />
<br />
Should be 0x0 for TOOL, 0x1 for Fat CEX/DEX, 0x2 for Slim CEX/DEX and 0x11 for PSTV.<br />
<br />
== 0x11B ==<br />
<br />
ShutterParam (1 byte)<br />
<br />
Seen: 0x01 on PCH200X, 0x00 on PSTV. When leaf is present and contains 0x01, the value returned by <code>sceAVConfigGetShutterVol()</code> changes from 30 to 26.<br />
<br />
== 0x11C ==<br />
<br />
LedInfoParam (1 byte)<br />
<br />
Seen 0x01 on PCH200X, 0x00 on PSTV</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=IdStorage&diff=20864
IdStorage
2023-12-25T19:42:01Z
<p>CreepNT: /* 0x118 */ Add list of units with AudioParam = 1</p>
<hr />
<div>See also [https://playstationdev.wiki/pspdevwiki/index.php?title=IDStorage].<br />
<br />
= Description =<br />
<br />
Region of the PSVita eMMC where perconsole info is stored.<br />
<br />
= Location =<br />
<br />
Idstorage data is stored at first raw partition (code 0x1). Use [https://github.com/TeamMolecule/sceutils/blob/master/extract_idstorage.py] to extract.<br />
<br />
= Structure =<br />
<br />
The IdStorage partition is divided in two parts: the mapping table and the leaves.<br />
<br />
== Mapping table ==<br />
<br />
The mapping table is located at the start of the partition. It's an array of 16-bit leaf IDs that serves as a leaf ID->index mapping table. The mapping table must be at least one-sector wide but may be bigger.<br />
<br />
There are two leaf IDs reserved for usage in the mapping table: all entries corresponding to the mapping table (i.e. the first <code>M</code> entries for an </code>M</code> sectors sized table) must hold the value <code>0xFFF5</code>, and all unallocated leaves hold the value <code>0xFFFF</code>.<br />
<br />
To lookup a leaf index based on its ID, use the following algorithm:<br />
<source lang="C"><br />
#define M /* implementation defined */<br />
#define SECTOR_SIZE (512)<br />
<br />
#define NUM_TABLE_ITEMS ((M * SECTOR_SIZE) / sizeof(uint16_t))<br />
uint16_t g_mappingTable[NUM_TABLE_ITEMS];<br />
<br />
int leafIndexFromId(unsigned id) {<br />
if (id >= 0xFFF0)<br />
return /* ERROR: invalid leaf ID */;<br />
<br />
for (int i = 0; i < NUM_TABLE_ITEMS; i++) {<br />
if (g_mappingTable[i] == id)<br />
return i;<br />
}<br />
return /* ERROR: leaf ID is not in mapping table */;<br />
}<br />
</source><br />
<br />
== Leaves ==<br />
<br />
Leaves are sector-sized (512 bytes) areas in the IdStorage partition used to store arbitrary data. While the data stored may be smaller, a leaf always occupies one sector in the partition.<br />
<br />
To read a leaf's data, obtain the leaf index (this can be known directly, or obtained from a leaf ID using the previously mentioned algorithm) then read 512 bytes starting at offset <code>512 * leafIndex</code> in the IdStorage partition.<br />
<br />
== Limits ==<br />
<br />
The number of leaves that can be stored in an IdStorage partition is limited by three factors: the size of the partition, the size of the mapping table and the size of leaf IDs.<br />
<br />
* An <code>M</code> sectors wide mapping table can hold up to <code>255 * M</code> leaves<br />
** This is because a single-sector mapping table can reference <code>SECTOR_SIZE/sizeof(u16) - 1 = 255</code> leaves (the <code>- 1</code> is needed because a table consumes one entry for itself)<br />
* A <code>P</code> sectors wide partition can hold up to <code>P - M</code> leaves<br />
** This is because leaves are sector-sized, and the mapping table consumes <code>M</code> sectors<br />
* There are 65520 leaf IDs available<br />
** While an unsigned 16-bit variable can hold 65536 values, IDs superior or equal to 0xFFF0 are reserved and cannot be used<br />
<br />
From this, we can conclude that an IdStorage partition of <code>P</code> sectors with an <code>M</code> sectors mapping table can hold up to <code>min(255*M, P-M, 65520)</code> leaves. We can also deduce an IdStorage partition is optimally shaped (no space is non-allocatable) when <code>P = 256 * M</code>.<br />
<br />
On Vita, the IdStorage partition is 512KiB and 32 sectors are reserved for the indexing table (<code>P = 1024, M = 32</code>, a non-optimal choice), which means the console's partition can hold '''up to 992 IdStorage leaves'''.<br />
<br />
= Leaf content =<br />
<br />
Leaves not present in this section have not been found in any unit.<br />
<br />
In the following section, "empty" means that the area has all bits set to 1 (i.e., 0xFF).<br />
"Present"/"Not present" means whether or not a leaf exists in IdStorage.<br />
<br />
When a size is indicated, this means only the first X bytes of the leaf are used, and the rest is empty.<br />
<br />
The following information may not be valid for pre-production units.<br />
<br />
== Idps certificates ==<br />
<br />
Leaves 0x000~0x07F are written to IdStorage during manufacturing by a function called '''<code>_writeIdpsCert</code>'''.<br />
<br />
Leaf 0x07E contains the signed SHA-256 digest of leaves 0x000~0x07D (signed using RSA-2048). The public key used for signature verification can be found in <code>factTest.self</code>.<br />
<br />
Leaf 0x07F is not covered by the signature but is flashed in <code>_writeIdpsCert</code> nonetheless.<br />
<br />
=== Empty leaves ===<br />
<br />
The following leaves have always been observed to only contain zeroes:<br />
* 0x008~0x01F<br />
* 0x028~0x03F<br />
* 0x050~0x07D<br />
* 0x7F<br />
<br />
=== 0x000~0x007 ===<br />
<br />
SceIdStoragePspCertificates<br />
<br />
Identical across all units and duplicated in leaves 0x020 to 0x027.<br />
<br />
=== 0x040~0x047 ===<br />
<br />
SceIdStoragePsp2Certificates.<br />
<br />
Console-unique.<br />
<br />
=== 0x048~0x04F ===<br />
<br />
Console-unique. May be certificate(s).<br />
<br />
=== 0x07E ===<br />
<br />
Console-unique.<br />
<br />
The RSA-2048 signature of the Idps certificates (2048 bits/256 bytes) is located at offset 0x60 of this leaf.<br />
<br />
Data contained between 0x0 and 0x5F is unknown, and data between 0x160 and 0x1FF is unused (always 00).<br />
<br />
== 0x80 ==<br />
<br />
Service / Manufacturing Information (SMI)<br />
<br />
Console-unique. Contains minimal firmware version (checked in [[Second Loader|<code>second_loader</code>]]).<br />
<br />
<source lang="c"><br />
struct SMILeaf {<br />
uint8_t magic[4]; //'SMI\0'<br />
uint32_t version; //1<br />
uint32_t min_fwv; //Minimal firmware version<br />
uint8_t unused[0x80 - 0xC];<br />
//Encrypted with per-console keys.<br />
//This is used to verify the leaf has not been modified.<br />
uint8_t encrypted_data[0x200 - 0x80];<br />
};<br />
</source><br />
<br />
== 0x100 ==<br />
<br />
Console-unique. Build data strings. One string starts at offset 0, and one string starts at offset 0x100. Both strings are 0x100 characters long.<br />
<br />
In a 0.920 minfw unit, this leaf instead contains 0x0 at offset 0, 0x10 at offset 0x10, etc up to offset 0xF0, while all other bytes are zeroes.<br />
<br />
== 0x102 ==<br />
<br />
Console-unique. Per-console factory/service product information.<br />
<br />
== 0x103 ==<br />
<br />
Console-unique. Motherboard information.<br />
<br />
* 0x000-0x003: [[KBL_Param#Hardware_Info|ErnieHwInfo]]<br />
* 0x004-0x007: [[SceSyscon#sceSysconGetErnieVersionForDriver|ErnieFwVersion]] (also called Ernie Verison)<br />
* 0x008-0x00B: [[SceSyscon#sceSysconGetErnieDLVersionForDriver|ErnieDlVersion]]<br />
* 0x00C-0x00D: [[Ernie]]CfgVersion (version from ConfigStorageInfo; part of [[Syscon]] "ConfZZ" header)<br />
* 0x00E-0x00F: Padding<br />
* 0x010-0x01F: unknown<br />
* 0x020-0x028: EmmcFwVersion - 1 byte (Vendor ID), 1 empty byte, then 6 bytes (Device Version) // identical on PCH-10xx and PDEL-100x, PS TV has different padding, PCH-20xx has different values<br />
* 0x029-0x02F: unknown<br />
* 0x030-0x037: EmmcFwVersion2 - 1 byte (Vendor ID), 6 bytes (Device Version) and 1 byte (only filled for Samsung eMMC, 0 otherwise)<br />
* 0x038-0x03F: unknown<br />
* 0x040-0x041: [[SceSyscon#sceSysconGetElmoFwVersionForDriver|ElmoFwVersion]]<br />
* 0x042-0x05F: Empty?<br />
* 0x060-0x061: [[SceSyscon#sceSysconGetCookieFwVersionForDriver|CookieFwVersion]]<br />
* 0x062-0x07F: Empty?<br />
* 0x080-0x083: [[SceSyscon#sceSysconMotionGetDeviceInfoForDriver|Motion Device Info]]: <code>BarkleyFwVersion</code> (u16) followed by <code>BarkleyHwInfo</code> (u16)<br />
* 0x084-0x09F: Empty?<br />
* 0x0A0-0x0A5: [[SceSyscon#sceSysconGetBatteryVersionForDriver|Battery (Abby or Bert) Version]]. Empty on PS TV and PDEL-10xx.<br />
* 0x0A6-0x0A7: Empty?<br />
* 0x0A8-0x0AC: Battery calibration data. <code>BatteryVoltageCalib</code> (u16) followed by <code>BatteryCurrentCalib</code> (u16)<br />
* 0x0AC-0x0BF: Empty?<br />
* 0x0C0-0x0CB: [[SceSyscon#sceSysconGetTouchpanelDeviceInfoForDriver|<code>TouchpanelFWVersion</code> (4 u16)]] followed by [[SceSyscon#sceSysconGetTouchpanelDeviceInfo2ForDriver|<code>TouchpanelConfigVersion</code> (2 u16)]]<br />
* 0x0CC-0x0CF: Empty?<br />
* 0x0D0-0x0DF: <code>TouchpanelLotInfo</code>: 2 u32 for each panel<br />
* 0x0E0-0x0E3: Wlan/Bt HW Revision (ex: 50 00 00 00 on PCH-10xx/PCH-20xx/PS TV/PDEL-10xx)<br />
* 0x0E4-0x0E7: Empty?<br />
* 0x0E8-0x0ED: WlanMacAddress - WLAN MAC Address<br />
* 0x0EE-0x0EF: Empty?<br />
* 0x0F0-0x0F5: BtMacAddress - Bluetooh MAC Address<br />
* 0x0F6-0x0FF: Empty?<br />
* 0x100-0x11F: <code>BatteryLotInfo</code> (battery lot serial number in ASCII)<br />
* 0x120-0x183: unknown<br />
* 0x184-0x193: OLEDLotInfo<br />
* 0x194-0x1A3: 4 elements of 0x4 bytes<br />
* 0x1A4-0x1A7: unknown<br />
* 0x1A8-0x1C7: LcdModLotInfo<br />
<br />
== 0x104 ==<br />
<br />
Console-unique. Test/diagnostic results.<br />
<br />
Only present if diagnostic software has been executed on the unit or some factory tests failed.<br />
<br />
== 0x110 ==<br />
<br />
WlanRegion (3 bytes)<br />
<br />
The following algorithm is used to derive it from PsCode:<br />
<source lang="c"><br />
byte WlanRegion[3];<br />
switch(pscode.product_code) {<br />
case 0x100:<br />
case 0x101:<br />
case 0x102:<br />
case 0x104:<br />
case 0x10B:<br />
case 0x10F:<br />
case 0x110:<br />
case 0x111:<br />
WlanRegion[2] = 0;<br />
WlanRegion[1] = 7;<br />
break;<br />
case 0x103:<br />
case 0x106:<br />
case 0x108:<br />
case 0x10A:<br />
case 0x10D:<br />
case 0x10E:<br />
WlanRegion[2] = 0;<br />
WlanRegion[1] = 0x1F;<br />
break;<br />
case 0x105:<br />
case 0x107:<br />
case 0x109:<br />
case 0x10C:<br />
WlanRegion[2] = 1;<br />
WlanRegion[1] = 0x1F;<br />
break;<br />
default:<br />
goto error;<br />
}<br />
WlanRegion[0] = 0xFF;<br />
</source><br />
<br />
== 0x111 ==<br />
<br />
WlanMacAddress (6 bytes)<br />
<br />
Console-unique. The MAC address of the Wireless LAN adapter.<br />
<br />
== 0x112 ==<br />
<br />
MtpSerial (<code>wchar_t[0x20]</code>)<br />
<br />
Console-unique. The serial number sent via the MTP protocol.<br />
<br />
== 0x113 ==<br />
<br />
Console-unique. Information related to the 3G modem.<br />
<br />
Empty on non-3G models.<br />
<br />
== 0x114 ==<br />
<br />
DeviceLocation (four of <code>struct DeviceLocation</code>)<br />
<br />
The location of physical devices in the unit.<br />
<br />
<source lang="c><br />
struct DeviceLocation {<br />
//0x00 - Front camera<br />
//0x01 - Back camera<br />
//0x10 - Accelerometer<br />
//0x11 - Gyro<br />
uint32_t type;<br />
int32_t x;<br />
int32_t y;<br />
int32_t z;<br />
};<br />
</source><br />
<br />
Usually, Cameras are at offsets 0x00 and 0x10 while Motion is at 0x20 and 0x30<br />
<br />
There's unknown int32 flag at 0x100.<br />
<br />
Identical for all consoles of a generation (one kind for Fat, one kind for Slim).<br />
<br />
Empty on PSTV.<br />
<br />
== 0x115 ==<br />
<br />
ProductTypeInfo (<code>char[16]</code>)<br />
<br />
Identical for consoles of the same "type".<br />
<br />
Example values:<br />
* <code>PDEL100000010000</code> (PDEL-1000)<br />
* <code>PCH01004ZAZ20000</code> (PCH-1004 - Call of Duty: Black Ops Declassified limited edition)<br />
* <code>PCH01100AA010002</code> (Crystal Black PCH-1100 - docomo carrier)<br />
* <code>PCH02000ZA120000</code> (White PCH-2000)<br />
<br />
Decomposition: <code>FFFF NNNN PPPP xxx O</code><br />
* <code>FFFF-NNNN PPPP</code> is usually printed on the product's box<br />
** <code>FFFF</code> = family (e.g., PCH, PDEL)<br />
** <code>NNNN</code> = number (e.g., 1000, 1004, 1100)<br />
** <code>PPPP</code> = variant code (e.g., 0001, ZAZ2, AA01, ZA12)<br />
* <code>xxx</code> = ? (always 000?)<br />
* <code>O</code> = Product target operator (carrier ID for 3G models - usually matches offset 0x88 of leaf 0x113 on SIM-locked models).<br />
** 1: US operator<br />
** 2: JP operator<br />
** 3: EU generic<br />
** 4: Asia generic<br />
** 5: Canada operator<br />
** 6: Mexico generic<br />
<br />
== 0x116 ==<br />
<br />
ColorVariation (4 bytes)<br />
<br />
Not present on all units.<br />
<br />
Used for wave color by SceShell. ([https://github.com/Princess-of-Sleeping/psp2wpp/blob/master/src/main.c#L441-L467 Patch example])<br />
<br />
<source lang="c"><br />
struct ColorVariation {<br />
uint8_t unk0;<br />
uint16_t unk1; //maybe just two uint8_t?<br />
uint8_t unk3;<br />
/* rest of the leaf is empty */<br />
};<br />
</source><br />
<br />
Example values:<br />
* Call of Duty: Black Ops Declassified limited edition PCH-1004: <code>{ 0x01, 0x0000, 0x00 }</code><br />
* Glacier White PCH-2000 / White PSTV: <code>{ 0x01, 0x000C, 0x00 }</code><br />
<br />
== 0x117 ==<br />
<br />
TemperatureThreashold[https://en.wikipedia.org/wiki/Sic <sup>[sic<nowiki>]</nowiki></sup>] (4 elements of 1 byte each)<br />
<br />
Not present on all units, and always all zeroes when present. Sent to Syscon?<br />
<br />
== 0x118 ==<br />
<br />
AudioParam (1 byte)<br />
<br />
Not present on all units.<br />
<br />
If set to 0 (or the leaf is absent?), AVLS is never forcefully enabled.<br />
<br />
Set to 1 on units with PsCode Product Code 0x105 (Europe/East/Africa), 0x107 (Great Britain/United Kingdom) and 0x109 (Australia/New Zealand).<br />
<br />
== 0x119 ==<br />
<br />
EtherMacAddress (6 bytes)<br />
<br />
Console-unique. The MAC address of the Ethernet adapter.<br />
<br />
Present on PSTV and PCH-2000 (empty for the latter).<br />
<br />
== 0x11A ==<br />
<br />
WebBrowserParam (1 byte)<br />
<br />
Can be 0/1/2/0x11?<br />
<br />
Seen:<br />
0x02 on PCH200X, 0x11 on PSTV<br />
<br />
== 0x11B ==<br />
<br />
ShutterParam (1 byte)<br />
<br />
Seen: 0x01 on PCH200X, 0x00 on PSTV. When leaf is present and contains 0x01, the value returned by <code>sceAVConfigGetShutterVol()</code> changes from 30 to 26.<br />
<br />
== 0x11C ==<br />
<br />
LedInfoParam (1 byte)<br />
<br />
Seen 0x01 on PCH200X, 0x00 on PSTV</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=IdStorage&diff=20862
IdStorage
2023-12-24T18:53:07Z
<p>CreepNT: /* 0x115 */ Remove incorrect note</p>
<hr />
<div>See also [https://playstationdev.wiki/pspdevwiki/index.php?title=IDStorage].<br />
<br />
= Description =<br />
<br />
Region of the PSVita eMMC where perconsole info is stored.<br />
<br />
= Location =<br />
<br />
Idstorage data is stored at first raw partition (code 0x1). Use [https://github.com/TeamMolecule/sceutils/blob/master/extract_idstorage.py] to extract.<br />
<br />
= Structure =<br />
<br />
The IdStorage partition is divided in two parts: the mapping table and the leaves.<br />
<br />
== Mapping table ==<br />
<br />
The mapping table is located at the start of the partition. It's an array of 16-bit leaf IDs that serves as a leaf ID->index mapping table. The mapping table must be at least one-sector wide but may be bigger.<br />
<br />
There are two leaf IDs reserved for usage in the mapping table: all entries corresponding to the mapping table (i.e. the first <code>M</code> entries for an </code>M</code> sectors sized table) must hold the value <code>0xFFF5</code>, and all unallocated leaves hold the value <code>0xFFFF</code>.<br />
<br />
To lookup a leaf index based on its ID, use the following algorithm:<br />
<source lang="C"><br />
#define M /* implementation defined */<br />
#define SECTOR_SIZE (512)<br />
<br />
#define NUM_TABLE_ITEMS ((M * SECTOR_SIZE) / sizeof(uint16_t))<br />
uint16_t g_mappingTable[NUM_TABLE_ITEMS];<br />
<br />
int leafIndexFromId(unsigned id) {<br />
if (id >= 0xFFF0)<br />
return /* ERROR: invalid leaf ID */;<br />
<br />
for (int i = 0; i < NUM_TABLE_ITEMS; i++) {<br />
if (g_mappingTable[i] == id)<br />
return i;<br />
}<br />
return /* ERROR: leaf ID is not in mapping table */;<br />
}<br />
</source><br />
<br />
== Leaves ==<br />
<br />
Leaves are sector-sized (512 bytes) areas in the IdStorage partition used to store arbitrary data. While the data stored may be smaller, a leaf always occupies one sector in the partition.<br />
<br />
To read a leaf's data, obtain the leaf index (this can be known directly, or obtained from a leaf ID using the previously mentioned algorithm) then read 512 bytes starting at offset <code>512 * leafIndex</code> in the IdStorage partition.<br />
<br />
== Limits ==<br />
<br />
The number of leaves that can be stored in an IdStorage partition is limited by three factors: the size of the partition, the size of the mapping table and the size of leaf IDs.<br />
<br />
* An <code>M</code> sectors wide mapping table can hold up to <code>255 * M</code> leaves<br />
** This is because a single-sector mapping table can reference <code>SECTOR_SIZE/sizeof(u16) - 1 = 255</code> leaves (the <code>- 1</code> is needed because a table consumes one entry for itself)<br />
* A <code>P</code> sectors wide partition can hold up to <code>P - M</code> leaves<br />
** This is because leaves are sector-sized, and the mapping table consumes <code>M</code> sectors<br />
* There are 65520 leaf IDs available<br />
** While an unsigned 16-bit variable can hold 65536 values, IDs superior or equal to 0xFFF0 are reserved and cannot be used<br />
<br />
From this, we can conclude that an IdStorage partition of <code>P</code> sectors with an <code>M</code> sectors mapping table can hold up to <code>min(255*M, P-M, 65520)</code> leaves. We can also deduce an IdStorage partition is optimally shaped (no space is non-allocatable) when <code>P = 256 * M</code>.<br />
<br />
On Vita, the IdStorage partition is 512KiB and 32 sectors are reserved for the indexing table (<code>P = 1024, M = 32</code>, a non-optimal choice), which means the console's partition can hold '''up to 992 IdStorage leaves'''.<br />
<br />
= Leaf content =<br />
<br />
Leaves not present in this section have not been found in any unit.<br />
<br />
In the following section, "empty" means that the area has all bits set to 1 (i.e., 0xFF).<br />
"Present"/"Not present" means whether or not a leaf exists in IdStorage.<br />
<br />
When a size is indicated, this means only the first X bytes of the leaf are used, and the rest is empty.<br />
<br />
The following information may not be valid for pre-production units.<br />
<br />
== Idps certificates ==<br />
<br />
Leaves 0x000~0x07F are written to IdStorage during manufacturing by a function called '''<code>_writeIdpsCert</code>'''.<br />
<br />
Leaf 0x07E contains the signed SHA-256 digest of leaves 0x000~0x07D (signed using RSA-2048). The public key used for signature verification can be found in <code>factTest.self</code>.<br />
<br />
Leaf 0x07F is not covered by the signature but is flashed in <code>_writeIdpsCert</code> nonetheless.<br />
<br />
=== Empty leaves ===<br />
<br />
The following leaves have always been observed to only contain zeroes:<br />
* 0x008~0x01F<br />
* 0x028~0x03F<br />
* 0x050~0x07D<br />
* 0x7F<br />
<br />
=== 0x000~0x007 ===<br />
<br />
SceIdStoragePspCertificates<br />
<br />
Identical across all units and duplicated in leaves 0x020 to 0x027.<br />
<br />
=== 0x040~0x047 ===<br />
<br />
SceIdStoragePsp2Certificates.<br />
<br />
Console-unique.<br />
<br />
=== 0x048~0x04F ===<br />
<br />
Console-unique. May be certificate(s).<br />
<br />
=== 0x07E ===<br />
<br />
Console-unique.<br />
<br />
The RSA-2048 signature of the Idps certificates (2048 bits/256 bytes) is located at offset 0x60 of this leaf.<br />
<br />
Data contained between 0x0 and 0x5F is unknown, and data between 0x160 and 0x1FF is unused (always 00).<br />
<br />
== 0x80 ==<br />
<br />
Service / Manufacturing Information (SMI)<br />
<br />
Console-unique. Contains minimal firmware version (checked in [[Second Loader|<code>second_loader</code>]]).<br />
<br />
<source lang="c"><br />
struct SMILeaf {<br />
uint8_t magic[4]; //'SMI\0'<br />
uint32_t version; //1<br />
uint32_t min_fwv; //Minimal firmware version<br />
uint8_t unused[0x80 - 0xC];<br />
//Encrypted with per-console keys.<br />
//This is used to verify the leaf has not been modified.<br />
uint8_t encrypted_data[0x200 - 0x80];<br />
};<br />
</source><br />
<br />
== 0x100 ==<br />
<br />
Console-unique. Build data strings. One string starts at offset 0, and one string starts at offset 0x100. Both strings are 0x100 characters long.<br />
<br />
In a 0.920 minfw unit, this leaf instead contains 0x0 at offset 0, 0x10 at offset 0x10, etc up to offset 0xF0, while all other bytes are zeroes.<br />
<br />
== 0x102 ==<br />
<br />
Console-unique. Per-console factory/service product information.<br />
<br />
== 0x103 ==<br />
<br />
Console-unique. Motherboard information.<br />
<br />
* 0x000-0x003: [[KBL_Param#Hardware_Info|ErnieHwInfo]]<br />
* 0x004-0x007: [[SceSyscon#sceSysconGetErnieVersionForDriver|ErnieFwVersion]] (also called Ernie Verison)<br />
* 0x008-0x00B: [[SceSyscon#sceSysconGetErnieDLVersionForDriver|ErnieDlVersion]]<br />
* 0x00C-0x00D: [[Ernie]]CfgVersion (version from ConfigStorageInfo; part of [[Syscon]] "ConfZZ" header)<br />
* 0x00E-0x00F: Padding<br />
* 0x010-0x01F: unknown<br />
* 0x020-0x028: EmmcFwVersion - 1 byte (Vendor ID), 1 empty byte, then 6 bytes (Device Version) // identical on PCH-10xx and PDEL-100x, PS TV has different padding, PCH-20xx has different values<br />
* 0x029-0x02F: unknown<br />
* 0x030-0x037: EmmcFwVersion2 - 1 byte (Vendor ID), 6 bytes (Device Version) and 1 byte (only filled for Samsung eMMC, 0 otherwise)<br />
* 0x038-0x03F: unknown<br />
* 0x040-0x041: [[SceSyscon#sceSysconGetElmoFwVersionForDriver|ElmoFwVersion]]<br />
* 0x042-0x05F: Empty?<br />
* 0x060-0x061: [[SceSyscon#sceSysconGetCookieFwVersionForDriver|CookieFwVersion]]<br />
* 0x062-0x07F: Empty?<br />
* 0x080-0x083: [[SceSyscon#sceSysconMotionGetDeviceInfoForDriver|Motion Device Info]]: <code>BarkleyFwVersion</code> (u16) followed by <code>BarkleyHwInfo</code> (u16)<br />
* 0x084-0x09F: Empty?<br />
* 0x0A0-0x0A5: [[SceSyscon#sceSysconGetBatteryVersionForDriver|Battery (Abby or Bert) Version]]. Empty on PS TV and PDEL-10xx.<br />
* 0x0A6-0x0A7: Empty?<br />
* 0x0A8-0x0AC: Battery calibration data. <code>BatteryVoltageCalib</code> (u16) followed by <code>BatteryCurrentCalib</code> (u16)<br />
* 0x0AC-0x0BF: Empty?<br />
* 0x0C0-0x0CB: [[SceSyscon#sceSysconGetTouchpanelDeviceInfoForDriver|<code>TouchpanelFWVersion</code> (4 u16)]] followed by [[SceSyscon#sceSysconGetTouchpanelDeviceInfo2ForDriver|<code>TouchpanelConfigVersion</code> (2 u16)]]<br />
* 0x0CC-0x0CF: Empty?<br />
* 0x0D0-0x0DF: <code>TouchpanelLotInfo</code>: 2 u32 for each panel<br />
* 0x0E0-0x0E3: Wlan/Bt HW Revision (ex: 50 00 00 00 on PCH-10xx/PCH-20xx/PS TV/PDEL-10xx)<br />
* 0x0E4-0x0E7: Empty?<br />
* 0x0E8-0x0ED: WlanMacAddress - WLAN MAC Address<br />
* 0x0EE-0x0EF: Empty?<br />
* 0x0F0-0x0F5: BtMacAddress - Bluetooh MAC Address<br />
* 0x0F6-0x0FF: Empty?<br />
* 0x100-0x11F: <code>BatteryLotInfo</code> (battery lot serial number in ASCII)<br />
* 0x120-0x183: unknown<br />
* 0x184-0x193: OLEDLotInfo<br />
* 0x194-0x1A3: 4 elements of 0x4 bytes<br />
* 0x1A4-0x1A7: unknown<br />
* 0x1A8-0x1C7: LcdModLotInfo<br />
<br />
== 0x104 ==<br />
<br />
Console-unique. Test/diagnostic results.<br />
<br />
Only present if diagnostic software has been executed on the unit or some factory tests failed.<br />
<br />
== 0x110 ==<br />
<br />
WlanRegion (3 bytes)<br />
<br />
The following algorithm is used to derive it from PsCode:<br />
<source lang="c"><br />
byte WlanRegion[3];<br />
switch(pscode.product_code) {<br />
case 0x100:<br />
case 0x101:<br />
case 0x102:<br />
case 0x104:<br />
case 0x10B:<br />
case 0x10F:<br />
case 0x110:<br />
case 0x111:<br />
WlanRegion[2] = 0;<br />
WlanRegion[1] = 7;<br />
break;<br />
case 0x103:<br />
case 0x106:<br />
case 0x108:<br />
case 0x10A:<br />
case 0x10D:<br />
case 0x10E:<br />
WlanRegion[2] = 0;<br />
WlanRegion[1] = 0x1F;<br />
break;<br />
case 0x105:<br />
case 0x107:<br />
case 0x109:<br />
case 0x10C:<br />
WlanRegion[2] = 1;<br />
WlanRegion[1] = 0x1F;<br />
break;<br />
default:<br />
goto error;<br />
}<br />
WlanRegion[0] = 0xFF;<br />
</source><br />
<br />
== 0x111 ==<br />
<br />
WlanMacAddress (6 bytes)<br />
<br />
Console-unique. The MAC address of the Wireless LAN adapter.<br />
<br />
== 0x112 ==<br />
<br />
MtpSerial (<code>wchar_t[0x20]</code>)<br />
<br />
Console-unique. The serial number sent via the MTP protocol.<br />
<br />
== 0x113 ==<br />
<br />
Console-unique. Information related to the 3G modem.<br />
<br />
Empty on non-3G models.<br />
<br />
== 0x114 ==<br />
<br />
DeviceLocation (four of <code>struct DeviceLocation</code>)<br />
<br />
The location of physical devices in the unit.<br />
<br />
<source lang="c><br />
struct DeviceLocation {<br />
//0x00 - Front camera<br />
//0x01 - Back camera<br />
//0x10 - Accelerometer<br />
//0x11 - Gyro<br />
uint32_t type;<br />
int32_t x;<br />
int32_t y;<br />
int32_t z;<br />
};<br />
</source><br />
<br />
Usually, Cameras are at offsets 0x00 and 0x10 while Motion is at 0x20 and 0x30<br />
<br />
There's unknown int32 flag at 0x100.<br />
<br />
Identical for all consoles of a generation (one kind for Fat, one kind for Slim).<br />
<br />
Empty on PSTV.<br />
<br />
== 0x115 ==<br />
<br />
ProductTypeInfo (<code>char[16]</code>)<br />
<br />
Identical for consoles of the same "type".<br />
<br />
Example values:<br />
* <code>PDEL100000010000</code> (PDEL-1000)<br />
* <code>PCH01004ZAZ20000</code> (PCH-1004 - Call of Duty: Black Ops Declassified limited edition)<br />
* <code>PCH01100AA010002</code> (Crystal Black PCH-1100 - docomo carrier)<br />
* <code>PCH02000ZA120000</code> (White PCH-2000)<br />
<br />
Decomposition: <code>FFFF NNNN PPPP xxx O</code><br />
* <code>FFFF-NNNN PPPP</code> is usually printed on the product's box<br />
** <code>FFFF</code> = family (e.g., PCH, PDEL)<br />
** <code>NNNN</code> = number (e.g., 1000, 1004, 1100)<br />
** <code>PPPP</code> = variant code (e.g., 0001, ZAZ2, AA01, ZA12)<br />
* <code>xxx</code> = ? (always 000?)<br />
* <code>O</code> = Product target operator (carrier ID for 3G models - usually matches offset 0x88 of leaf 0x113 on SIM-locked models).<br />
** 1: US operator<br />
** 2: JP operator<br />
** 3: EU generic<br />
** 4: Asia generic<br />
** 5: Canada operator<br />
** 6: Mexico generic<br />
<br />
== 0x116 ==<br />
<br />
ColorVariation (4 bytes)<br />
<br />
Not present on all units.<br />
<br />
Used for wave color by SceShell. ([https://github.com/Princess-of-Sleeping/psp2wpp/blob/master/src/main.c#L441-L467 Patch example])<br />
<br />
<source lang="c"><br />
struct ColorVariation {<br />
uint8_t unk0;<br />
uint16_t unk1; //maybe just two uint8_t?<br />
uint8_t unk3;<br />
/* rest of the leaf is empty */<br />
};<br />
</source><br />
<br />
Example values:<br />
* Call of Duty: Black Ops Declassified limited edition PCH-1004: <code>{ 0x01, 0x0000, 0x00 }</code><br />
* Glacier White PCH-2000 / White PSTV: <code>{ 0x01, 0x000C, 0x00 }</code><br />
<br />
== 0x117 ==<br />
<br />
TemperatureThreashold[https://en.wikipedia.org/wiki/Sic <sup>[sic<nowiki>]</nowiki></sup>] (4 elements of 1 byte each)<br />
<br />
Not present on all units, and always all zeroes when present. Sent to Syscon?<br />
<br />
== 0x118 ==<br />
<br />
AudioParam (1 byte)<br />
<br />
Not present on all units.<br />
<br />
If set to 0 (or the leaf is absent?), AVLS is never forcefully enabled.<br />
<br />
== 0x119 ==<br />
<br />
EtherMacAddress (6 bytes)<br />
<br />
Console-unique. The MAC address of the Ethernet adapter.<br />
<br />
Present on PSTV and PCH-2000 (empty for the latter).<br />
<br />
== 0x11A ==<br />
<br />
WebBrowserParam (1 byte)<br />
<br />
Can be 0/1/2/0x11?<br />
<br />
Seen:<br />
0x02 on PCH200X, 0x11 on PSTV<br />
<br />
== 0x11B ==<br />
<br />
ShutterParam (1 byte)<br />
<br />
Seen: 0x01 on PCH200X, 0x00 on PSTV. When leaf is present and contains 0x01, the value returned by <code>sceAVConfigGetShutterVol()</code> changes from 30 to 26.<br />
<br />
== 0x11C ==<br />
<br />
LedInfoParam (1 byte)<br />
<br />
Seen 0x01 on PCH200X, 0x00 on PSTV</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=IdStorage&diff=20861
IdStorage
2023-12-24T18:51:27Z
<p>CreepNT: /* 0x115 */ Regroup into a single variant code to match observations, add note, tidy up</p>
<hr />
<div>See also [https://playstationdev.wiki/pspdevwiki/index.php?title=IDStorage].<br />
<br />
= Description =<br />
<br />
Region of the PSVita eMMC where perconsole info is stored.<br />
<br />
= Location =<br />
<br />
Idstorage data is stored at first raw partition (code 0x1). Use [https://github.com/TeamMolecule/sceutils/blob/master/extract_idstorage.py] to extract.<br />
<br />
= Structure =<br />
<br />
The IdStorage partition is divided in two parts: the mapping table and the leaves.<br />
<br />
== Mapping table ==<br />
<br />
The mapping table is located at the start of the partition. It's an array of 16-bit leaf IDs that serves as a leaf ID->index mapping table. The mapping table must be at least one-sector wide but may be bigger.<br />
<br />
There are two leaf IDs reserved for usage in the mapping table: all entries corresponding to the mapping table (i.e. the first <code>M</code> entries for an </code>M</code> sectors sized table) must hold the value <code>0xFFF5</code>, and all unallocated leaves hold the value <code>0xFFFF</code>.<br />
<br />
To lookup a leaf index based on its ID, use the following algorithm:<br />
<source lang="C"><br />
#define M /* implementation defined */<br />
#define SECTOR_SIZE (512)<br />
<br />
#define NUM_TABLE_ITEMS ((M * SECTOR_SIZE) / sizeof(uint16_t))<br />
uint16_t g_mappingTable[NUM_TABLE_ITEMS];<br />
<br />
int leafIndexFromId(unsigned id) {<br />
if (id >= 0xFFF0)<br />
return /* ERROR: invalid leaf ID */;<br />
<br />
for (int i = 0; i < NUM_TABLE_ITEMS; i++) {<br />
if (g_mappingTable[i] == id)<br />
return i;<br />
}<br />
return /* ERROR: leaf ID is not in mapping table */;<br />
}<br />
</source><br />
<br />
== Leaves ==<br />
<br />
Leaves are sector-sized (512 bytes) areas in the IdStorage partition used to store arbitrary data. While the data stored may be smaller, a leaf always occupies one sector in the partition.<br />
<br />
To read a leaf's data, obtain the leaf index (this can be known directly, or obtained from a leaf ID using the previously mentioned algorithm) then read 512 bytes starting at offset <code>512 * leafIndex</code> in the IdStorage partition.<br />
<br />
== Limits ==<br />
<br />
The number of leaves that can be stored in an IdStorage partition is limited by three factors: the size of the partition, the size of the mapping table and the size of leaf IDs.<br />
<br />
* An <code>M</code> sectors wide mapping table can hold up to <code>255 * M</code> leaves<br />
** This is because a single-sector mapping table can reference <code>SECTOR_SIZE/sizeof(u16) - 1 = 255</code> leaves (the <code>- 1</code> is needed because a table consumes one entry for itself)<br />
* A <code>P</code> sectors wide partition can hold up to <code>P - M</code> leaves<br />
** This is because leaves are sector-sized, and the mapping table consumes <code>M</code> sectors<br />
* There are 65520 leaf IDs available<br />
** While an unsigned 16-bit variable can hold 65536 values, IDs superior or equal to 0xFFF0 are reserved and cannot be used<br />
<br />
From this, we can conclude that an IdStorage partition of <code>P</code> sectors with an <code>M</code> sectors mapping table can hold up to <code>min(255*M, P-M, 65520)</code> leaves. We can also deduce an IdStorage partition is optimally shaped (no space is non-allocatable) when <code>P = 256 * M</code>.<br />
<br />
On Vita, the IdStorage partition is 512KiB and 32 sectors are reserved for the indexing table (<code>P = 1024, M = 32</code>, a non-optimal choice), which means the console's partition can hold '''up to 992 IdStorage leaves'''.<br />
<br />
= Leaf content =<br />
<br />
Leaves not present in this section have not been found in any unit.<br />
<br />
In the following section, "empty" means that the area has all bits set to 1 (i.e., 0xFF).<br />
"Present"/"Not present" means whether or not a leaf exists in IdStorage.<br />
<br />
When a size is indicated, this means only the first X bytes of the leaf are used, and the rest is empty.<br />
<br />
The following information may not be valid for pre-production units.<br />
<br />
== Idps certificates ==<br />
<br />
Leaves 0x000~0x07F are written to IdStorage during manufacturing by a function called '''<code>_writeIdpsCert</code>'''.<br />
<br />
Leaf 0x07E contains the signed SHA-256 digest of leaves 0x000~0x07D (signed using RSA-2048). The public key used for signature verification can be found in <code>factTest.self</code>.<br />
<br />
Leaf 0x07F is not covered by the signature but is flashed in <code>_writeIdpsCert</code> nonetheless.<br />
<br />
=== Empty leaves ===<br />
<br />
The following leaves have always been observed to only contain zeroes:<br />
* 0x008~0x01F<br />
* 0x028~0x03F<br />
* 0x050~0x07D<br />
* 0x7F<br />
<br />
=== 0x000~0x007 ===<br />
<br />
SceIdStoragePspCertificates<br />
<br />
Identical across all units and duplicated in leaves 0x020 to 0x027.<br />
<br />
=== 0x040~0x047 ===<br />
<br />
SceIdStoragePsp2Certificates.<br />
<br />
Console-unique.<br />
<br />
=== 0x048~0x04F ===<br />
<br />
Console-unique. May be certificate(s).<br />
<br />
=== 0x07E ===<br />
<br />
Console-unique.<br />
<br />
The RSA-2048 signature of the Idps certificates (2048 bits/256 bytes) is located at offset 0x60 of this leaf.<br />
<br />
Data contained between 0x0 and 0x5F is unknown, and data between 0x160 and 0x1FF is unused (always 00).<br />
<br />
== 0x80 ==<br />
<br />
Service / Manufacturing Information (SMI)<br />
<br />
Console-unique. Contains minimal firmware version (checked in [[Second Loader|<code>second_loader</code>]]).<br />
<br />
<source lang="c"><br />
struct SMILeaf {<br />
uint8_t magic[4]; //'SMI\0'<br />
uint32_t version; //1<br />
uint32_t min_fwv; //Minimal firmware version<br />
uint8_t unused[0x80 - 0xC];<br />
//Encrypted with per-console keys.<br />
//This is used to verify the leaf has not been modified.<br />
uint8_t encrypted_data[0x200 - 0x80];<br />
};<br />
</source><br />
<br />
== 0x100 ==<br />
<br />
Console-unique. Build data strings. One string starts at offset 0, and one string starts at offset 0x100. Both strings are 0x100 characters long.<br />
<br />
In a 0.920 minfw unit, this leaf instead contains 0x0 at offset 0, 0x10 at offset 0x10, etc up to offset 0xF0, while all other bytes are zeroes.<br />
<br />
== 0x102 ==<br />
<br />
Console-unique. Per-console factory/service product information.<br />
<br />
== 0x103 ==<br />
<br />
Console-unique. Motherboard information.<br />
<br />
* 0x000-0x003: [[KBL_Param#Hardware_Info|ErnieHwInfo]]<br />
* 0x004-0x007: [[SceSyscon#sceSysconGetErnieVersionForDriver|ErnieFwVersion]] (also called Ernie Verison)<br />
* 0x008-0x00B: [[SceSyscon#sceSysconGetErnieDLVersionForDriver|ErnieDlVersion]]<br />
* 0x00C-0x00D: [[Ernie]]CfgVersion (version from ConfigStorageInfo; part of [[Syscon]] "ConfZZ" header)<br />
* 0x00E-0x00F: Padding<br />
* 0x010-0x01F: unknown<br />
* 0x020-0x028: EmmcFwVersion - 1 byte (Vendor ID), 1 empty byte, then 6 bytes (Device Version) // identical on PCH-10xx and PDEL-100x, PS TV has different padding, PCH-20xx has different values<br />
* 0x029-0x02F: unknown<br />
* 0x030-0x037: EmmcFwVersion2 - 1 byte (Vendor ID), 6 bytes (Device Version) and 1 byte (only filled for Samsung eMMC, 0 otherwise)<br />
* 0x038-0x03F: unknown<br />
* 0x040-0x041: [[SceSyscon#sceSysconGetElmoFwVersionForDriver|ElmoFwVersion]]<br />
* 0x042-0x05F: Empty?<br />
* 0x060-0x061: [[SceSyscon#sceSysconGetCookieFwVersionForDriver|CookieFwVersion]]<br />
* 0x062-0x07F: Empty?<br />
* 0x080-0x083: [[SceSyscon#sceSysconMotionGetDeviceInfoForDriver|Motion Device Info]]: <code>BarkleyFwVersion</code> (u16) followed by <code>BarkleyHwInfo</code> (u16)<br />
* 0x084-0x09F: Empty?<br />
* 0x0A0-0x0A5: [[SceSyscon#sceSysconGetBatteryVersionForDriver|Battery (Abby or Bert) Version]]. Empty on PS TV and PDEL-10xx.<br />
* 0x0A6-0x0A7: Empty?<br />
* 0x0A8-0x0AC: Battery calibration data. <code>BatteryVoltageCalib</code> (u16) followed by <code>BatteryCurrentCalib</code> (u16)<br />
* 0x0AC-0x0BF: Empty?<br />
* 0x0C0-0x0CB: [[SceSyscon#sceSysconGetTouchpanelDeviceInfoForDriver|<code>TouchpanelFWVersion</code> (4 u16)]] followed by [[SceSyscon#sceSysconGetTouchpanelDeviceInfo2ForDriver|<code>TouchpanelConfigVersion</code> (2 u16)]]<br />
* 0x0CC-0x0CF: Empty?<br />
* 0x0D0-0x0DF: <code>TouchpanelLotInfo</code>: 2 u32 for each panel<br />
* 0x0E0-0x0E3: Wlan/Bt HW Revision (ex: 50 00 00 00 on PCH-10xx/PCH-20xx/PS TV/PDEL-10xx)<br />
* 0x0E4-0x0E7: Empty?<br />
* 0x0E8-0x0ED: WlanMacAddress - WLAN MAC Address<br />
* 0x0EE-0x0EF: Empty?<br />
* 0x0F0-0x0F5: BtMacAddress - Bluetooh MAC Address<br />
* 0x0F6-0x0FF: Empty?<br />
* 0x100-0x11F: <code>BatteryLotInfo</code> (battery lot serial number in ASCII)<br />
* 0x120-0x183: unknown<br />
* 0x184-0x193: OLEDLotInfo<br />
* 0x194-0x1A3: 4 elements of 0x4 bytes<br />
* 0x1A4-0x1A7: unknown<br />
* 0x1A8-0x1C7: LcdModLotInfo<br />
<br />
== 0x104 ==<br />
<br />
Console-unique. Test/diagnostic results.<br />
<br />
Only present if diagnostic software has been executed on the unit or some factory tests failed.<br />
<br />
== 0x110 ==<br />
<br />
WlanRegion (3 bytes)<br />
<br />
The following algorithm is used to derive it from PsCode:<br />
<source lang="c"><br />
byte WlanRegion[3];<br />
switch(pscode.product_code) {<br />
case 0x100:<br />
case 0x101:<br />
case 0x102:<br />
case 0x104:<br />
case 0x10B:<br />
case 0x10F:<br />
case 0x110:<br />
case 0x111:<br />
WlanRegion[2] = 0;<br />
WlanRegion[1] = 7;<br />
break;<br />
case 0x103:<br />
case 0x106:<br />
case 0x108:<br />
case 0x10A:<br />
case 0x10D:<br />
case 0x10E:<br />
WlanRegion[2] = 0;<br />
WlanRegion[1] = 0x1F;<br />
break;<br />
case 0x105:<br />
case 0x107:<br />
case 0x109:<br />
case 0x10C:<br />
WlanRegion[2] = 1;<br />
WlanRegion[1] = 0x1F;<br />
break;<br />
default:<br />
goto error;<br />
}<br />
WlanRegion[0] = 0xFF;<br />
</source><br />
<br />
== 0x111 ==<br />
<br />
WlanMacAddress (6 bytes)<br />
<br />
Console-unique. The MAC address of the Wireless LAN adapter.<br />
<br />
== 0x112 ==<br />
<br />
MtpSerial (<code>wchar_t[0x20]</code>)<br />
<br />
Console-unique. The serial number sent via the MTP protocol.<br />
<br />
== 0x113 ==<br />
<br />
Console-unique. Information related to the 3G modem.<br />
<br />
Empty on non-3G models.<br />
<br />
== 0x114 ==<br />
<br />
DeviceLocation (four of <code>struct DeviceLocation</code>)<br />
<br />
The location of physical devices in the unit.<br />
<br />
<source lang="c><br />
struct DeviceLocation {<br />
//0x00 - Front camera<br />
//0x01 - Back camera<br />
//0x10 - Accelerometer<br />
//0x11 - Gyro<br />
uint32_t type;<br />
int32_t x;<br />
int32_t y;<br />
int32_t z;<br />
};<br />
</source><br />
<br />
Usually, Cameras are at offsets 0x00 and 0x10 while Motion is at 0x20 and 0x30<br />
<br />
There's unknown int32 flag at 0x100.<br />
<br />
Identical for all consoles of a generation (one kind for Fat, one kind for Slim).<br />
<br />
Empty on PSTV.<br />
<br />
== 0x115 ==<br />
<br />
ProductTypeInfo (<code>char[16]</code>)<br />
<br />
Identical for consoles of the same "type".<br />
<br />
Example values:<br />
* <code>PDEL100000010000</code> (PDEL-1000)<br />
* <code>PCH01004ZAZ20000</code> (PCH-1004 - Call of Duty: Black Ops Declassified limited edition)<br />
* <code>PCH01100AA010002</code> (Crystal Black PCH-1100 - docomo carrier)<br />
* <code>PCH02000ZA120000</code> (White PCH-2000)<br />
<br />
Decomposition: <code>FFFF NNNN PPPP xxx O</code><br />
* <code>FFFF-NNNN PPPP</code> is usually printed on the product's box<br />
** <code>FFFF</code> = family (e.g., PCH, PDEL)<br />
** <code>NNNN</code> = number (e.g., 1000, 1004, 1100)<br />
** <code>PPPP</code> = variant code (e.g., 0001, ZAZ2, AA01, ZA12)<br />
*** IdStorage and box may differ (e.g., CoD unit IdStorage is ZAZ2 but box is ZA01)<br />
* <code>xxx</code> = ? (always 000?)<br />
* <code>O</code> = Product target operator (carrier ID for 3G models - usually matches offset 0x88 of leaf 0x113 on SIM-locked models).<br />
** 1: US operator<br />
** 2: JP operator<br />
** 3: EU generic<br />
** 4: Asia generic<br />
** 5: Canada operator<br />
** 6: Mexico generic<br />
<br />
== 0x116 ==<br />
<br />
ColorVariation (4 bytes)<br />
<br />
Not present on all units.<br />
<br />
Used for wave color by SceShell. ([https://github.com/Princess-of-Sleeping/psp2wpp/blob/master/src/main.c#L441-L467 Patch example])<br />
<br />
<source lang="c"><br />
struct ColorVariation {<br />
uint8_t unk0;<br />
uint16_t unk1; //maybe just two uint8_t?<br />
uint8_t unk3;<br />
/* rest of the leaf is empty */<br />
};<br />
</source><br />
<br />
Example values:<br />
* Call of Duty: Black Ops Declassified limited edition PCH-1004: <code>{ 0x01, 0x0000, 0x00 }</code><br />
* Glacier White PCH-2000 / White PSTV: <code>{ 0x01, 0x000C, 0x00 }</code><br />
<br />
== 0x117 ==<br />
<br />
TemperatureThreashold[https://en.wikipedia.org/wiki/Sic <sup>[sic<nowiki>]</nowiki></sup>] (4 elements of 1 byte each)<br />
<br />
Not present on all units, and always all zeroes when present. Sent to Syscon?<br />
<br />
== 0x118 ==<br />
<br />
AudioParam (1 byte)<br />
<br />
Not present on all units.<br />
<br />
If set to 0 (or the leaf is absent?), AVLS is never forcefully enabled.<br />
<br />
== 0x119 ==<br />
<br />
EtherMacAddress (6 bytes)<br />
<br />
Console-unique. The MAC address of the Ethernet adapter.<br />
<br />
Present on PSTV and PCH-2000 (empty for the latter).<br />
<br />
== 0x11A ==<br />
<br />
WebBrowserParam (1 byte)<br />
<br />
Can be 0/1/2/0x11?<br />
<br />
Seen:<br />
0x02 on PCH200X, 0x11 on PSTV<br />
<br />
== 0x11B ==<br />
<br />
ShutterParam (1 byte)<br />
<br />
Seen: 0x01 on PCH200X, 0x00 on PSTV. When leaf is present and contains 0x01, the value returned by <code>sceAVConfigGetShutterVol()</code> changes from 30 to 26.<br />
<br />
== 0x11C ==<br />
<br />
LedInfoParam (1 byte)<br />
<br />
Seen 0x01 on PCH200X, 0x00 on PSTV</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=IdStorage&diff=20860
IdStorage
2023-12-24T13:07:32Z
<p>CreepNT: /* Leaf content */ Regroup IdpsCert in its own section, add descriptions, rework some leaves</p>
<hr />
<div>See also [https://playstationdev.wiki/pspdevwiki/index.php?title=IDStorage].<br />
<br />
= Description =<br />
<br />
Region of the PSVita eMMC where perconsole info is stored.<br />
<br />
= Location =<br />
<br />
Idstorage data is stored at first raw partition (code 0x1). Use [https://github.com/TeamMolecule/sceutils/blob/master/extract_idstorage.py] to extract.<br />
<br />
= Structure =<br />
<br />
The IdStorage partition is divided in two parts: the mapping table and the leaves.<br />
<br />
== Mapping table ==<br />
<br />
The mapping table is located at the start of the partition. It's an array of 16-bit leaf IDs that serves as a leaf ID->index mapping table. The mapping table must be at least one-sector wide but may be bigger.<br />
<br />
There are two leaf IDs reserved for usage in the mapping table: all entries corresponding to the mapping table (i.e. the first <code>M</code> entries for an </code>M</code> sectors sized table) must hold the value <code>0xFFF5</code>, and all unallocated leaves hold the value <code>0xFFFF</code>.<br />
<br />
To lookup a leaf index based on its ID, use the following algorithm:<br />
<source lang="C"><br />
#define M /* implementation defined */<br />
#define SECTOR_SIZE (512)<br />
<br />
#define NUM_TABLE_ITEMS ((M * SECTOR_SIZE) / sizeof(uint16_t))<br />
uint16_t g_mappingTable[NUM_TABLE_ITEMS];<br />
<br />
int leafIndexFromId(unsigned id) {<br />
if (id >= 0xFFF0)<br />
return /* ERROR: invalid leaf ID */;<br />
<br />
for (int i = 0; i < NUM_TABLE_ITEMS; i++) {<br />
if (g_mappingTable[i] == id)<br />
return i;<br />
}<br />
return /* ERROR: leaf ID is not in mapping table */;<br />
}<br />
</source><br />
<br />
== Leaves ==<br />
<br />
Leaves are sector-sized (512 bytes) areas in the IdStorage partition used to store arbitrary data. While the data stored may be smaller, a leaf always occupies one sector in the partition.<br />
<br />
To read a leaf's data, obtain the leaf index (this can be known directly, or obtained from a leaf ID using the previously mentioned algorithm) then read 512 bytes starting at offset <code>512 * leafIndex</code> in the IdStorage partition.<br />
<br />
== Limits ==<br />
<br />
The number of leaves that can be stored in an IdStorage partition is limited by three factors: the size of the partition, the size of the mapping table and the size of leaf IDs.<br />
<br />
* An <code>M</code> sectors wide mapping table can hold up to <code>255 * M</code> leaves<br />
** This is because a single-sector mapping table can reference <code>SECTOR_SIZE/sizeof(u16) - 1 = 255</code> leaves (the <code>- 1</code> is needed because a table consumes one entry for itself)<br />
* A <code>P</code> sectors wide partition can hold up to <code>P - M</code> leaves<br />
** This is because leaves are sector-sized, and the mapping table consumes <code>M</code> sectors<br />
* There are 65520 leaf IDs available<br />
** While an unsigned 16-bit variable can hold 65536 values, IDs superior or equal to 0xFFF0 are reserved and cannot be used<br />
<br />
From this, we can conclude that an IdStorage partition of <code>P</code> sectors with an <code>M</code> sectors mapping table can hold up to <code>min(255*M, P-M, 65520)</code> leaves. We can also deduce an IdStorage partition is optimally shaped (no space is non-allocatable) when <code>P = 256 * M</code>.<br />
<br />
On Vita, the IdStorage partition is 512KiB and 32 sectors are reserved for the indexing table (<code>P = 1024, M = 32</code>, a non-optimal choice), which means the console's partition can hold '''up to 992 IdStorage leaves'''.<br />
<br />
= Leaf content =<br />
<br />
Leaves not present in this section have not been found in any unit.<br />
<br />
In the following section, "empty" means that the area has all bits set to 1 (i.e., 0xFF).<br />
"Present"/"Not present" means whether or not a leaf exists in IdStorage.<br />
<br />
When a size is indicated, this means only the first X bytes of the leaf are used, and the rest is empty.<br />
<br />
The following information may not be valid for pre-production units.<br />
<br />
== Idps certificates ==<br />
<br />
Leaves 0x000~0x07F are written to IdStorage during manufacturing by a function called '''<code>_writeIdpsCert</code>'''.<br />
<br />
Leaf 0x07E contains the signed SHA-256 digest of leaves 0x000~0x07D (signed using RSA-2048). The public key used for signature verification can be found in <code>factTest.self</code>.<br />
<br />
Leaf 0x07F is not covered by the signature but is flashed in <code>_writeIdpsCert</code> nonetheless.<br />
<br />
=== Empty leaves ===<br />
<br />
The following leaves have always been observed to only contain zeroes:<br />
* 0x008~0x01F<br />
* 0x028~0x03F<br />
* 0x050~0x07D<br />
* 0x7F<br />
<br />
=== 0x000~0x007 ===<br />
<br />
SceIdStoragePspCertificates<br />
<br />
Identical across all units and duplicated in leaves 0x020 to 0x027.<br />
<br />
=== 0x040~0x047 ===<br />
<br />
SceIdStoragePsp2Certificates.<br />
<br />
Console-unique.<br />
<br />
=== 0x048~0x04F ===<br />
<br />
Console-unique. May be certificate(s).<br />
<br />
=== 0x07E ===<br />
<br />
Console-unique.<br />
<br />
The RSA-2048 signature of the Idps certificates (2048 bits/256 bytes) is located at offset 0x60 of this leaf.<br />
<br />
Data contained between 0x0 and 0x5F is unknown, and data between 0x160 and 0x1FF is unused (always 00).<br />
<br />
== 0x80 ==<br />
<br />
Service / Manufacturing Information (SMI)<br />
<br />
Console-unique. Contains minimal firmware version (checked in [[Second Loader|<code>second_loader</code>]]).<br />
<br />
<source lang="c"><br />
struct SMILeaf {<br />
uint8_t magic[4]; //'SMI\0'<br />
uint32_t version; //1<br />
uint32_t min_fwv; //Minimal firmware version<br />
uint8_t unused[0x80 - 0xC];<br />
//Encrypted with per-console keys.<br />
//This is used to verify the leaf has not been modified.<br />
uint8_t encrypted_data[0x200 - 0x80];<br />
};<br />
</source><br />
<br />
== 0x100 ==<br />
<br />
Console-unique. Build data strings. One string starts at offset 0, and one string starts at offset 0x100. Both strings are 0x100 characters long.<br />
<br />
In a 0.920 minfw unit, this leaf instead contains 0x0 at offset 0, 0x10 at offset 0x10, etc up to offset 0xF0, while all other bytes are zeroes.<br />
<br />
== 0x102 ==<br />
<br />
Console-unique. Per-console factory/service product information.<br />
<br />
== 0x103 ==<br />
<br />
Console-unique. Motherboard information.<br />
<br />
* 0x000-0x003: [[KBL_Param#Hardware_Info|ErnieHwInfo]]<br />
* 0x004-0x007: [[SceSyscon#sceSysconGetErnieVersionForDriver|ErnieFwVersion]] (also called Ernie Verison)<br />
* 0x008-0x00B: [[SceSyscon#sceSysconGetErnieDLVersionForDriver|ErnieDlVersion]]<br />
* 0x00C-0x00D: [[Ernie]]CfgVersion (version from ConfigStorageInfo; part of [[Syscon]] "ConfZZ" header)<br />
* 0x00E-0x00F: Padding<br />
* 0x010-0x01F: unknown<br />
* 0x020-0x028: EmmcFwVersion - 1 byte (Vendor ID), 1 empty byte, then 6 bytes (Device Version) // identical on PCH-10xx and PDEL-100x, PS TV has different padding, PCH-20xx has different values<br />
* 0x029-0x02F: unknown<br />
* 0x030-0x037: EmmcFwVersion2 - 1 byte (Vendor ID), 6 bytes (Device Version) and 1 byte (only filled for Samsung eMMC, 0 otherwise)<br />
* 0x038-0x03F: unknown<br />
* 0x040-0x041: [[SceSyscon#sceSysconGetElmoFwVersionForDriver|ElmoFwVersion]]<br />
* 0x042-0x05F: Empty?<br />
* 0x060-0x061: [[SceSyscon#sceSysconGetCookieFwVersionForDriver|CookieFwVersion]]<br />
* 0x062-0x07F: Empty?<br />
* 0x080-0x083: [[SceSyscon#sceSysconMotionGetDeviceInfoForDriver|Motion Device Info]]: <code>BarkleyFwVersion</code> (u16) followed by <code>BarkleyHwInfo</code> (u16)<br />
* 0x084-0x09F: Empty?<br />
* 0x0A0-0x0A5: [[SceSyscon#sceSysconGetBatteryVersionForDriver|Battery (Abby or Bert) Version]]. Empty on PS TV and PDEL-10xx.<br />
* 0x0A6-0x0A7: Empty?<br />
* 0x0A8-0x0AC: Battery calibration data. <code>BatteryVoltageCalib</code> (u16) followed by <code>BatteryCurrentCalib</code> (u16)<br />
* 0x0AC-0x0BF: Empty?<br />
* 0x0C0-0x0CB: [[SceSyscon#sceSysconGetTouchpanelDeviceInfoForDriver|<code>TouchpanelFWVersion</code> (4 u16)]] followed by [[SceSyscon#sceSysconGetTouchpanelDeviceInfo2ForDriver|<code>TouchpanelConfigVersion</code> (2 u16)]]<br />
* 0x0CC-0x0CF: Empty?<br />
* 0x0D0-0x0DF: <code>TouchpanelLotInfo</code>: 2 u32 for each panel<br />
* 0x0E0-0x0E3: Wlan/Bt HW Revision (ex: 50 00 00 00 on PCH-10xx/PCH-20xx/PS TV/PDEL-10xx)<br />
* 0x0E4-0x0E7: Empty?<br />
* 0x0E8-0x0ED: WlanMacAddress - WLAN MAC Address<br />
* 0x0EE-0x0EF: Empty?<br />
* 0x0F0-0x0F5: BtMacAddress - Bluetooh MAC Address<br />
* 0x0F6-0x0FF: Empty?<br />
* 0x100-0x11F: <code>BatteryLotInfo</code> (battery lot serial number in ASCII)<br />
* 0x120-0x183: unknown<br />
* 0x184-0x193: OLEDLotInfo<br />
* 0x194-0x1A3: 4 elements of 0x4 bytes<br />
* 0x1A4-0x1A7: unknown<br />
* 0x1A8-0x1C7: LcdModLotInfo<br />
<br />
== 0x104 ==<br />
<br />
Console-unique. Test/diagnostic results.<br />
<br />
Only present if diagnostic software has been executed on the unit or some factory tests failed.<br />
<br />
== 0x110 ==<br />
<br />
WlanRegion (3 bytes)<br />
<br />
The following algorithm is used to derive it from PsCode:<br />
<source lang="c"><br />
byte WlanRegion[3];<br />
switch(pscode.product_code) {<br />
case 0x100:<br />
case 0x101:<br />
case 0x102:<br />
case 0x104:<br />
case 0x10B:<br />
case 0x10F:<br />
case 0x110:<br />
case 0x111:<br />
WlanRegion[2] = 0;<br />
WlanRegion[1] = 7;<br />
break;<br />
case 0x103:<br />
case 0x106:<br />
case 0x108:<br />
case 0x10A:<br />
case 0x10D:<br />
case 0x10E:<br />
WlanRegion[2] = 0;<br />
WlanRegion[1] = 0x1F;<br />
break;<br />
case 0x105:<br />
case 0x107:<br />
case 0x109:<br />
case 0x10C:<br />
WlanRegion[2] = 1;<br />
WlanRegion[1] = 0x1F;<br />
break;<br />
default:<br />
goto error;<br />
}<br />
WlanRegion[0] = 0xFF;<br />
</source><br />
<br />
== 0x111 ==<br />
<br />
WlanMacAddress (6 bytes)<br />
<br />
Console-unique. The MAC address of the Wireless LAN adapter.<br />
<br />
== 0x112 ==<br />
<br />
MtpSerial (<code>wchar_t[0x20]</code>)<br />
<br />
Console-unique. The serial number sent via the MTP protocol.<br />
<br />
== 0x113 ==<br />
<br />
Console-unique. Information related to the 3G modem.<br />
<br />
Empty on non-3G models.<br />
<br />
== 0x114 ==<br />
<br />
DeviceLocation (four of <code>struct DeviceLocation</code>)<br />
<br />
The location of physical devices in the unit.<br />
<br />
<source lang="c><br />
struct DeviceLocation {<br />
//0x00 - Front camera<br />
//0x01 - Back camera<br />
//0x10 - Accelerometer<br />
//0x11 - Gyro<br />
uint32_t type;<br />
int32_t x;<br />
int32_t y;<br />
int32_t z;<br />
};<br />
</source><br />
<br />
Usually, Cameras are at offsets 0x00 and 0x10 while Motion is at 0x20 and 0x30<br />
<br />
There's unknown int32 flag at 0x100.<br />
<br />
Identical for all consoles of a generation (one kind for Fat, one kind for Slim).<br />
<br />
Empty on PSTV.<br />
<br />
== 0x115 ==<br />
<br />
ProductTypeInfo (<code>char[16]</code>)<br />
<br />
Identical for consoles of the same "type".<br />
<br />
Example values:<br />
* <code>PDEL100000010000</code> (PDEL-1000)<br />
* <code>PCH01004ZAZ20000</code> (PCH-1004 - Call of Duty: Black Ops Declassified limited edition)<br />
* <code>PCH01100AA010002</code> (Crystal Black PCH-1100 - docomo carrier)<br />
* <code>PCH02000ZA120000</code> (White PCH-2000)<br />
<br />
Decomposition: <code>FFFF NNNN ZZ Y X xxx O</code><br />
* <code>FFFF</code> and <code>NNNN</code> = Model code (e.g. PDEL-1000) decomposed in two parts<br />
** <code>FFFF</code> = family (e.g., PCH, PDEL)<br />
** <code>NNNN</code> = number (e.g., 1000, 1004, 1100)<br />
* <code>ZZ</code> = ? (known values: 00, ZA, AA)<br />
* <code>Y</code> = ? (known values: 0, 1, Z)<br />
* <code>X</code> = ? (known values: 1, 2)<br />
* <code>xxx</code> = ? (always 000)<br />
* <code>O</code> = Product target operator (carrier ID for 3G models - usually matches offset 0x88 of leaf 0x113 on SIM-locked models).<br />
** 1 us operator<br />
** 2 jp operator<br />
** 3 eu generic<br />
** 4 asia generic<br />
** 5 canada operator<br />
** 6 mexico generic<br />
<br />
== 0x116 ==<br />
<br />
ColorVariation (4 bytes)<br />
<br />
Not present on all units.<br />
<br />
Used for wave color by SceShell. ([https://github.com/Princess-of-Sleeping/psp2wpp/blob/master/src/main.c#L441-L467 Patch example])<br />
<br />
<source lang="c"><br />
struct ColorVariation {<br />
uint8_t unk0;<br />
uint16_t unk1; //maybe just two uint8_t?<br />
uint8_t unk3;<br />
/* rest of the leaf is empty */<br />
};<br />
</source><br />
<br />
Example values:<br />
* Call of Duty: Black Ops Declassified limited edition PCH-1004: <code>{ 0x01, 0x0000, 0x00 }</code><br />
* Glacier White PCH-2000 / White PSTV: <code>{ 0x01, 0x000C, 0x00 }</code><br />
<br />
== 0x117 ==<br />
<br />
TemperatureThreashold[https://en.wikipedia.org/wiki/Sic <sup>[sic<nowiki>]</nowiki></sup>] (4 elements of 1 byte each)<br />
<br />
Not present on all units, and always all zeroes when present. Sent to Syscon?<br />
<br />
== 0x118 ==<br />
<br />
AudioParam (1 byte)<br />
<br />
Not present on all units.<br />
<br />
If set to 0 (or the leaf is absent?), AVLS is never forcefully enabled.<br />
<br />
== 0x119 ==<br />
<br />
EtherMacAddress (6 bytes)<br />
<br />
Console-unique. The MAC address of the Ethernet adapter.<br />
<br />
Present on PSTV and PCH-2000 (empty for the latter).<br />
<br />
== 0x11A ==<br />
<br />
WebBrowserParam (1 byte)<br />
<br />
Can be 0/1/2/0x11?<br />
<br />
Seen:<br />
0x02 on PCH200X, 0x11 on PSTV<br />
<br />
== 0x11B ==<br />
<br />
ShutterParam (1 byte)<br />
<br />
Seen: 0x01 on PCH200X, 0x00 on PSTV. When leaf is present and contains 0x01, the value returned by <code>sceAVConfigGetShutterVol()</code> changes from 30 to 26.<br />
<br />
== 0x11C ==<br />
<br />
LedInfoParam (1 byte)<br />
<br />
Seen 0x01 on PCH200X, 0x00 on PSTV</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=IdStorage&diff=20857
IdStorage
2023-12-24T00:51:42Z
<p>CreepNT: /* 0x103 */ Add official names, missing fields and more details</p>
<hr />
<div>See also [https://playstationdev.wiki/pspdevwiki/index.php?title=IDStorage].<br />
<br />
= Description =<br />
<br />
Region of the PSVita eMMC where perconsole info is stored.<br />
<br />
= Location =<br />
<br />
Idstorage data is stored at first raw partition (code 0x1). Use [https://github.com/TeamMolecule/sceutils/blob/master/extract_idstorage.py] to extract.<br />
<br />
= Structure =<br />
<br />
The IdStorage partition is divided in two parts: the mapping table and the leaves.<br />
<br />
== Mapping table ==<br />
<br />
The mapping table is located at the start of the partition. It's an array of 16-bit leaf IDs that serves as a leaf ID->index mapping table. The mapping table must be at least one-sector wide but may be bigger.<br />
<br />
There are two leaf IDs reserved for usage in the mapping table: all entries corresponding to the mapping table (i.e. the first <code>M</code> entries for an </code>M</code> sectors sized table) must hold the value <code>0xFFF5</code>, and all unallocated leaves hold the value <code>0xFFFF</code>.<br />
<br />
To lookup a leaf index based on its ID, use the following algorithm:<br />
<source lang="C"><br />
#define M /* implementation defined */<br />
#define SECTOR_SIZE (512)<br />
<br />
#define NUM_TABLE_ITEMS ((M * SECTOR_SIZE) / sizeof(uint16_t))<br />
uint16_t g_mappingTable[NUM_TABLE_ITEMS];<br />
<br />
int leafIndexFromId(unsigned id) {<br />
if (id >= 0xFFF0)<br />
return /* ERROR: invalid leaf ID */;<br />
<br />
for (int i = 0; i < NUM_TABLE_ITEMS; i++) {<br />
if (g_mappingTable[i] == id)<br />
return i;<br />
}<br />
return /* ERROR: leaf ID is not in mapping table */;<br />
}<br />
</source><br />
<br />
== Leaves ==<br />
<br />
Leaves are sector-sized (512 bytes) areas in the IdStorage partition used to store arbitrary data. While the data stored may be smaller, a leaf always occupies one sector in the partition.<br />
<br />
To read a leaf's data, obtain the leaf index (this can be known directly, or obtained from a leaf ID using the previously mentioned algorithm) then read 512 bytes starting at offset <code>512 * leafIndex</code> in the IdStorage partition.<br />
<br />
== Limits ==<br />
<br />
The number of leaves that can be stored in an IdStorage partition is limited by three factors: the size of the partition, the size of the mapping table and the size of leaf IDs.<br />
<br />
* An <code>M</code> sectors wide mapping table can hold up to <code>255 * M</code> leaves<br />
** This is because a single-sector mapping table can reference <code>SECTOR_SIZE/sizeof(u16) - 1 = 255</code> leaves (the <code>- 1</code> is needed because a table consumes one entry for itself)<br />
* A <code>P</code> sectors wide partition can hold up to <code>P - M</code> leaves<br />
** This is because leaves are sector-sized, and the mapping table consumes <code>M</code> sectors<br />
* There are 65520 leaf IDs available<br />
** While an unsigned 16-bit variable can hold 65536 values, IDs superior or equal to 0xFFF0 are reserved and cannot be used<br />
<br />
From this, we can conclude that an IdStorage partition of <code>P</code> sectors with an <code>M</code> sectors mapping table can hold up to <code>min(255*M, P-M, 65520)</code> leaves. We can also deduce an IdStorage partition is optimally shaped (no space is non-allocatable) when <code>P = 256 * M</code>.<br />
<br />
On Vita, the IdStorage partition is 512KiB and 32 sectors are reserved for the indexing table (<code>P = 1024, M = 32</code>, a non-optimal choice), which means the console's partition can hold '''up to 992 IdStorage leaves'''.<br />
<br />
= Leaf content =<br />
<br />
Leaves not present in this section have not been found in any unit.<br />
<br />
In the following section, "empty" means that the area has all bits set to 1 (i.e., 0xFF).<br />
"Present"/"Not present" means whether or not a leaf exists in IdStorage.<br />
<br />
When a size is indicated, this means only the first X bytes of the leaf are used, and the rest is empty.<br />
<br />
The following information may not be valid for pre-production units.<br />
<br />
== 0x000~0x007 ==<br />
<br />
SceIdStoragePspCertificates<br />
<br />
Identical across all units and duplicated in leaves 0x020 to 0x027.<br />
<br />
== 0x040~0x047 ==<br />
<br />
SceIdStoragePsp2Certificates.<br />
<br />
Console-unique.<br />
<br />
== 0x048~0x04F ==<br />
<br />
Console-unique. May be certificate(s).<br />
<br />
== 0x07E ==<br />
<br />
Console-unique.<br />
<br />
== 0x80 ==<br />
<br />
Service / Manufacturing Information (SMI)<br />
<br />
Console-unique. Contains minimal firmware version (checked in [[Second Loader|<code>second_loader</code>]]).<br />
<br />
<source lang="c"><br />
struct SMILeaf {<br />
uint8_t magic[4]; //'SMI\0'<br />
uint32_t version; //1<br />
uint32_t min_fwv; //Minimal firmware version<br />
uint8_t unused[0x80 - 0xC];<br />
//Encrypted with per-console keys.<br />
//This is used to verify the leaf has not been modified.<br />
uint8_t encrypted_data[0x200 - 0x80];<br />
};<br />
</source><br />
<br />
== 0x100 ==<br />
<br />
Console-unique. Build data strings. One string starts at offset 0, and one string starts at offset 0x100. Both strings are 0x100 characters long.<br />
<br />
In a 0.920 minfw unit, this leaf instead contains 0x0 at offset 0, 0x10 at offset 0x10, etc up to offset 0xF0, while all other bytes are zeroes.<br />
<br />
== 0x102 ==<br />
<br />
Console-unique. Per-console factory/service product information.<br />
<br />
== 0x103 ==<br />
<br />
Console-unique. Motherboard information.<br />
<br />
* 0x000-0x003: [[KBL_Param#Hardware_Info|ErnieHwInfo]]<br />
* 0x004-0x007: [[SceSyscon#sceSysconGetErnieVersionForDriver|ErnieFwVersion]] (also called Ernie Verison)<br />
* 0x008-0x00B: [[SceSyscon#sceSysconGetErnieDLVersionForDriver|ErnieDlVersion]]<br />
* 0x00C-0x00D: [[Ernie]]CfgVersion (version from ConfigStorageInfo; part of [[Syscon]] "ConfZZ" header)<br />
* 0x00E-0x00F: Padding<br />
* 0x010-0x01F: unknown<br />
* 0x020-0x028: EmmcFwVersion - 1 byte (Vendor ID), 1 empty byte, then 6 bytes (Device Version) // identical on PCH-10xx and PDEL-100x, PS TV has different padding, PCH-20xx has different values<br />
* 0x029-0x02F: unknown<br />
* 0x030-0x037: EmmcFwVersion2 - 1 byte (Vendor ID), 6 bytes (Device Version) and 1 byte (only filled for Samsung eMMC, 0 otherwise)<br />
* 0x038-0x03F: unknown<br />
* 0x040-0x041: [[SceSyscon#sceSysconGetElmoFwVersionForDriver|ElmoFwVersion]]<br />
* 0x042-0x05F: Empty?<br />
* 0x060-0x061: [[SceSyscon#sceSysconGetCookieFwVersionForDriver|CookieFwVersion]]<br />
* 0x062-0x07F: Empty?<br />
* 0x080-0x083: [[SceSyscon#sceSysconMotionGetDeviceInfoForDriver|Motion Device Info]]: <code>BarkleyFwVersion</code> (u16) followed by <code>BarkleyHwInfo</code> (u16)<br />
* 0x084-0x09F: Empty?<br />
* 0x0A0-0x0A5: [[SceSyscon#sceSysconGetBatteryVersionForDriver|Battery (Abby or Bert) Version]]. Empty on PS TV and PDEL-10xx.<br />
* 0x0A6-0x0A7: Empty?<br />
* 0x0A8-0x0AC: Battery calibration data. <code>BatteryVoltageCalib</code> (u16) followed by <code>BatteryCurrentCalib</code> (u16)<br />
* 0x0AC-0x0BF: Empty?<br />
* 0x0C0-0x0CB: [[SceSyscon#sceSysconGetTouchpanelDeviceInfoForDriver|<code>TouchpanelFWVersion</code> (4 u16)]] followed by [[SceSyscon#sceSysconGetTouchpanelDeviceInfo2ForDriver|<code>TouchpanelConfigVersion</code> (2 u16)]]<br />
* 0x0CC-0x0CF: Empty?<br />
* 0x0D0-0x0DF: <code>TouchpanelLotInfo</code>: 2 u32 for each panel<br />
* 0x0E0-0x0E3: Wlan/Bt HW Revision (ex: 50 00 00 00 on PCH-10xx/PCH-20xx/PS TV/PDEL-10xx)<br />
* 0x0E4-0x0E7: Empty?<br />
* 0x0E8-0x0ED: WlanMacAddress - WLAN MAC Address<br />
* 0x0EE-0x0EF: Empty?<br />
* 0x0F0-0x0F5: BtMacAddress - Bluetooh MAC Address<br />
* 0x0F6-0x0FF: Empty?<br />
* 0x100-0x11F: <code>BatteryLotInfo</code> (battery lot serial number in ASCII)<br />
* 0x120-0x183: unknown<br />
* 0x184-0x193: OLEDLotInfo<br />
* 0x194-0x1A3: 4 elements of 0x4 bytes<br />
* 0x1A4-0x1A7: unknown<br />
* 0x1A8-0x1C7: LcdModLotInfo<br />
<br />
== 0x104 ==<br />
<br />
Console-unique. Diagnostic results.<br />
<br />
Not present if diagnostic software has not been executed on the unit.<br />
<br />
== 0x110 ==<br />
<br />
WlanRegion (3 bytes)<br />
<br />
The following algorithm is used to derive it from PsCode:<br />
<source lang="c"><br />
byte WlanRegion[3];<br />
switch(pscode.product_code) {<br />
case 0x100:<br />
case 0x101:<br />
case 0x102:<br />
case 0x104:<br />
case 0x10B:<br />
case 0x10F:<br />
case 0x110:<br />
case 0x111:<br />
WlanRegion[2] = 0;<br />
WlanRegion[1] = 7;<br />
break;<br />
case 0x103:<br />
case 0x106:<br />
case 0x108:<br />
case 0x10A:<br />
case 0x10D:<br />
case 0x10E:<br />
WlanRegion[2] = 0;<br />
WlanRegion[1] = 0x1F;<br />
break;<br />
case 0x105:<br />
case 0x107:<br />
case 0x109:<br />
case 0x10C:<br />
WlanRegion[2] = 1;<br />
WlanRegion[1] = 0x1F;<br />
break;<br />
default:<br />
goto error;<br />
}<br />
WlanRegion[0] = 0xFF;<br />
</source><br />
<br />
== 0x111 ==<br />
<br />
WlanMacAddress (6 bytes)<br />
<br />
Console-unique. The MAC address of the Wireless LAN adapter.<br />
<br />
== 0x112 ==<br />
<br />
MtpSerial (<code>wchar_t[0x20]</code>)<br />
<br />
Console-unique. The serial number sent via the MTP protocol.<br />
<br />
== 0x113 ==<br />
<br />
Console-unique. Information related to the 3G modem.<br />
<br />
Empty on non-3G models.<br />
<br />
== 0x114 ==<br />
<br />
Physical device location<br />
<br />
Four of:<br />
<source lang="c><br />
struct DeviceLocation {<br />
uint32_t type;<br />
int32_t x;<br />
int32_t y;<br />
int32_t z;<br />
};<br />
</source><br />
<br />
Where type: 0x00 - Front camera, 0x01 - Back camera, 0x10 - Accelerometer, 0x11 - Gyro<br />
<br />
Cameras are at offsets 0x00 and 0x10, Motion at 0x20 and 0x30<br />
<br />
There's unknown int32 flag at 0x100<br />
<br />
Identical for all consoles of a generation (one kind for Fat, one kind for Slim).<br />
<br />
Empty on PSTV.<br />
<br />
== 0x115 ==<br />
<br />
ProductTypeInfo (<code>char[16]</code>)<br />
<br />
Identical for consoles of the same "type".<br />
<br />
Example values:<br />
* <code>PDEL100000010000</code> (PDEL-1000)<br />
* <code>PCH01004ZAZ20000</code> (PCH-1004 - Call of Duty: Black Ops Declassified limited edition)<br />
* <code>PCH01100AA010002</code> (Crystal Black PCH-1100 - docomo carrier)<br />
* <code>PCH02000ZA120000</code> (White PCH-2000)<br />
<br />
Decomposition: <code>FFFF NNNN ZZ Y X xxx O</code><br />
* <code>FFFF</code> and <code>NNNN</code> = Model code (e.g. PDEL-1000) decomposed in two parts<br />
** <code>FFFF</code> = family (e.g., PCH, PDEL)<br />
** <code>NNNN</code> = number (e.g., 1000, 1004, 1100)<br />
* <code>ZZ</code> = ? (known values: 00, ZA, AA)<br />
* <code>Y</code> = ? (known values: 0, 1, Z)<br />
* <code>X</code> = ? (known values: 1, 2)<br />
* <code>xxx</code> = ? (always 000)<br />
* <code>O</code> = Product target operator (carrier ID for 3G models - usually matches offset 0x88 of leaf 0x113 on SIM-locked models)<br />
<br />
== 0x116 ==<br />
<br />
ColorVariation (4 bytes)<br />
<br />
Not present on all units.<br />
<br />
Used for wave color by SceShell. ([https://github.com/Princess-of-Sleeping/psp2wpp/blob/master/src/main.c#L441-L467 Patch example])<br />
<br />
<source lang="c"><br />
struct ColorVariation {<br />
uint8_t unk0;<br />
uint16_t unk1;<br />
uint8_t unk3;<br />
/* rest of the leaf is empty */<br />
};<br />
</source><br />
<br />
Example values:<br />
* Call of Duty: Black Ops Declassified limited edition PCH-1004: <code>{ 0x01, 0x0000, 0x00 }</code><br />
* Glacier White PCH-2000 <code>{ 0x01, 0x000C, 0x00 }</code><br />
<br />
== 0x117 ==<br />
<br />
TemperatureThreashold[https://en.wikipedia.org/wiki/Sic <sup>[sic<nowiki>]</nowiki></sup>] (4 elements of 1 byte each)<br />
<br />
Not present on all units, and always all zeroes when present.<br />
<br />
== 0x118 ==<br />
<br />
AudioParam (1 byte)<br />
<br />
Not present on all units.<br />
<br />
If set to 0 (or the leaf is absent?), AVLS is never forcefully enabled.<br />
<br />
== 0x119 ==<br />
<br />
EtherMacAddress (6 bytes)<br />
<br />
Console-unique. The MAC address of the Ethernet adapter.<br />
<br />
Present on PSTV and PCH-2000 (where it is empty).<br />
<br />
== 0x11A ==<br />
<br />
WebBrowserParam (1 byte)<br />
<br />
Can be 0/1/2/0x11?<br />
<br />
Seen:<br />
0x02 on PCH200X, 0x11 on PSTV<br />
<br />
== 0x11B ==<br />
<br />
ShutterParam (1 byte)<br />
<br />
Seen: 0x01 on PCH200X, 0x00 on PSTV. When leaf is present and contains 0x01, the value returned by <code>sceAVConfigGetShutterVol()</code> changes from 30 to 26.<br />
<br />
== 0x11C ==<br />
<br />
LedInfoParam (1 byte)<br />
<br />
Seen 0x01 on PCH200X, 0x00 on PSTV<br />
<br />
== Zeroed leaves ==<br />
<br />
The following leaves are present in IdStorage, but seem to always contain zeroes:<br />
* 0x008~0x01F<br />
* 0x028~0x03F<br />
* 0x050~0x07D<br />
* 0x7F</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=SceMotionDev&diff=20856
SceMotionDev
2023-12-24T00:42:09Z
<p>CreepNT: /* sceMotionDevGetDeviceInfoForDriver */ Update structure with correct layout and names</p>
<hr />
<div>== Module ==<br />
<br />
{| class="wikitable"<br />
|-<br />
! Version !! World !! Privilege<br />
|-<br />
| 1.69-3.60 || Non-secure || Kernel<br />
|}<br />
<br />
== Libraries ==<br />
<br />
=== Known NIDs ===<br />
<br />
{| class="wikitable"<br />
|-<br />
! Version !! Name !! World !! Visibility !! NID<br />
|-<br />
| 1.69-3.60 || [[SceMotionDev#SceMotionDev|SceMotionDev]] || Non-secure || User || 0x1F766AC7<br />
|-<br />
| 1.69-3.60 || [[SceMotionDev#SceMotionDevForDriver|SceMotionDevForDriver]] || Non-secure || Kernel || 0xA501409A<br />
|}<br />
<br />
== SceMotionDev ==<br />
<br />
=== sceMotionDevGetAccCalibData2 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xD582B628<br />
|}<br />
<br />
=== sceMotionDevGetAccCalibData ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0xAF014866<br />
|}<br />
<br />
=== sceMotionDevGetCalibrationData ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x716C685B<br />
|}<br />
<br />
=== sceMotionDevGetCalibrationHeader ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0xBDEC1E32<br />
|}<br />
<br />
=== sceMotionDevGetControllerType ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xA2CD11F6<br />
|}<br />
<br />
=== sceMotionDevGetCurrentMagnCalibData ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0xAAB4B41F<br />
|}<br />
<br />
=== sceMotionDevGetCurrentMagnStabilityLevel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x067F06D9<br />
|}<br />
<br />
=== sceMotionDevGetDeviceInfo ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x1F1EFEFB<br />
|}<br />
<br />
=== sceMotionDevGetDeviceLocation ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x5EDEA879<br />
|}<br />
<br />
=== sceMotionDevGetDs3CalibData ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x1FD76B5E<br />
|}<br />
<br />
=== sceMotionDevGetEvaInfo ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xE6955280<br />
|}<br />
<br />
=== sceMotionDevGetFactoryMagnCalibData ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x777D57D2<br />
|}<br />
<br />
=== sceMotionDevGetGyroBias2 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x12B9F05E<br />
|}<br />
<br />
=== sceMotionDevGetGyroBias ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x6D033072<br />
|}<br />
<br />
=== sceMotionDevGetGyroCalibData2 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x160E8DE9<br />
|}<br />
<br />
=== sceMotionDevGetGyroCalibData ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x74555D91<br />
|}<br />
<br />
=== sceMotionDevGetMeasMode ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xEA95D3C9<br />
|}<br />
<br />
=== sceMotionDevIsReady ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0xE8A3E48E<br />
|}<br />
<br />
=== sceMotionDevMagnSamplingStart ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x16DD5913<br />
|}<br />
<br />
=== sceMotionDevMagnSamplingStop ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0xE72A35B8<br />
|}<br />
<br />
=== sceMotionDevRead2 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xFB87948E<br />
|}<br />
<br />
=== sceMotionDevRead3 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x27954BC7<br />
|}<br />
<br />
=== sceMotionDevReadForMagnCalib ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0xCC4FDA6A<br />
|}<br />
<br />
=== sceMotionDevRead ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0xC0095F0F<br />
|}<br />
<br />
=== sceMotionDevSamplingStart2 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xB51E02E8<br />
|}<br />
<br />
=== sceMotionDevSamplingStart ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x47948D9C<br />
|}<br />
<br />
=== sceMotionDevSamplingStop2 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x9E868205<br />
|}<br />
<br />
=== sceMotionDevSamplingStop ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x56C1551E<br />
|}<br />
<br />
=== sceMotionDevSetGyroFeedBack ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xCCAEBF59<br />
|}<br />
<br />
=== sceMotionDevSetSamplingMode ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x3EAA8A4F<br />
|}<br />
<br />
=== sceMotionDevUpdateMagnCalibData ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0x787384FA<br />
|}<br />
<br />
=== sceMotionDevUpdateMagnStabilityLevel ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 1.69-3.60 || 0xEC94F683<br />
|}<br />
<br />
== SceMotionDevForDriver ==<br />
<br />
=== sceMotionDevGetCalibrationDataForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xF0251700<br />
|}<br />
<br />
=== sceMotionDevGetCalibrationHeaderForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x3B23DF55<br />
|}<br />
<br />
=== sceMotionDevGetDeviceInfoForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931.010-3.740.011 || 0x3E4BCBC0<br />
|}<br />
<br />
Returns Motion device information, obtained using [[SceSyscon#sceSysconMotionGetDeviceInfoForDriver]].<br />
<br />
<source lang="C"><br />
typedef struct SceKernelMotionDeviceInfo {<br />
uint16_t BarkleyFwVersion;<br />
uint16_t BarkleyHwInfo;<br />
} SceKernelDeviceInfo;<br />
<br />
int sceMotionDevGetDeviceInfoForDriver(SceKernelMotionDeviceInfo *pInfo);<br />
</source><br />
<br />
=== sceMotionDevGetEvaInfoForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x5B53AC26<br />
|}<br />
<br />
=== sceMotionDevIsReadyForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x10AAC8EA<br />
|}<br />
<br />
=== sceMotionDevNoiseFilterIsAvailableForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x11A17A96<br />
|}<br />
<br />
=== sceMotionDevReadForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x3A3407B5<br />
|}<br />
<br />
=== sceMotionDevRegisterVirtualMotionDriverForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x7FD06731<br />
|}<br />
<br />
=== sceMotionDevSamplingStartForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xC02C85AB<br />
|}<br />
<br />
=== sceMotionDevSamplingStopForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xFD0B0785<br />
|}<br />
<br />
=== sceMotionDevSetSamplingModeForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xDBAF611A<br />
|}<br />
<br />
=== SceMotionDevForDriver_unk_031AF7A1 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x031AF7A1<br />
|}<br />
<br />
=== SceMotionDevForDriver_unk_0808D77D ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x0808D77D<br />
|}<br />
<br />
=== sceMotionDevUpdateSendCommandForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0x09918DAE<br />
|}<br />
<br />
Requests:<br />
* 0x80 0x2: Download Mode Request<br />
* 0x81 0x12: Start Transfer Request<br />
* 0x82 0x26: Transfer Program Data<br />
* 0x83 0x2: Flash Write Request<br />
* 0x84 0x2: Download Finish Request<br />
<br />
<source lang="C"><br />
typedef struct SceMotionDevUpdateStartTransferRequest { // Size is 0x3A on FW 0.931<br />
uint8_t headerSize; // usually 0x10<br />
uint8_t hwInfo;<br />
uint8_t dataType;<br />
uint8_t padding_0x7;<br />
uint16_t dataVersion;<br />
uint16_t padding_0xE;<br />
uint32_t dataSize;<br />
uint32_t address;<br />
uint16_t check_sum; // checksum of the header (0x10 bytes)<br />
uint8_t padding[0x26];<br />
} SceMotionDevUpdateStartTransferRequest;<br />
<br />
typedef struct SceMotionDevUpdateTransferProgramDataRequest { // Size is 0x3A on FW 0.931<br />
uint32_t offset;<br />
uint8_t programData[0x20];<br />
uint8_t padding[0x16];<br />
} SceMotionDevUpdateTransferProgramDataRequest;<br />
<br />
typedef struct SceMotionDevUpdateRequest { // Size is 0x3C on FW 0.931<br />
uint8_t type; // ex: 0x80, 0x81, 0x82, 0x83, 0x84<br />
uint8_t size; // ex: 2, 0x12, 0x26<br />
uint8_t data[0x3A];<br />
} SceMotionDevUpdateRequest;<br />
<br />
typedef struct SceMotionDevUpdateResponse { // Size is 0x40 on FW 0.931<br />
SceUInt32 packetID;<br />
SceUInt32 status;<br />
char unk[0x38];<br />
} SceMotionDevUpdateResponse;<br />
<br />
int sceMotionDevUpdateSendCommandForDriver(void *callback, SceMotionDevUpdateRequest *pRequest, SceMotionDevUpdateResponse *pResponse, SceUID *evfId);<br />
</source><br />
<br />
=== sceMotionDevSetActiveProcessForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.990-3.60 || 0x22CD6DCA<br />
|}<br />
<br />
<source lang="C">int sceMotionDevSetActiveProcessForDriver(SceUID pid);</source><br />
<br />
=== SceMotionDevForDriver_unk_3CD0CE14 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x3CD0CE14<br />
|}<br />
<br />
=== SceMotionDevForDriver_unk_77BA3A04 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x77BA3A04<br />
|}<br />
<br />
=== SceMotionDevForDriver_unk_85E3C678 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0x85E3C678<br />
|}<br />
<br />
=== sceMotionDevUpdateRestartForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0xA75976EE<br />
|}<br />
<br />
<source lang="C">int sceMotionDevUpdateRestartForDriver(void);</source><br />
<br />
=== SceMotionDevForDriver_unk_D7DA3DA7 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xD7DA3DA7<br />
|}<br />
<br />
=== SceMotionDevForDriver_unk_DB89D1BF ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xDB89D1BF<br />
|}<br />
<br />
=== sceMotionDevUpdateInitForDriver ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 0.931-3.60 || 0xFD1C528D<br />
|}<br />
<br />
<source lang="C">int sceMotionDevUpdateInitForDriver(void);</source><br />
<br />
=== SceMotionDevForDriver_unk_FE6ECA41 ===<br />
{| class="wikitable"<br />
|-<br />
! Version !! NID<br />
|-<br />
| 3.60 || 0xFE6ECA41<br />
|}<br />
<br />
[[Category:ARM]]<br />
[[Category:Kernel]]<br />
[[Category:Modules]]<br />
[[Category:Library]]</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=Ernie&diff=20855
Ernie
2023-12-23T16:16:02Z
<p>CreepNT: /* NVS */ Add name of NVS 0x484</p>
<hr />
<div>Ernie is the codename for the Syscon chip. The Syscon is for exemple responsible for handling button input (including power button), reading/writing to non-volatile storage (NVS) for storing system flags (mostly encrypted and signed). For example IDU flag is stored in NVS. Syscon is also responsible for maintaining the physical address to the resume buffer during [[Suspend]]. Communication between [[Kermit]] and Syscon is mainly through SPI (see [[SceSyscon]]) but there are also some GPIO pins connecting the two. The chip model is NEC/Renesas <code>uPD79F0109</code> and is likely custom designed for Sony.<br />
<br />
See also: [[Ernie Secure]]<br />
<br />
= Boot Process =<br />
<br />
The following is logged from boot. The timestamp is in seconds (the starting time is irrelevant). The arrow at the start indicates direction: '>' means Kermit to Syscon (MOSI) and '<' means Syscon to Kermit (MISO). Then there is a 2 byte command id or response code, followed by a flag byte (response only), the payload, a [[#Packet checksum|checksum byte]], and an (response only) unknown byte. Please note that the packets are listed in transfer order but this may not represent the logical order of the packets. It is currently unknown what the logical order should be, but one can guess that a response is "close to" a request.<br />
<br />
First some version information seems to be sent from Syscon to Kermit. This is same for cold boot and resume boot. The last response indicates the type of boot where 0xFF80 is resume and 0xFF14 is regular boot.<br />
<br />
<pre><br />
< [2.048118000000000] 0x0004, flags=00, payload=[0D 06 00 01 | ....], chk=0xE1, unk=0x00<br />
> [2.048118000000000] 0x0001, payload=[ | ], chk=0xFD<br />
< [2.048659583333333] 0x0004, flags=00, payload=[00 60 40 00 | .`@.], chk=0x55, unk=0x00<br />
> [2.048659583333333] 0x0005, payload=[ | ], chk=0xF9<br />
< [2.049330083333333] 0x0004, flags=00, payload=[32 30 31 32 31 31 30 38 31 37 30 34 | 201211081704], chk=0x92, unk=0x00<br />
> [2.049330083333333] 0x0002, payload=[ | ], chk=0xFC<br />
< [2.054004333333333] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x30<br />
> [2.054004333333333] 0x0080, payload=[12 00 | ..], chk=0x6A<br />
< [2.058172916666666] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x30<br />
> [2.058172916666666] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.062716333333333] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x30<br />
> [2.062716333333333] 0x0080, payload=[12 00 | ..], chk=0x6A<br />
< [2.111457750000000] 0x0004, flags=00, payload=[14 FF | ..], chk=0xE4, unk=0x32<br />
</pre><br />
<br />
Next some encrypted session is established. A 8 byte nonce is sent from Syscon (it appears random for each boot, cold or warm). Encrypted data from this point on always differs each boot.<br />
<br />
<pre><br />
> [2.111457750000000] 0x0010, payload=[ | ], chk=0xEE<br />
< [2.133389000000000] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0xFF<br />
> [2.133389000000000] 0x00A0, payload=[30 00 00 0B 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | 0.......................................], chk=0xFB<br />
< [2.150567250000000] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0xFF<br />
> [2.150567250000000] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.155149500000000] 0x0024, flags=00, payload=[30 01 00 0B 00 00 00 00 A4 B0 EF 23 D6 9A 3A 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | 0..........#..:.........................], chk=0x5F, unk=0x00<br />
> [2.155149500000000] 0x00A0, payload=[30 00 00 0B 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | 0.......................................], chk=0xFB<br />
< [2.163572000000000] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x01<br />
> [2.163572000000000] 0x00A0, payload=[30 02 00 0B 01 00 00 00 6C 7F E0 79 AA 03 4B B0 96 B7 42 F0 BC F8 62 7A 35 27 53 68 3D 0D ED A7 13 F2 32 77 46 2D 54 F8 | 0.......l..y..K...B...bz5'Sh=.....2wF-T.], chk=0x9B<br />
< [2.189271166666667] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x01<br />
> [2.189271166666667] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.193866583333334] 0x0024, flags=00, payload=[30 03 00 0B 00 00 00 00 7A 44 6E C8 F5 FA 35 CB 9B E9 E6 A0 B6 5C 85 1D FB A8 89 5C 9C 04 0B 29 34 59 55 EB 1D 98 AB 83 | 0.......zDn...5......\.....\...)4YU.....], chk=0xC6, unk=0x00<br />
> [2.193866583333334] 0x00A0, payload=[30 02 00 0B 01 00 00 00 6C 7F E0 79 AA 03 4B B0 96 B7 42 F0 BC F8 62 7A 35 27 53 68 3D 0D ED A7 13 F2 32 77 46 2D 54 F8 | 0.......l..y..K...B...bz5'Sh=.....2wF-T.], chk=0x9B<br />
</pre><br />
<br />
Some more data is exchanged. Up until this point all the plaintext payloads appear to be the same from coldboot and warmboot.<br />
<br />
<pre><br />
< [2.202246333333334] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x03<br />
> [2.202246333333334] 0x088E, payload=[01 22 | ."], chk=0x43<br />
< [2.206411750000000] 0x0004, flags=00, payload=[ | ], chk=0xF9, unk=0x03<br />
> [2.206411750000000] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.217062666666667] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x03<br />
> [2.217062666666667] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.221620916666667] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x03<br />
> [2.221620916666667] 0x088E, payload=[01 22 | ."], chk=0x43<br />
< [2.229805500000000] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x03<br />
> [2.229805500000000] 0x1082, payload=[80 04 08 | ...], chk=0xDD<br />
< [2.233887583333333] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x03<br />
> [2.233887583333333] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.238363416666667] 0x0024, flags=00, payload=[FF FF FF FF 01 FF FF FF | ........], chk=0xD7, unk=0x44<br />
> [2.238363416666667] 0x1082, payload=[80 04 08 | ...], chk=0xDD<br />
< [2.246473916666667] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0xFF<br />
</pre><br />
<br />
Now, there appears to be a branch. The next sequence only shows up for cold boots.<br />
<br />
<pre><br />
> [2.246473916666667] 0x1082, payload=[A0 04 01 | ...], chk=0xC4<br />
< [2.250555000000000] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0xFF<br />
> [2.250555000000000] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.255030833333334] 0x0024, flags=00, payload=[FF | .], chk=0xD9, unk=0x00<br />
> [2.255030833333334] 0x1082, payload=[A0 04 01 | ...], chk=0xC4<br />
< [2.259176583333333] 0x0004, flags=00, payload=[01 01 13 00 | ....], chk=0xE0, unk=0xFF<br />
> [2.259176583333333] 0x1100, payload=[ | ], chk=0xED<br />
< [2.263720583333333] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x01<br />
> [2.263720583333333] 0x00D0, payload=[30 00 00 0F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | 0.......................................], chk=0xC7<br />
< [2.267827000000000] 0x0004, flags=00, payload=[ | ], chk=0xF9, unk=0x01<br />
> [2.267827000000000] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.278339666666667] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x01<br />
> [2.278339666666667] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.282830833333333] 0x0024, flags=00, payload=[30 01 00 0F 00 00 00 00 E1 CA 65 96 BB 7E 81 7A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | 0.........e..~.z........................], chk=0x97, unk=0x00<br />
> [2.282830833333333] 0x00D0, payload=[30 00 00 0F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | 0.......................................], chk=0xC7<br />
< [2.291023500000000] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x01<br />
> [2.291023500000000] 0x00D0, payload=[30 02 00 0F 01 00 00 00 4E D7 C0 7C D5 E8 BB D7 3E 9E 43 7B B2 E3 4D 81 23 C8 C4 BF B8 4D 9B 25 0A 3D C7 45 E6 0D 23 43 | 0.......N..|....>.C{..M.#....M.%.=.E..#C], chk=0x38<br />
< [2.295129250000000] 0x0004, flags=00, payload=[ | ], chk=0xF9, unk=0x01<br />
> [2.295129250000000] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.305641750000000] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x01<br />
> [2.305641750000000] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.310132916666667] 0x0024, flags=00, payload=[30 03 00 0F 00 00 00 00 5B 3E 5C 5F 11 F9 E4 6A 85 0D 1E 06 9E F9 33 25 9B 95 55 21 39 48 FC 55 C7 BF A7 E4 32 AD FC 65 | 0.......[>\_...j......3%..U!9H.U....2..e], chk=0x55, unk=0x00<br />
> [2.310132916666667] 0x00D0, payload=[30 02 00 0F 01 00 00 00 4E D7 C0 7C D5 E8 BB D7 3E 9E 43 7B B2 E3 4D 81 23 C8 C4 BF B8 4D 9B 25 0A 3D C7 45 E6 0D 23 43 | 0.......N..|....>.C{..M.#....M.%.=.E..#C], chk=0x38<br />
< [2.318358166666667] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x03<br />
> [2.318358166666667] 0x00D0, payload=[30 04 00 0F 00 00 00 00 52 8D 6D BC 90 C9 00 EE FA CA 47 63 10 D1 4A E5 5A FD BB 91 3A 6C DA EF 64 CA 71 01 4A A9 D5 31 | 0.......R.m.......Gc..J.Z...:l..d.q.J..1], chk=0x4B<br />
< [2.322464250000000] 0x0004, flags=00, payload=[ | ], chk=0xF9, unk=0x03<br />
> [2.322464250000000] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.332976833333333] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x03<br />
> [2.332976833333333] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.337468000000000] 0x0024, flags=00, payload=[30 05 00 0F 00 00 00 00 52 8D 6D BC 90 C9 00 EE FA CA 47 63 10 D1 4A E5 5A FD BB 91 3A 6C DA EF 64 CA 71 01 4A A9 D5 31 | 0.......R.m.......Gc..J.Z...:l..d.q.J..1], chk=0xF5, unk=0x00<br />
> [2.337468000000000] 0x00D0, payload=[30 04 00 0F 00 00 00 00 52 8D 6D BC 90 C9 00 EE FA CA 47 63 10 D1 4A E5 5A FD BB 91 3A 6C DA EF 64 CA 71 01 4A A9 D5 31 | 0.......R.m.......Gc..J.Z...:l..d.q.J..1], chk=0x4B<br />
< [2.345696333333333] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x05<br />
</pre><br />
<br />
Then another set of shared sequence. Some differences in the warmboot responses though. On line 18, <pre>FF BF FF 74</pre> becomes <pre>FF FF FF 74</pre>. On line 12, the <pre>00 00 00 00</pre> becomes the physical address of the resume context buffer. Example:<br />
<pre>F0 1E 1F 41</pre><br />
<br />
<pre><br />
> [2.345696333333333] 0x00D2, payload=[20 7A 3E 7B 31 DE FC 3A 11 5F 64 E7 AB A4 EC 17 | .z>{1..:._d.....], chk=0x77<br />
< [2.349790333333333] 0x0004, flags=00, payload=[ | ], chk=0xF9, unk=0x05<br />
> [2.349790333333333] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.360448916666666] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x05<br />
> [2.360448916666666] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.364930250000000] 0x0024, flags=00, payload=[9D 0B BC 4D BA 66 40 2C 63 BE F3 79 D0 31 26 1E 47 3A 64 DE 68 2F AE E2 8A B6 F0 27 37 46 89 16 0E 71 04 FA BF C9 4A A1 DF 4B EF D3 3D 0D 39 CD | ...M.f@,c..y.1&.G:d.h/.....'7F...q....J..K..=.9.], chk=0x11, unk=0x00<br />
> [2.364930250000000] 0x00D2, payload=[20 7A 3E 7B 31 DE FC 3A 11 5F 64 E7 AB A4 EC 17 | .z>{1..:._d.....], chk=0x77<br />
< [2.373236666666667] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x0B<br />
> [2.373236666666667] 0x0090, payload=[0C 00 04 | ...], chk=0x5B<br />
< [2.377318583333333] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x0B<br />
> [2.377318583333333] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.381794416666667] 0x0024, flags=00, payload=[00 00 00 00 | ....], chk=0xD5, unk=0x66<br />
> [2.381794416666667] 0x0090, payload=[0C 00 04 | ...], chk=0x5B<br />
< [2.385879750000000] 0x0004, flags=00, payload=[40 00 | @.], chk=0xB7, unk=0x00<br />
> [2.385879750000000] 0x0800, payload=[ | ], chk=0xF6<br />
< [2.386382583333333] 0x0004, flags=00, payload=[FF BF FF 74 | ...t], chk=0xC4, unk=0x66<br />
> [2.386382583333333] 0x0100, payload=[ | ], chk=0xFD<br />
< [2.386871833333333] 0x0004, flags=00, payload=[10 00 00 00 | ....], chk=0xE5, unk=0x66<br />
> [2.386871833333333] 0x0003, payload=[ | ], chk=0xFB<br />
< [2.387380083333333] 0x0000, flags=3F, payload=[ | ], chk=0xBE, unk=0x00<br />
> [2.387380083333333] 0x0006, payload=[ | ], chk=0xF8<br />
< [2.481997666666667] 0x0000, flags=80, payload=[ | ], chk=0x7D, unk=0x00<br />
> [2.481986333333333] 0x00D2, payload=[30 14 F4 B8 84 89 81 AB 3D 07 66 DE AE B6 D3 24 | 0.......=.f....$], chk=0x10<br />
< [2.514678500000000] 0x0020, flags=00, payload=[ | ], chk=0xDD, unk=0x00<br />
> [2.514678500000000] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.519163916666667] 0x0020, flags=00, payload=[1A 1F BC 74 AA 16 59 D6 5C E7 FF 5B E0 85 B2 C8 39 2D D6 95 98 2F B7 4B 71 64 34 D7 8D 2C 94 A1 91 CB 73 D7 8D E1 D0 07 E6 1E 0F DA E7 51 BC 69 | ...t..Y.\..[....9-.../.Kqd4..,....s..........Q.i], chk=0x3C, unk=0x00<br />
> [2.519163916666667] 0x00D2, payload=[30 14 F4 B8 84 89 81 AB 3D 07 66 DE AE B6 D3 24 | 0.......=.f....$], chk=0x10<br />
< [2.527551416666667] 0x0000, flags=80, payload=[ | ], chk=0x7D, unk=0x1F<br />
> [2.527540083333333] 0x088E, payload=[02 29 | .)], chk=0x3B<br />
< [2.531619416666667] 0x0000, flags=00, payload=[ | ], chk=0xFD, unk=0x1F<br />
> [2.531619416666667] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.542392416666666] 0x0020, flags=00, payload=[ | ], chk=0xDD, unk=0x1F<br />
> [2.542392416666666] 0x0000, payload=[ | ], chk=0xFE<br />
< [2.546867583333333] 0x0020, flags=00, payload=[ | ], chk=0xDD, unk=0x1F<br />
> [2.546867583333333] 0x088E, payload=[02 29 | .)], chk=0x3B<br />
</pre><br />
<br />
Then, the two boot paths diverge completely (also note the time jump). It is suspected that at this point the kernel is started up on coldboot, and the kernel resumes for warmboot. For cold boot only, we see the beginning init sequence again, which is likely done in [[SceSyscon]].<br />
<br />
<pre><br />
< [3.322105750000000] 0x0000, flags=00, payload=[0D 06 00 01 | ....], chk=0xE5, unk=0x16<br />
> [3.322105750000000] 0x0001, payload=[ | ], chk=0xFD<br />
< [3.326563916666667] 0x0000, flags=00, payload=[32 30 31 32 31 31 30 38 31 37 30 34 | 201211081704], chk=0x96, unk=0x85<br />
> [3.326552583333333] 0x0002, payload=[ | ], chk=0xFC<br />
< [3.331090666666667] 0x0000, flags=80, payload=[ | ], chk=0x7D, unk=0x30<br />
> [3.331079333333333] 0x0080, payload=[12 00 | ..], chk=0x6A<br />
< [3.331576333333333] 0x0020, flags=00, payload=[ | ], chk=0xDD, unk=0x30<br />
> [3.331576333333333] 0x0080, payload=[12 00 | ..], chk=0x6A<br />
< [3.332068833333333] 0x0000, flags=00, payload=[10 00 00 00 | ....], chk=0xE9, unk=0x31<br />
> [3.332068833333333] 0x0004, payload=[ | ], chk=0xFA<br />
< [3.332541666666667] 0x0000, flags=00, payload=[00 FF 04 00 | ....], chk=0xF6, unk=0x31<br />
> [3.332541666666667] 0x0103, payload=[ | ], chk=0xFA<br />
< [3.336980333333333] 0x0000, flags=00, payload=[10 00 00 00 | ....], chk=0xE9, unk=0x31<br />
> [3.336980333333333] 0x0003, payload=[ | ], chk=0xFB<br />
...<br />
</pre><br />
<br />
= Packet checksum =<br />
The checksum byte of the packet is calculated as the binary negation of the sum of all the bytes of the packet (including the 2 bytes of the command id and the byte for the length).<br />
The checksum calculation can be implemented as follows:<br />
<source lang="c"><br />
void syscon_calc_checksum(unsigned char packet[32], int length)<br />
{<br />
int i;<br />
unsigned char hash = 0;<br />
<br />
for (i = 0; i < 3 + length; i++)<br />
hash += packet[i];<br />
<br />
packet[3 + length] = ~hash;<br />
}<br />
</source><br />
<br />
= Commands =<br />
<br />
Commands are listed in the order seen in cold boot. The numbers in the captured packets indicate the assumed order with some unused packets filtered out (they appear to be resent). The ordering and grouping are assumed and may contain errors.<br />
<br />
== CMD 0x0001 - GetBaryonVersion ==<br />
<br />
Gets version of the current installed Ernie firmware. Can also be seen in the packet header in [[Syscon Update]]. Also sent at kernel boot.<br />
<br />
<pre><br />
SEND 1 > [2.881037083333333] 0x0001, payload=[ | ], chk=0xFD<br />
RESP 1 < [2.881037083333333] 0x0004, flags=00, payload=[0D 06 00 01 | ....], chk=0xE1, unk=0x71<br />
</pre><br />
<pre><br />
SEND 23 > [4.167151583333333] 0x0001, payload=[ | ], chk=0xFD<br />
RESP 23 < [4.167151583333333] 0x0000, flags=00, payload=[0D 06 00 01 | ....], chk=0xE5, unk=0x32<br />
</pre><br />
<br />
== CMD 0x0005 - GetHardwareInfo ==<br />
<br />
See [[KBL Param#Hardware_Info]].<br />
<br />
<pre><br />
SEND 2 > [2.881578833333333] 0x0005, payload=[ | ], chk=0xF9<br />
RESP 2 < [2.881578833333333] 0x0004, flags=00, payload=[00 60 40 00 | .`@.], chk=0x55, unk=0x71<br />
</pre><br />
<br />
== CMD 0x0002 - GetBaryonTimestamp ==<br />
<br />
Gets syscon firmware timestamp. Also sent at kernel boot.<br />
<br />
<pre><br />
SEND 3 > [2.882249083333333] 0x0002, payload=[ | ], chk=0xFC<br />
RESP 3 < [2.882249083333333] 0x0004, flags=00, payload=[32 30 31 32 31 31 30 38 31 37 30 34 | 201211081704], chk=0x92, unk=0x00<br />
</pre><br />
<pre><br />
SEND 24 > [4.171598000000000] 0x0002, payload=[ | ], chk=0xFC<br />
RESP 24 < [4.171598000000000] 0x0000, flags=00, payload=[32 30 31 32 31 31 30 38 31 37 30 34 | 201211081704], chk=0x96, unk=0xF7<br />
</pre><br />
<br />
== CMD 0x0080 ==<br />
<br />
Unknown. Sends data 0x0012 on FW 3.60. Does not get return data. Also sent at kernel boot.<br />
<br />
<pre><br />
SEND 4 > [2.895635416666666] 0x0080, payload=[12 00 | ..], chk=0x6A<br />
RESP 4 < [2.886923416666667] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x30<br />
RESP 4 < [2.891092083333333] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x30<br />
RESP 4 < [2.895635416666666] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x30<br />
</pre><br />
<pre><br />
SEND 25 > [4.176620750000000] 0x0080, payload=[12 00 | ..], chk=0x6A<br />
RESP 25 < [4.176123750000000] 0x0000, flags=80, payload=[ | ], chk=0x7D, unk=0x30<br />
RESP 25 < [4.176620750000000] 0x0020, flags=00, payload=[ | ], chk=0xDD, unk=0x30<br />
</pre><br />
<br />
== CMD 0x0010 - GetWakeupFactor ==<br />
<br />
See [[KBL Param#Wakeup factor|Wakeup factor]].<br />
<br />
Boot type indicator. 0xFF14 on cold boot. 0xFF80 on resume boot.<br />
<pre><br />
SEND 5 > [2.950546416666667] 0x0010, payload=[ | ], chk=0xEE<br />
RESP 5 < [2.950546416666667] 0x0004, flags=00, payload=[14 FF | ..], chk=0xE4, unk=0x32<br />
</pre><br />
<br />
== CMD 0x00A0 ==<br />
<br />
Runs twice. Appears to contain a 8 byte inner header. First packet sends all zeros and gets back a 8 byte random response. This is likely a nonce or challenge. This likely establishes an encrypted session. Encrypted data differs on each boot. There does not appear to be data transferred using the established session.<br />
<br />
<pre><br />
SEND 6 > [2.994470666666667] 0x00A0, payload=[30 00 00 0B 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | 0.......................................], chk=0xFB<br />
RESP 6 < [2.972471333333333] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0xFF<br />
RESP 6 < [2.989889500000000] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0xFF<br />
RESP 6 < [2.994470666666667] 0x0024, flags=00, payload=[30 01 00 0B 00 00 00 00 CA 71 11 BA 86 87 EF 0D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | 0........q..............................], chk=0x66, unk=0x00<br />
<br />
SEND 7 > [3.033187750000000] 0x00A0, payload=[30 02 00 0B 01 00 00 00 92 45 B4 A5 49 15 CE F2 39 0E 9E 4C BF FA 19 E6 5D CF BA 5A 6E C3 7C ED 2A 6D 4E 79 84 28 1C 2A | 0........E..I...9..L....]..Zn.|.*mNy.(.*], chk=0x97<br />
RESP 7 < [3.002893083333333] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x01<br />
RESP 7 < [3.028592333333334] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x01<br />
RESP 7 < [3.033187750000000] 0x0024, flags=00, payload=[30 03 00 0B 00 00 00 00 12 77 A5 98 67 F7 38 9B B4 54 48 FE 84 82 CF 84 41 42 87 A2 EA D1 CF 9C 5B D1 2A 3F 1E 50 B9 3D | 0........w..g.8..TH.....AB......[.*?.P.=], chk=0x0A, unk=0x00<br />
</pre><br />
<br />
== CMD 0x088E - CtrlVoltage ==<br />
<br />
Controls voltage. Sends value 0x2201 on FW 3.60 and does not get any response.<br />
<br />
<pre><br />
SEND 8 > [3.061354583333333] 0x088E, payload=[01 22 | ."], chk=0x43<br />
RESP 8 < [3.041713500000000] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x03<br />
RESP 8 < [3.046148250000000] 0x0004, flags=00, payload=[ | ], chk=0xF9, unk=0x03<br />
RESP 8 < [3.056796250000000] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x03<br />
RESP 8 < [3.061354583333333] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x03<br />
</pre><br />
<br />
== CMD 0x1082 - NVS Read ==<br />
<br />
Get data from [[#NVS|NVS]]. 2-byte offset followed by 1 byte length. For example used to fetch boot-time flags, like Update Mode.<br />
<br />
<pre><br />
Get Qaf Token area:<br />
SEND 9 > [3.078212500000000] 0x1082, payload=[80 04 08 | ...], chk=0xDD<br />
RESP 9 < [3.069790250000000] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x03<br />
RESP 9 < [3.073736583333333] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x03<br />
RESP 9 < [3.078212500000000] 0x0024, flags=00, payload=[FF FF FF FF 01 FF FF FF | ........], chk=0xD7, unk=0x77<br />
<br />
Get Update Mode:<br />
SEND 10 > [3.094879833333333] 0x1082, payload=[A0 04 01 | ...], chk=0xC4<br />
RESP 10 < [3.086322916666667] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0xFF<br />
RESP 10 < [3.090404000000000] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0xFF<br />
RESP 10 < [3.094879833333333] 0x0024, flags=00, payload=[FF | .], chk=0xD9, unk=0x00<br />
</pre><br />
<br />
== CMD 0x1100 - GetErnieDLVersion ==<br />
<br />
Gets Ernie DownLoader Version i.e. version of Ernie firmware.<br />
<br />
<pre><br />
SEND 11 > [3.099025500000000] 0x1100, payload=[ | ], chk=0xED<br />
RESP 11 < [3.099025500000000] 0x0004, flags=00, payload=[01 01 13 00 | ....], chk=0xE0, unk=0xFF<br />
</pre><br />
<br />
== CMD 0x00D0 ==<br />
Some encrypted transfer that looks close to [[Syscon#CMD 0x00A0]] in format. Different on each boot.<br />
<pre><br />
SEND 12 > [3.122679833333333] 0x00D0, payload=[30 00 00 0F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | 0.......................................], chk=0xC7<br />
RESP 12 < [3.103569583333333] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x01<br />
RESP 12 < [3.107676166666667] 0x0004, flags=00, payload=[ | ], chk=0xF9, unk=0x01<br />
RESP 12 < [3.118188666666667] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x01<br />
RESP 12 < [3.122679833333333] 0x0024, flags=00, payload=[30 01 00 0F 00 00 00 00 9F CC 4A 69 73 E9 C0 5A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | 0.........Jis..Z........................], chk=0xDD, unk=0x00<br />
<br />
SEND 13 > [3.150031916666667] 0x00D0, payload=[30 02 00 0F 01 00 00 00 98 6D 3A 1E C5 B1 E9 AF 54 65 55 91 3B DF 2B A8 0F AD B0 73 A0 A2 0F EE 5D 0A AF 41 A5 6D 32 20 | 0........m:.....TeU.;.+....s....]..A.m2.], chk=0xF4<br />
RESP 13 < [3.130872500000000] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x01<br />
RESP 13 < [3.134978166666667] 0x0004, flags=00, payload=[ | ], chk=0xF9, unk=0x01<br />
RESP 13 < [3.145539833333333] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x01<br />
RESP 13 < [3.150031916666667] 0x0024, flags=00, payload=[30 03 00 0F 00 00 00 00 F5 19 C0 67 09 80 C6 DB 58 8D FB E1 86 22 D1 00 DA BB D2 AF AA 51 F9 57 7C 56 92 0A 94 D6 60 4D | 0..........g....X....".......Q.W|V....`M], chk=0xF0, unk=0x00<br />
<br />
SEND 14 > [3.177452416666667] 0x00D0, payload=[30 04 00 0F 00 00 00 00 87 4E 59 41 22 98 F8 62 BD B4 C8 4F 4C 0A 81 90 47 1E 1E 70 D6 51 57 42 E5 EC 07 A2 D4 CF E5 02 | 0........NYA"..b...OL...G..p.QWB........], chk=0x9A<br />
RESP 14 < [3.158257166666667] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x03<br />
RESP 14 < [3.162363250000000] 0x0004, flags=00, payload=[ | ], chk=0xF9, unk=0x03<br />
RESP 14 < [3.172875666666667] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x03<br />
RESP 14 < [3.177452416666667] 0x0024, flags=00, payload=[30 05 00 0F 00 00 00 00 87 4E 59 41 22 98 F8 62 BD B4 C8 4F 4C 0A 81 90 47 1E 1E 70 D6 51 57 42 E5 EC 07 A2 D4 CF E5 02 | 0........NYA"..b...OL...G..p.QWB........], chk=0x44, unk=0x00<br />
</pre><br />
<br />
== CMD 0x00D2 - SNVS RW ==<br />
This command is used twice during boot and also quite often after boot. Data is different on each boot. Encrypted session using key from handshake above. Second transaction seems to be the firmware version data written during the update process. Likely firmware version check is done here.<br />
<pre><br />
SEND 15 > [3.204733083333333] 0x00D2, payload=[32 78 88 CF 3E 63 56 19 75 3A 0A 2D F3 49 63 E2 | 2x..>cV.u:.-.Ic.], chk=0xA4<br />
RESP 15 < [3.185595250000000] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x05<br />
RESP 15 < [3.189740333333333] 0x0004, flags=00, payload=[ | ], chk=0xF9, unk=0x05<br />
RESP 15 < [3.200251666666666] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x05<br />
RESP 15 < [3.204733083333333] 0x0024, flags=00, payload=[D3 57 9B F2 A2 45 E2 7A 2A FC 84 12 97 8E 23 5F C8 AB FB 58 97 EC DE 20 94 0A 78 28 C6 EE C5 45 18 29 00 F4 56 22 53 AF 24 47 8E FF B1 5C DA 2F | .W...E.z*.....#_...X......x(...E.)..V"S.$G...\./], chk=0x4C, unk=0xFF<br />
</pre><br />
<pre><br />
SEND 21 > [3.359112250000000] 0x00D2, payload=[1C 0B 9E FF FB 68 90 4B FD C2 05 CD D8 67 4D D0 | .....h.K.....gM.], chk=0x2D<br />
RESP 21 < [3.321934500000000] 0x0000, flags=80, payload=[ | ], chk=0x7D, unk=0x00<br />
RESP 21 < [3.354626666666667] 0x0020, flags=00, payload=[ | ], chk=0xDD, unk=0x00<br />
RESP 21 < [3.359112250000000] 0x0020, flags=00, payload=[6C B4 26 F3 CD 32 D3 3E 6F 80 F2 0F 68 F7 E2 96 58 DB 2F BB AB A6 98 DD 26 14 DD 61 12 E4 55 BA BB 32 1D 1F 75 D5 D1 4C 7E 4A 19 42 E5 B0 C6 AB | l.&..2.>o...h...X./.....&..a..U..2..u..L~J.B....], chk=0x84, unk=0xFF<br />
</pre><br />
<br />
== CMD 0x0090 - Scratch Pad Read ==<br />
<br />
This command reads data from Ernie Scratch Pad. This is the inverse of command 0x91.<br />
<br />
This is used for example to fetch the saved resume context buffer physical address. Kernel sets this before suspending and this value is passed to the resume function. See [[Suspend]]. The format is 2 byte offset and 1 byte length.<br />
<br />
<pre><br />
SEND 16 > [3.221743166666667] 0x0090, payload=[0C 00 04 | ...], chk=0x5B<br />
RESP 16 < [3.213273166666667] 0x0004, flags=80, payload=[ | ], chk=0x79, unk=0x57<br />
RESP 16 < [3.217267333333333] 0x0024, flags=00, payload=[ | ], chk=0xD9, unk=0x57<br />
RESP 16 < [3.221743166666667] 0x0024, flags=00, payload=[F0 0E 1F 41 | ...A], chk=0x77, unk=0x45<br />
</pre><br />
<br />
== CMD 0x0091 - Scratch Pad Write ==<br />
<br />
This command writes data to Ernie Scratch Pad. This is the inverse of command 0x90.<br />
<br />
== CMD 0x0800 - Get USB Info ==<br />
<br />
See [[KBL Param]].<br />
<br />
<pre><br />
SEND 17 > [3.225828583333334] 0x0800, payload=[ | ], chk=0xF6<br />
RESP 17 < [3.225828583333334] 0x0004, flags=00, payload=[40 00 | @.], chk=0xB7, unk=0x41<br />
</pre><br />
<br />
== CMD 0x0100 - GetControlsInfo ==<br />
<br />
See [[KBL Param#Boot Controls Info|Boot Controls Info]].<br />
<br />
<pre><br />
SEND 18 > [3.226331500000000] 0x0100, payload=[ | ], chk=0xFD<br />
RESP 18 < [3.226331500000000] 0x0004, flags=00, payload=[FF BF FF 74 | ...t], chk=0xC4, unk=0x45<br />
</pre><br />
<br />
== CMD 0x0003 - GetSleepFactor ==<br />
<br />
See [[KBL Param#Sleep Factor|Sleep Factor]].<br />
<br />
<pre><br />
SEND 19 > [3.226820750000000] 0x0003, payload=[ | ], chk=0xFB<br />
RESP 19 < [3.226820750000000] 0x0004, flags=00, payload=[10 00 00 00 | ....], chk=0xE5, unk=0x45<br />
</pre><br />
<br />
== CMD 0x0006 - Get Hardware flags ==<br />
<br />
See [[KBL Param#Hardware flags|Hardware flags]].<br />
<br />
<pre><br />
SEND 20 > [3.227328833333333] 0x0006, payload=[ | ], chk=0xF8<br />
RESP 20 < [3.227328833333333] 0x0000, flags=3F, payload=[ | ], chk=0xBE, unk=0x00<br />
</pre><br />
<br />
== CMD 0x088E ==<br />
Unknown. Appears to be the last command sent before a time-jump (likely indicating completion of early-boot). Might be some status indicator to tell Syscon that we're done.<br />
<pre><br />
SEND 22 > [3.386554833333333] 0x088E, payload=[02 29 | .)], chk=0x3B<br />
RESP 22 < [3.367488416666667] 0x0000, flags=80, payload=[ | ], chk=0x7D, unk=0xB4<br />
RESP 22 < [3.371567833333333] 0x0000, flags=00, payload=[ | ], chk=0xFD, unk=0xB4<br />
RESP 22 < [3.382079833333334] 0x0020, flags=00, payload=[ | ], chk=0xDD, unk=0xB4<br />
RESP 22 < [3.386554833333333] 0x0020, flags=00, payload=[ | ], chk=0xDD, unk=0xB4<br />
</pre><br />
<br />
== CMD 0x0004 ==<br />
Unknown. Likely happens after initial boot.<br />
<pre><br />
SEND 26 > [4.177113250000000] 0x0004, payload=[ | ], chk=0xFA<br />
RESP 26 < [4.177113250000000] 0x0000, flags=00, payload=[10 00 00 00 | ....], chk=0xE9, unk=0x31<br />
</pre><br />
<br />
== CMD 0x0103 - Get Multi Connector Info ==<br />
<br />
Likely happens after initial boot.<br />
<br />
<pre><br />
SEND 27 > [4.177586083333333] 0x0103, payload=[ | ], chk=0xFA<br />
RESP 27 < [4.177586083333333] 0x0000, flags=00, payload=[00 FF 04 00 | ....], chk=0xF6, unk=0x31<br />
</pre><br />
<br />
= Syscon Scratch Pad =<br />
<br />
{| class="wikitable"<br />
|-<br />
! Offset !! Size !! Name !! Comment !! Used by<br />
|-<br />
| 0x0 || 8 || unknown || ||<br />
|-<br />
| 0x8 || 4 || Syscon power on time || ex on DevKit: 0xA, 0x16, 0x1F, 0x24. ex on retail: 0x01BC0CD0, 0x05AC1AF7, 0x80000269 || [[SceRtc#sceRtcSetCurrentTickForDriver]]<br />
|-<br />
| 0xC || 4 || Resume context physical address || Set on retail. Not set on DevKit. ex: 0x411F1EF0 || second_loader<br />
|-<br />
| 0x10 || 5 || Current Tick || Set on retail and DevKit. Stored in microseconds since 01/01/0001 divided by 2^19. || [[SceRtc#sceRtcSetCurrentTickForDriver]]<br />
|-<br />
| 0x15 || 3 || Padding of Current Tick || ||<br />
|-<br />
| 0x18 || 5 || Current Secure Tick || Set on retail. Not set on DevKit. || [[SceRtc#sceRtcSetCurrentSecureTickForDriver]]<br />
|-<br />
| 0x1D || 5 || Current Network Tick || Always a bit earlier than Current Tick and Current Secure Tick. || [[SceRtc#sceRtcSetCurrentNetworkTickForDriver]]<br />
|-<br />
| 0x22 || 5 || Current ?Debug Secure?/?Tool Secure? Tick || Set on DevKit. Not set on retail. || [[SceRtc#sceRtcGetCurrentToolSecureTickForDriver]]<br />
|-<br />
| 0x27 || 5 || Current Aux Tick || || [[SceRtc#sceRtcSetCurrentAuxTickForDriver]]<br />
|-<br />
| 0x2C || 5 || Current Debug Network Tick || || [[SceRtc#sceRtcSetCurrentDebugNetworkTickForDriver]]<br />
|-<br />
| 0x31 || 0x8F || unknown || Maybe reserved. Probably unused. ||<br />
|-<br />
| 0xE0 || 0x20 || [[KBL Param|CP DIP Switches]] || Set on DevKit having a CP. Hence not set on Retail nor TestKit. || ?secure_kernel? before system suspend, second_loader after system resume<br />
|}<br />
<br />
== Types ==<br />
<br />
<source lang="C"><br />
typedef struct SceSysconRtcTick { // size is 5 bytes<br />
uint8_t tick[5];<br />
} SceSysconRtcTick;<br />
<br />
typedef struct SceSysconScratchPad { // size is 0x100 bytes<br />
uint8_t unk_0[8];<br />
SceUInt32 powerOnTime;<br />
void *resumeContextPA;<br />
SceRtcSysconTick currentTick;<br />
uint8_t padding[3];<br />
SceSysconRtcTick currentSecureTick;<br />
SceSysconRtcTick currentNetworkTick;<br />
SceSysconRtcTick unk_0x22;<br />
SceSysconRtcTick currentAuxTick;<br />
SceSysconRtcTick currentDebugNetworkTick;<br />
uint8_t reserved[0x8F];<br />
SceDIPSW dipsw;<br />
} SceSysconScratchPad;<br />
</source><br />
<br />
= NVS =<br />
<br />
Ernie Non-volatile storage (NVS) is a persistent storage allocated on Ernie Data Flash that is used by PS Vita OS for data required at boot time. Indeed, reading NVS requires no driver except the driver to communicate with Syscon, whilst reading PS Vita eMMC requires its AES-XTS decryption.<br />
<br />
Not every NVS sector is directly readable from Kermit: the first sectors are part of [[Ernie Secure#SNVS|SNVS]] (Secure NVS) which means that they are XTS-encrypted and must be accessed through a Secure handshake.<br />
<br />
NVS actual size is 0xBA0 bytes on new Syscon hardware revisions and 0xC20 on old. However, only 0xB60 bytes are accessible from Kermit on System Software 3.600.011 and more recent. The hidden area is probably used internally by Syscon as it is not blanked nor 0xFFed.<br />
<br />
On FW 3.60, NVS size accessible from Kermit is 0xB60 bytes:<br />
* Area from 0 to 0x3FF is named [[Ernie Secure#SNVS]]. It has an additional level of encryption. It cannot be read using [[SceSblSsMgr#sceSblNvsReadForKernel]] nor written using [[SceSblSsMgr#sceSblNvsWriteForKernel]]. This area is handled by [[Secure Modules]].<br />
* Area from 0x400 to 0x75F is handled by Non-secure Kernel [[SceSblSsMgr]] module.<br />
* Area from 0x760 to 0xB5F is reserved for Test and Tool consoles. However this area seems unused.<br />
* Area from 0xB60 to the end of NVS is not accessible from Kermit.<br />
<br />
{| class="wikitable"<br />
|-<br />
! Offset !! Size !! Name !! Comment !! Used by<br />
|-<br />
| 0 || 0x400 || SNVS || See [[Ernie Secure#SNVS]]. ||<br />
|-<br />
| 0x400 || 0x80 || Qaf Token || || second_loader<br />
|-<br />
| 0x480 || 0x1 || Qaf Token Flag || 1 when Qaf Token is not set (FFed), 0 when Qaf Token is set || second_loader<br />
|-<br />
| 0x481 || 0x1 || Extra UART Flag || See [[KBL Param#Boot flags]]. || second_loader<br />
|-<br />
| 0x482 || 0x1 || Unknown || || [[SceSblSsMgr#sceSblSsGetNvsDataForDriver]], [[SceSblSsMgr#sceSblSsSetNvsDataForDriver]]<br />
|-<br />
| 0x483 || 0x1 || Safe Mode Flag || See [[KBL Param#Boot flags]]. || [[SceSblSsMgr#sceSblSsGetNvsDataForDriver]], [[SceSblSsMgr#sceSblSsSetNvsDataForDriver]], second_loader<br />
|-<br />
| 0x484 || 0x1 || <code>KervResult</code>/<code>KervDiagResultFlag</code> || || Factory test <code>preCheckFactTest</code><br />
|-<br />
| 0x485 || 0x1 || Unknown || ||<br />
|-<br />
| 0x486 || 0x1 || Internal Storage Flag || See [[KBL Param#Boot flags]]. Not present on FWs 0.931-0.990. Present on FW 3.60. || [[SceSblSsMgr#sceSblSsGetNvsDataForDriver]], [[SceSblSsMgr#sceSblSsSetNvsDataForDriver]], second_loader<br />
|-<br />
| 0x487 || 0x1 || Unknown || See [[KBL Param#Boot flags]]. || second_loader<br />
|-<br />
| 0x4A0 || 0x1 || Update Mode || See [[KBL Param#Boot flags]]. || [[SceSblUpdateMgr#sceSblUsGetUpdateModeForUser]], [[SceSblUpdateMgr#sceSblUsSetUpdateModeForUser]]<br />
|-<br />
| 0x4A1 || 0x3 || Unknown. Unused. || ||<br />
|-<br />
| 0x4A4 || 0x4 || System Language || || [[SceRegistryMgr]], [[SceSblSsMgr#sceSblSsGetNvsDataForDriver]], [[SceSblSsMgr#sceSblSsSetNvsDataForDriver]]<br />
|-<br />
| 0x4A8 || 0x1C || Unknown. Unused. || ||<br />
|-<br />
| 0x4C4 || 0x1 || Unknown. Set to 0 by default. || || <br />
|-<br />
| 0x4C5 || 0x1B || Unknown. Unused. || ||<br />
|-<br />
| 0x4E0 || 0x20 || KibanID || || [[SceSblSsMgr#sceSblSsGetNvsDataForDriver]], [[SceSblSsMgr#sceSblSsSetNvsDataForDriver]]<br />
|-<br />
| 0x500 || 0x1 || Wlan/Bt Flag || || [[SceSblSsMgr#sceSblSsGetNvsDataForDriver]], [[SceSblSsMgr#sceSblSsSetNvsDataForDriver]], [[SceWlanBt]] module_start<br />
|-<br />
| 0x501 || 0x1F || Unknown. Unused. || ||<br />
|-<br />
| 0x520 || 0x80 || Activation Area || first 0x20 bytes are SceNVSKitActivationData || [[SceSblSsMgr]], [[SceSblPostSsMgr]]<br />
|-<br />
| 0x5A0 || 0x100 || Qaf Token RSA signature || Not present on FW 0.990. Present on FW 3.60. Maybe added on FW 1.80. || second_loader<br />
|-<br />
| 0x6A0 || 0xC0 || Unknown. Unused. || ||<br />
|-<br />
| 0x760 || 0x400 || Reserved for Test and Tool. || Seems unused. ||<br />
|}<br />
<br />
== Types ==<br />
<br />
<source lang="C"><br />
typedef struct SceNVSKitActivationData { // size is 0x20 bytes<br />
char magic[4]; // "act\n"<br />
uint32_t issue_no;<br />
uint32_t end_date;<br />
uint32_t start_date;<br />
char cmac_hash[0x10];<br />
} SceNVSKitActivationData;<br />
</source><br />
<br />
= Config Storage =<br />
<br />
Config Storage is a similar storage than [[#NVS|NVS]] but is accessed in a different manner. Whilst [[#NVS|NVS]] is read and written by 32-byte sectors and is physically stored with a sort of history, Config Storage is written by sending scripts from [[Kermit]] to Syscon, and is not really readable but instead affects [[KBL Param#Hardware Info]].<br />
<br />
== Sample scripts ==<br />
<br />
Below are sample configstorage scripts hardcoded in [[SceSyscon]]:<br />
<source lang="C"><br />
const char syscon_idu_set_config[0x20] = {<br />
0x1F, 0x54, 0x35, 0x63, 0x38, 0x62, 0x31, 0x64,<br />
0x61, 0x63, 0x62, 0x38, 0x33, 0x36, 0x64, 0x64,<br />
0x36, 0x63, 0x39, 0x39, 0x36, 0x38, 0x65, 0x34,<br />
0x63, 0x30, 0x35, 0x30, 0x61, 0x36, 0x66, 0x35<br />
};<br />
<br />
const char syscon_idu_set_config2[0x20] = {<br />
0x07, 0x57, 0xA8, 0x01, 0x01, 0x00, 0x0D, 0x00,<br />
0x01, 0x4E, 0x15, 0x48, 0x51, 0xBD, 0x52, 0x2C,<br />
0x4C, 0x83, 0x70, 0xDA, 0x4D, 0xF3, 0x8E, 0x82,<br />
0x6B, 0xD6, 0x34, 0x98, 0x3A, 0xFD, 0xA6, 0x94<br />
};<br />
<br />
const char syscon_show_set_config[0x20] = {<br />
0x1F, 0x54, 0x66, 0x63, 0x33, 0x39, 0x38, 0x39,<br />
0x30, 0x61, 0x33, 0x32, 0x64, 0x30, 0x66, 0x32,<br />
0x37, 0x36, 0x31, 0x35, 0x62, 0x65, 0x36, 0x65,<br />
0x63, 0x64, 0x63, 0x35, 0x65, 0x32, 0x63, 0x63<br />
};<br />
<br />
const char syscon_show_set_config2[0x20] = {<br />
0x07, 0x57, 0xA8, 0x01, 0x03, 0x00, 0x10, 0x00,<br />
0x01, 0x4E, 0x15, 0x48, 0xB8, 0x1A, 0x54, 0xD1,<br />
0xF2, 0xA0, 0xD1, 0x05, 0x18, 0xEA, 0x22, 0x09,<br />
0x0A, 0x02, 0x2E, 0xAE, 0x00, 0x08, 0x25, 0xF1<br />
};<br />
<br />
const char syscon_clear_config[0x20] = {<br />
0x1F, 0x54, 0x65, 0x34, 0x61, 0x65, 0x38, 0x62,<br />
0x37, 0x61, 0x65, 0x38, 0x36, 0x33, 0x32, 0x65,<br />
0x64, 0x64, 0x39, 0x61, 0x61, 0x65, 0x38, 0x38,<br />
0x38, 0x39, 0x66, 0x30, 0x65, 0x65, 0x61, 0x38<br />
};<br />
<br />
const char syscon_clear_config2[0x20] = {<br />
0x07, 0x57, 0xA8, 0x01, 0x00, 0x00, 0x00, 0x00,<br />
0x01, 0x4E, 0x15, 0x48, 0x88, 0xEA, 0xC7, 0xAD,<br />
0x65, 0xB1, 0x73, 0xC1, 0xCF, 0x48, 0xC7, 0x29,<br />
0x1B, 0x2B, 0x8A, 0x32, 0x89, 0xCF, 0xB3, 0xC1<br />
};<br />
</source><br />
<br />
The only actual differences between those scripts are:<br />
* the ascii string: we do not know how it is generated and what it means<br />
* the mode value:<br />
** A8 01 00 00 00 00 = mode clear<br />
** A8 01 01 00 0D 00 = idu mode set<br />
** A8 01 03 00 10 00 = show mode set<br />
<br />
== Types ==<br />
<br />
<source lang="C"><br />
// TODO<br />
</source><br />
<br />
{| class="wikitable"<br />
|-<br />
! Offset !! Size !! Name !! Sample value !! Comment<br />
|-<br />
| 0 || 1 || ascii_data_size || 0x1F ||<br />
|-<br />
| 1 || 1 || ascii_data_flag || 0x54 ||<br />
|-<br />
| 2 || 0x1E || ascii_data || || ASCII hexadecimal string so maybe a hash<br />
|-<br />
| 0x20 || 1 || unk_7_data_size || 7 ||<br />
|-<br />
| 0x21 || 1 || unk_7_data_flag || ||<br />
|-<br />
| 0x22 || 6 || unk_7_data || ||<br />
|-<br />
| 0x28 || 1 || unk_1_data_size || 1 ||<br />
|-<br />
| 0x29 || 1 || unk_1_data_flag || 0x4E ||<br />
|-<br />
| 0x2A || 1 || sha1_hash_size || 0x15 ||<br />
|-<br />
| 0x2B || 1 || sha1_hash_flag || 0x48 ||<br />
|-<br />
| 0x2C || 0x14 || sha1_hash || || sha1 hash of the previous blocks (data from 0 of size 0x2A)<br />
|}<br />
<br />
Config storage scripts have in theory a variable size. It is the concatenation of some blocks where the first byte is the length of the body, followed by the body of variable size. Body structure is always the same: 1 byte representing the flag, followed by data of variable size.<br />
<br />
== Usage ==<br />
<br />
Theory by CelesteBlue (untested):<br />
* 0) Begin Transaction<br />
<br />
* 1) Load Script (part 1)<br />
* A) configstorage data is read from SceSyscon memory<br />
* B) configstorage data is sent by SceSyscon to Ernie<br />
* C) Ernie FW checks hash of data and returns xx on success<br />
<br />
if success:<br />
* 2) Load Script (part 2)<br />
* A) configstorage data is read from SceSyscon memory<br />
* B) configstorage data is sent by SceSyscon to Ernie using Load<br />
* C) Ernie FW loads data to memory and executes it<br />
<br />
*6) Commit Transaction<br />
*7) End Transaction<br />
<br />
= Pinout =<br />
<br />
[[File:ernie-package.png|600px|Ernie BGA package.]]<br />
<br />
A candidate package for this chip is Renesas' [https://www.renesas.com/us/en/package-image/pdf/outdrawing/p121f1-50-bal.pdf P121F1-50-BAL-1]. It has the same size and number of pins.<br />
<br />
=== UART ===<br />
<br />
{| class='wikitable'<br />
! Name || Pin || Description<br />
|-<br />
| CTS0 || J7 || UART0 clear to send<br />
|-<br />
| RTS0 || C6 || UART0 request to send<br />
|-<br />
| TX0 || B6 || UART0 transmit<br />
|-<br />
| RX0 || F11 || UART0 receive<br />
|-<br />
| SW0 || A8 || Switch, see [[UART Console#OLED PSVita UART0 location]]<br />
|}<br />
<br />
=== SPI ===<br />
<br />
Main communication with [[Kermit]].<br />
<br />
{| class='wikitable'<br />
! Name || Pin || Description<br />
|-<br />
| SS || A7 || Slave Select (often active low, output from master)<br />
|-<br />
| MISO || A6 || Master In Slave Out (data output from slave)<br />
|-<br />
| MOSI || C7 || Master Out Slave In (data output from master)<br />
|-<br />
| SCLK || B7 || Serial Clock (output from master)<br />
|}<br />
<br />
=== Other ===<br />
<br />
{| class='wikitable'<br />
! Name || Pin || Description<br />
|-<br />
| ? || C11 || [[UDC]] pin 11<br />
|-<br />
| ? || F9 || [[UDC]] pin 12<br />
|-<br />
| ? || G4 || [[UDC]] pin 13<br />
|-<br />
| ? || G8 || [[SN99057]] pin 38<br />
|-<br />
| PWR_SW || G6 || Power switch through two transistor buffers<br />
|}<br />
<br />
= Versions =<br />
<br />
== Hardware Versions ==<br />
<br />
There are three hardware versions of Ernie:<br />
* NEC 78K0R/Kx3-L: present on early PS Vita prototypes (never seen)<br />
* NEC 78K0R/Kx3: present on Fat PS Vita and PS TV models, including some prototypes such as DEM-3000L<br />
* Renesas RL78/G13: present on Slim PS Vita models<br />
<br />
=== NEC 78K0R/Kx3-L ===<br />
<br />
Never seen yet but exists according to Ernie update packages.<br />
<br />
=== NEC 78K0R/Kx3 ===<br />
<br />
NEC D79F0109 (78K0R/KH3, 121 pin)<br />
<br />
Device Name : D79F0109<br />
<br />
Other Device Name : SK0RT02N200GV120 (on DEM-3000L and PCH-1000)<br />
<br />
Label:<br />
<pre><br />
Model <- always D79F0109<br />
Revision <- on DEM-3000H: ES1.0, blank on others<br />
Build <- XXYYZZWWW <- XX: year, YY: week, ZZ: 2 letters (unknown usage), WWW: serial number<br />
Manufacturing country <- always "MALAYSIA"<br />
</pre><br />
<br />
=== Renesas RL78/G13 ===<br />
<br />
Renesas R5F1ZCRK (RL78/G13, 121 pin)<br />
<br />
<pre><br />
R5F1ZCRKABG#U0<br />
R5 Renesas MCU<br />
F Flash<br />
1 RL78<br />
Z Customer specific<br />
C Product group<br />
R 121-pin<br />
K 384KB<br />
A Consumer grade<br />
BG VFBGA 0.4mm<br />
#U0 Tray*2<br />
</pre><br />
<br />
<pre><br />
Device Name : R5F1ZCRK<br />
Device Code : 10 00 06<br />
Firmware Version : V3.03<br />
Code Flash 1 (Address : 0x00000000, Size : 384 K, Erase Size : 1 K)<br />
Data Flash 1 (Address : 0x000F1000, Size : 8 K, Erase Size : 1 K)<br />
</pre><br />
<br />
Label:<br />
<pre><br />
(C) XXXX <- Year<br />
Revision <- A0xxx SCEI<br />
Build <- XXYYZZWWW <- XX: year, YY: week, ZZ: 2 letters (unknown usage), WWW: serial number<br />
Unknown data<br />
</pre><br />
<br />
== Block sizes ==<br />
<br />
Ernie flash memory is erasable in blocks. Size of one block in bytes depends on the hardware version:<br />
* NEC 78K0R/Kx3-L: 0x800<br />
* NEC 78K0R/Kx3: 0x400<br />
* Renesas RL78/G13: 0x400<br />
<br />
See also [https://playstationdev.wiki/psvitadevwiki/index.php?title=Ernie].<br />
<br />
== Software Versions ==<br />
<br />
See also [https://playstationdev.wiki/psvitadevwiki/index.php?title=System_Controller_Firmware].<br />
<br />
Ernie firmware can be partly updated and downgraded with software updates embedded in PUP.<br />
<br />
Ernie firmware is dependant of the hardware version and detects it based on [[KBL Param#Hardware_Info|Hardware Info]].<br />
<br />
=== Examples ===<br />
<br />
With DevKit connected, <code>psp2ctrl info</code> queries return the following results: <br />
<br />
DEM-3000H running FW 0.990:<br />
<source>SysConVersion: 591105</source> -> converted to hexadecimal: 0x00090501 -> 0.9.5.1<br />
<br />
PDEL-1001 running FW 1.692: <br />
<source>SCVersion: 0.9.2.4</source><br />
<br />
PDEL-1001 running FW 3.600-3.680:<br />
<source>SCVersion: 1.0.3.6</source><br />
<br />
=== Downgrade ===<br />
<br />
Syscon is downgradable on DEM/PDEL/PTEL/QAF units. It might also be downgraded on retail when using a downgrade enabler like modoru.<br />
<br />
= Firmware =<br />
<br />
See [[Ernie Firmware]]<br />
<br />
[[Category:Devices]]</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=IdStorage&diff=20847
IdStorage
2023-12-21T23:21:28Z
<p>CreepNT: /* 0x11B */ Add correct explaination</p>
<hr />
<div>See also [https://playstationdev.wiki/pspdevwiki/index.php?title=IDStorage].<br />
<br />
= Description =<br />
<br />
Region of the PSVita eMMC where perconsole info is stored.<br />
<br />
= Location =<br />
<br />
Idstorage data is stored at first raw partition (code 0x1). Use [https://github.com/TeamMolecule/sceutils/blob/master/extract_idstorage.py] to extract.<br />
<br />
= Structure =<br />
<br />
The IdStorage partition is divided in two parts: the mapping table and the leaves.<br />
<br />
== Mapping table ==<br />
<br />
The mapping table is located at the start of the partition. It's an array of 16-bit leaf IDs that serves as a leaf ID->index mapping table. The mapping table must be at least one-sector wide but may be bigger.<br />
<br />
There are two leaf IDs reserved for usage in the mapping table: all entries corresponding to the mapping table (i.e. the first <code>M</code> entries for an </code>M</code> sectors sized table) must hold the value <code>0xFFF5</code>, and all unallocated leaves hold the value <code>0xFFFF</code>.<br />
<br />
To lookup a leaf index based on its ID, use the following algorithm:<br />
<source lang="C"><br />
#define M /* implementation defined */<br />
#define SECTOR_SIZE (512)<br />
<br />
#define NUM_TABLE_ITEMS ((M * SECTOR_SIZE) / sizeof(uint16_t))<br />
uint16_t g_mappingTable[NUM_TABLE_ITEMS];<br />
<br />
int leafIndexFromId(unsigned id) {<br />
if (id >= 0xFFF0)<br />
return /* ERROR: invalid leaf ID */;<br />
<br />
for (int i = 0; i < NUM_TABLE_ITEMS; i++) {<br />
if (g_mappingTable[i] == id)<br />
return i;<br />
}<br />
return /* ERROR: leaf ID is not in mapping table */;<br />
}<br />
</source><br />
<br />
== Leaves ==<br />
<br />
Leaves are sector-sized (512 bytes) areas in the IdStorage partition used to store arbitrary data. While the data stored may be smaller, a leaf always occupies one sector in the partition.<br />
<br />
To read a leaf's data, obtain the leaf index (this can be known directly, or obtained from a leaf ID using the previously mentioned algorithm) then read 512 bytes starting at offset <code>512 * leafIndex</code> in the IdStorage partition.<br />
<br />
== Limits ==<br />
<br />
The number of leaves that can be stored in an IdStorage partition is limited by three factors: the size of the partition, the size of the mapping table and the size of leaf IDs.<br />
<br />
* An <code>M</code> sectors wide mapping table can hold up to <code>255 * M</code> leaves<br />
** This is because a single-sector mapping table can reference <code>SECTOR_SIZE/sizeof(u16) - 1 = 255</code> leaves (the <code>- 1</code> is needed because a table consumes one entry for itself)<br />
* A <code>P</code> sectors wide partition can hold up to <code>P - M</code> leaves<br />
** This is because leaves are sector-sized, and the mapping table consumes <code>M</code> sectors<br />
* There are 65520 leaf IDs available<br />
** While an unsigned 16-bit variable can hold 65536 values, IDs superior or equal to 0xFFF0 are reserved and cannot be used<br />
<br />
From this, we can conclude that an IdStorage partition of <code>P</code> sectors with an <code>M</code> sectors mapping table can hold up to <code>min(255*M, P-M, 65520)</code> leaves. We can also deduce an IdStorage partition is optimally shaped (no space is non-allocatable) when <code>P = 256 * M</code>.<br />
<br />
On Vita, the IdStorage partition is 512KiB and 32 sectors are reserved for the indexing table (<code>P = 1024, M = 32</code>, a non-optimal choice), which means the console's partition can hold '''up to 992 IdStorage leaves'''.<br />
<br />
= Leaf content =<br />
<br />
Leaves not present in this section have not been found in any unit.<br />
<br />
In the following section, "empty" means that the area has all bits set to 1 (i.e., 0xFF).<br />
"Present"/"Not present" means whether or not a leaf exists in IdStorage.<br />
<br />
When a size is indicated, this means only the first X bytes of the leaf are used, and the rest is empty.<br />
<br />
The following information may not be valid for pre-production units.<br />
<br />
== 0x000~0x007 ==<br />
<br />
SceIdStoragePspCertificates<br />
<br />
Identical across all units and duplicated in leaves 0x020 to 0x027.<br />
<br />
== 0x040~0x047 ==<br />
<br />
SceIdStoragePsp2Certificates.<br />
<br />
Console-unique.<br />
<br />
== 0x048~0x04F ==<br />
<br />
Console-unique. May be certificate(s).<br />
<br />
== 0x07E ==<br />
<br />
Console-unique.<br />
<br />
== 0x80 ==<br />
<br />
Service / Manufacturing Information (SMI)<br />
<br />
Console-unique. Contains minimal firmware version (checked in [[Second Loader|<code>second_loader</code>]]).<br />
<br />
<source lang="c"><br />
struct SMILeaf {<br />
uint8_t magic[4]; //'SMI\0'<br />
uint32_t version; //1<br />
uint32_t min_fwv; //Minimal firmware version<br />
uint8_t unused[0x80 - 0xC];<br />
//Encrypted with per-console keys.<br />
//This is used to verify the leaf has not been modified.<br />
uint8_t encrypted_data[0x200 - 0x80];<br />
};<br />
</source><br />
<br />
== 0x100 ==<br />
<br />
Console-unique. Build data strings. One string starts at offset 0, and one string starts at offset 0x100. Both strings are 0x100 characters long.<br />
<br />
In a 0.920 minfw unit, this leaf instead contains 0x0 at offset 0, 0x10 at offset 0x10, etc up to offset 0xF0, while all other bytes are zeroes.<br />
<br />
== 0x102 ==<br />
<br />
Console-unique. Per-console factory/service product information.<br />
<br />
== 0x103 ==<br />
<br />
Console-unique. Motherboard information.<br />
<br />
* 0-3: Motherboard revision in the format of [[KBL_Param#Hardware_Info|Hardware Info]].<br />
<br />
* 4-7: [[SceSyscon#sceSysconGetErnieVersionForDriver|Ernie Version]]<br />
<br />
* 8-0xB: [[SceSyscon#sceSysconGetErnieDLVersionForDriver|Ernie DL Version]]<br />
<br />
* 0xC-0xD: unknown, maybe related to [[Syscon]]<br />
<br />
* 0x100-???: battery lot serial number in ASCII<br />
<br />
== 0x104 ==<br />
<br />
Console-unique. Diagnostic results.<br />
<br />
Not present if diagnostic software has not been executed on the unit.<br />
<br />
== 0x110 ==<br />
<br />
WlanRegion (3 bytes)<br />
<br />
The following algorithm is used to derive it from PsCode:<br />
<source lang="c"><br />
byte WlanRegion[3];<br />
switch(pscode.product_code) {<br />
case 0x100:<br />
case 0x101:<br />
case 0x102:<br />
case 0x104:<br />
case 0x10B:<br />
case 0x10F:<br />
case 0x110:<br />
case 0x111:<br />
WlanRegion[2] = 0;<br />
WlanRegion[1] = 7;<br />
break;<br />
case 0x103:<br />
case 0x106:<br />
case 0x108:<br />
case 0x10A:<br />
case 0x10D:<br />
case 0x10E:<br />
WlanRegion[2] = 0;<br />
WlanRegion[1] = 0x1F;<br />
break;<br />
case 0x105:<br />
case 0x107:<br />
case 0x109:<br />
case 0x10C:<br />
WlanRegion[2] = 1;<br />
WlanRegion[1] = 0x1F;<br />
break;<br />
default:<br />
goto error;<br />
}<br />
WlanRegion[0] = 0xFF;<br />
</source><br />
<br />
== 0x111 ==<br />
<br />
WlanMacAddress (6 bytes)<br />
<br />
Console-unique. The MAC address of the Wireless LAN adapter.<br />
<br />
== 0x112 ==<br />
<br />
MtpSerial (<code>wchar_t[0x20]</code>)<br />
<br />
Console-unique. The serial number sent via the MTP protocol.<br />
<br />
== 0x113 ==<br />
<br />
Console-unique. Information related to the 3G modem.<br />
<br />
Empty on non-3G models.<br />
<br />
== 0x114 ==<br />
<br />
Physical device location<br />
<br />
Four of:<br />
<source lang="c><br />
struct DeviceLocation {<br />
uint32_t type;<br />
int32_t x;<br />
int32_t y;<br />
int32_t z;<br />
};<br />
</source><br />
<br />
Where type: 0x00 - Front camera, 0x01 - Back camera, 0x10 - Accelerometer, 0x11 - Gyro<br />
<br />
Cameras are at offsets 0x00 and 0x10, Motion at 0x20 and 0x30<br />
<br />
There's unknown int32 flag at 0x100<br />
<br />
Identical for all consoles of a generation (one kind for Fat, one kind for Slim).<br />
<br />
Empty on PSTV.<br />
<br />
== 0x115 ==<br />
<br />
ProductTypeInfo (<code>char[16]</code>)<br />
<br />
Identical for consoles of the same "type".<br />
<br />
Example values:<br />
* <code>PDEL100000010000</code> (PDEL-1000)<br />
* <code>PCH01004ZAZ20000</code> (PCH-1004 - Call of Duty: Black Ops Declassified limited edition)<br />
* <code>PCH01100AA010002</code> (Crystal Black PCH-1100 - docomo carrier)<br />
* <code>PCH02000ZA120000</code> (White PCH-2000)<br />
<br />
Decomposition: <code>FFFF NNNN ZZ Y X xxx O</code><br />
* <code>FFFF</code> and <code>NNNN</code> = Model code (e.g. PDEL-1000) decomposed in two parts<br />
** <code>FFFF</code> = family (e.g., PCH, PDEL)<br />
** <code>NNNN</code> = number (e.g., 1000, 1004, 1100)<br />
* <code>ZZ</code> = ? (known values: 00, ZA, AA)<br />
* <code>Y</code> = ? (known values: 0, 1, Z)<br />
* <code>X</code> = ? (known values: 1, 2)<br />
* <code>xxx</code> = ? (always 000)<br />
* <code>O</code> = Product target operator (carrier ID for 3G models - usually matches offset 0x88 of leaf 0x113 on SIM-locked models)<br />
<br />
== 0x116 ==<br />
<br />
ColorVariation (4 bytes)<br />
<br />
Not present on all units.<br />
<br />
Used for wave color by SceShell. ([https://github.com/Princess-of-Sleeping/psp2wpp/blob/master/src/main.c#L441-L467 Patch example])<br />
<br />
<source lang="c"><br />
struct ColorVariation {<br />
uint8_t unk0;<br />
uint16_t unk1;<br />
uint8_t unk3;<br />
/* rest of the leaf is empty */<br />
};<br />
</source><br />
<br />
Example values:<br />
* Call of Duty: Black Ops Declassified limited edition PCH-1004: <code>{ 0x01, 0x0000, 0x00 }</code><br />
* Glacier White PCH-2000 <code>{ 0x01, 0x000C, 0x00 }</code><br />
<br />
== 0x117 ==<br />
<br />
TemperatureThreashold[https://en.wikipedia.org/wiki/Sic <sup>[sic<nowiki>]</nowiki></sup>] (4 elements of 1 byte each)<br />
<br />
Not present on all units, and always all zeroes when present.<br />
<br />
== 0x118 ==<br />
<br />
AudioParam (1 byte)<br />
<br />
Not present on all units.<br />
<br />
If set to 0 (or the leaf is absent?), AVLS is never forcefully enabled.<br />
<br />
== 0x119 ==<br />
<br />
EtherMacAddress (6 bytes)<br />
<br />
Console-unique. The MAC address of the Ethernet adapter.<br />
<br />
Present on PSTV and PCH-2000 (where it is empty).<br />
<br />
== 0x11A ==<br />
<br />
WebBrowserParam (1 byte)<br />
<br />
Can be 0/1/2/0x11?<br />
<br />
Seen:<br />
0x02 on PCH200X, 0x11 on PSTV<br />
<br />
== 0x11B ==<br />
<br />
ShutterParam (1 byte)<br />
<br />
Seen: 0x01 on PCH200X, 0x00 on PSTV. When leaf is present and contains 0x01, the value returned by <code>sceAVConfigGetShutterVol()</code> changes from 30 to 26.<br />
<br />
== 0x11C ==<br />
<br />
LedInfoParam (1 byte)<br />
<br />
Seen 0x01 on PCH200X, 0x00 on PSTV<br />
<br />
== Zeroed leaves ==<br />
<br />
The following leaves are present in IdStorage, but seem to always contain zeroes:<br />
* 0x008~0x01F<br />
* 0x028~0x03F<br />
* 0x050~0x07D<br />
* 0x7F</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=IdStorage&diff=20840
IdStorage
2023-12-21T13:35:58Z
<p>CreepNT: /* 0x115 */ Correct target operator field</p>
<hr />
<div>See also [https://playstationdev.wiki/pspdevwiki/index.php?title=IDStorage].<br />
<br />
= Description =<br />
<br />
Region of the PSVita eMMC where perconsole info is stored.<br />
<br />
= Location =<br />
<br />
Idstorage data is stored at first raw partition (code 0x1). Use [https://github.com/TeamMolecule/sceutils/blob/master/extract_idstorage.py] to extract.<br />
<br />
= Structure =<br />
<br />
The IdStorage partition is divided in two parts: the mapping table and the leaves.<br />
<br />
== Mapping table ==<br />
<br />
The mapping table is located at the start of the partition. It's an array of 16-bit leaf IDs that serves as a leaf ID->index mapping table. The mapping table must be at least one-sector wide but may be bigger.<br />
<br />
There are two leaf IDs reserved for usage in the mapping table: all entries corresponding to the mapping table (i.e. the first <code>M</code> entries for an </code>M</code> sectors sized table) must hold the value <code>0xFFF5</code>, and all unallocated leaves hold the value <code>0xFFFF</code>.<br />
<br />
To lookup a leaf index based on its ID, use the following algorithm:<br />
<source lang="C"><br />
#define M /* implementation defined */<br />
#define SECTOR_SIZE (512)<br />
<br />
#define NUM_TABLE_ITEMS ((M * SECTOR_SIZE) / sizeof(uint16_t))<br />
uint16_t g_mappingTable[NUM_TABLE_ITEMS];<br />
<br />
int leafIndexFromId(unsigned id) {<br />
if (id >= 0xFFF0)<br />
return /* ERROR: invalid leaf ID */;<br />
<br />
for (int i = 0; i < NUM_TABLE_ITEMS; i++) {<br />
if (g_mappingTable[i] == id)<br />
return i;<br />
}<br />
return /* ERROR: leaf ID is not in mapping table */;<br />
}<br />
</source><br />
<br />
== Leaves ==<br />
<br />
Leaves are sector-sized (512 bytes) areas in the IdStorage partition used to store arbitrary data. While the data stored may be smaller, a leaf always occupies one sector in the partition.<br />
<br />
To read a leaf's data, obtain the leaf index (this can be known directly, or obtained from a leaf ID using the previously mentioned algorithm) then read 512 bytes starting at offset <code>512 * leafIndex</code> in the IdStorage partition.<br />
<br />
== Limits ==<br />
<br />
The number of leaves that can be stored in an IdStorage partition is limited by three factors: the size of the partition, the size of the mapping table and the size of leaf IDs.<br />
<br />
* An <code>M</code> sectors wide mapping table can hold up to <code>255 * M</code> leaves<br />
** This is because a single-sector mapping table can reference <code>SECTOR_SIZE/sizeof(u16) - 1 = 255</code> leaves (the <code>- 1</code> is needed because a table consumes one entry for itself)<br />
* A <code>P</code> sectors wide partition can hold up to <code>P - M</code> leaves<br />
** This is because leaves are sector-sized, and the mapping table consumes <code>M</code> sectors<br />
* There are 65520 leaf IDs available<br />
** While an unsigned 16-bit variable can hold 65536 values, IDs superior or equal to 0xFFF0 are reserved and cannot be used<br />
<br />
From this, we can conclude that an IdStorage partition of <code>P</code> sectors with an <code>M</code> sectors mapping table can hold up to <code>min(255*M, P-M, 65520)</code> leaves. We can also deduce an IdStorage partition is optimally shaped (no space is non-allocatable) when <code>P = 256 * M</code>.<br />
<br />
On Vita, the IdStorage partition is 512KiB and 32 sectors are reserved for the indexing table (<code>P = 1024, M = 32</code>, a non-optimal choice), which means the console's partition can hold '''up to 992 IdStorage leaves'''.<br />
<br />
= Leaf content =<br />
<br />
Leaves not present in this section have not been found in any unit.<br />
<br />
In the following section, "empty" means that the area has all bits set to 1 (i.e., 0xFF).<br />
"Present"/"Not present" means whether or not a leaf exists in IdStorage.<br />
<br />
When a size is indicated, this means only the first X bytes of the leaf are used, and the rest is empty.<br />
<br />
The following information may not be valid for pre-production units.<br />
<br />
== 0x000~0x007 ==<br />
<br />
SceIdStoragePspCertificates<br />
<br />
Identical across all units and duplicated in leaves 0x020 to 0x027.<br />
<br />
== 0x040~0x047 ==<br />
<br />
SceIdStoragePsp2Certificates.<br />
<br />
Console-unique.<br />
<br />
== 0x048~0x04F ==<br />
<br />
Console-unique. May be certificate(s).<br />
<br />
== 0x07E ==<br />
<br />
Console-unique.<br />
<br />
== 0x80 ==<br />
<br />
Service / Manufacturing Information (SMI)<br />
<br />
Console-unique. Contains minimal firmware version (checked in [[Second Loader|<code>second_loader</code>]]).<br />
<br />
<source lang="c"><br />
struct SMILeaf {<br />
uint8_t magic[4]; //'SMI\0'<br />
uint32_t version; //1<br />
uint32_t min_fwv; //Minimal firmware version<br />
uint8_t unused[0x80 - 0xC];<br />
//Encrypted with per-console keys.<br />
//This is used to verify the leaf has not been modified.<br />
uint8_t encrypted_data[0x200 - 0x80];<br />
};<br />
</source><br />
<br />
== 0x100 ==<br />
<br />
Console-unique. Build data strings. One string starts at offset 0, and one string starts at offset 0x100. Both strings are 0x100 characters long.<br />
<br />
In a 0.920 minfw unit, this leaf instead contains 0x0 at offset 0, 0x10 at offset 0x10, etc up to offset 0xF0, while all other bytes are zeroes.<br />
<br />
== 0x102 ==<br />
<br />
Console-unique. Per-console factory/service product information.<br />
<br />
== 0x103 ==<br />
<br />
Console-unique. Hardware information.<br />
<br />
== 0x104 ==<br />
<br />
Console-unique. Diagnostic results.<br />
<br />
Not present if diagnostic software has not been executed on the unit.<br />
<br />
== 0x110 ==<br />
<br />
WlanRegion (3 bytes)<br />
<br />
The following algorithm is used to derive it from PsCode:<br />
<source lang="c"><br />
byte WlanRegion[3];<br />
switch(pscode.product_code) {<br />
case 0x100:<br />
case 0x101:<br />
case 0x102:<br />
case 0x104:<br />
case 0x10B:<br />
case 0x10F:<br />
case 0x110:<br />
case 0x111:<br />
WlanRegion[2] = 0;<br />
WlanRegion[1] = 7;<br />
break;<br />
case 0x103:<br />
case 0x106:<br />
case 0x108:<br />
case 0x10A:<br />
case 0x10D:<br />
case 0x10E:<br />
WlanRegion[2] = 0;<br />
WlanRegion[1] = 0x1F;<br />
break;<br />
case 0x105:<br />
case 0x107:<br />
case 0x109:<br />
case 0x10C:<br />
WlanRegion[2] = 1;<br />
WlanRegion[1] = 0x1F;<br />
break;<br />
default:<br />
goto error;<br />
}<br />
WlanRegion[0] = 0xFF;<br />
</source><br />
<br />
== 0x111 ==<br />
<br />
WlanMacAddress (6 bytes)<br />
<br />
Console-unique. The MAC address of the Wireless LAN adapter.<br />
<br />
== 0x112 ==<br />
<br />
MtpSerial (<code>wchar_t[0x20]</code>)<br />
<br />
Console-unique. The serial number sent via the MTP protocol.<br />
<br />
== 0x113 ==<br />
<br />
Console-unique. Information related to the 3G modem.<br />
<br />
Empty on non-3G models.<br />
<br />
== 0x114 ==<br />
<br />
DeviceLocation?<br />
<br />
Identical for all consoles of a generation (one kind for Fat, one kind for Slim).<br />
<br />
Empty on PSTV.<br />
<br />
== 0x115 ==<br />
<br />
ProductTypeInfo (<code>char[16]</code>)<br />
<br />
Identical for consoles of the same "type".<br />
<br />
Example values:<br />
* <code>PDEL100000010000</code> (PDEL-1000)<br />
* <code>PCH01004ZAZ20000</code> (PCH-1004 - Call of Duty: Black Ops Declassified limited edition)<br />
* <code>PCH01100AA010002</code> (Crystal Black PCH-1100 - docomo carrier)<br />
* <code>PCH02000ZA120000</code> (White PCH-2000)<br />
<br />
Decomposition: <code>FFFF NNNN ZZ Y X xxx O</code><br />
* <code>FFFF</code> and <code>NNNN</code> = Model code (e.g. PDEL-1000) decomposed in two parts<br />
** <code>FFFF</code> = family (e.g., PCH, PDEL)<br />
** <code>NNNN</code> = number (e.g., 1000, 1004, 1100)<br />
* <code>ZZ</code> = ? (known values: 00, ZA, AA)<br />
* <code>Y</code> = ? (known values: 0, 1, Z)<br />
* <code>X</code> = ? (known values: 1, 2)<br />
* <code>xxx</code> = ? (always 000)<br />
* <code>O</code> = Product target operator (carrier ID for 3G models - usually matches offset 0x88 of leaf 0x113 on SIM-locked models)<br />
<br />
== 0x116 ==<br />
<br />
ColorVariation (4 bytes)<br />
<br />
Not present on all units.<br />
<br />
Used for wave color by SceShell. ([https://github.com/Princess-of-Sleeping/psp2wpp/blob/master/src/main.c#L441-L467 Patch example])<br />
<br />
<source lang="c"><br />
struct ColorVariation {<br />
uint8_t unk0;<br />
uint16_t unk1;<br />
uint8_t unk3;<br />
/* rest of the leaf is empty */<br />
};<br />
</source><br />
<br />
Example values:<br />
* Call of Duty: Black Ops Declassified limited edition PCH-1004: <code>{ 0x01, 0x0000, 0x00 }</code><br />
* Glacier White PCH-2000 <code>{ 0x01, 0x000C, 0x00 }</code><br />
<br />
== 0x117 ==<br />
<br />
TemperatureThreashold[https://en.wikipedia.org/wiki/Sic <sup>[sic<nowiki>]</nowiki></sup>] (4 elements of 1 byte each)<br />
<br />
Not present on all units, and always all zeroes when present.<br />
<br />
== 0x118 ==<br />
<br />
AudioParam (1 byte)<br />
<br />
Not present on all units.<br />
<br />
If set to 0 (or the leaf is absent?), AVLS is never forcefully enabled.<br />
<br />
== 0x119 ==<br />
<br />
EtherMacAddress (6 bytes)<br />
<br />
Console-unique. The MAC address of the Ethernet adapter.<br />
<br />
Present on PSTV and PCH-2000 (where it is empty).<br />
<br />
== 0x11A ==<br />
<br />
WebBrowserParam (1 byte)<br />
<br />
Can be 0/1/2/0x11?<br />
<br />
Seen:<br />
0x02 on PCH200X, 0x11 on PSTV<br />
<br />
== 0x11B ==<br />
<br />
ShutterParam (1 byte)<br />
<br />
Seen: 0x01 on PCH200X, 0x00 on PSTV. Maybe used to disable the shutter sound?<br />
<br />
== 0x11C ==<br />
<br />
LedInfoParam (1 byte)<br />
<br />
Seen 0x01 on PCH200X, 0x00 on PSTV<br />
<br />
== Zeroed leaves ==<br />
<br />
The following leaves are present in IdStorage, but seem to always contain zeroes:<br />
* 0x008~0x01F<br />
* 0x028~0x03F<br />
* 0x050~0x07D<br />
* 0x7F</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=IdStorage&diff=20839
IdStorage
2023-12-21T12:08:46Z
<p>CreepNT: /* 0x115 */ Add description of contained information</p>
<hr />
<div>See also [https://playstationdev.wiki/pspdevwiki/index.php?title=IDStorage].<br />
<br />
= Description =<br />
<br />
Region of the PSVita eMMC where perconsole info is stored.<br />
<br />
= Location =<br />
<br />
Idstorage data is stored at first raw partition (code 0x1). Use [https://github.com/TeamMolecule/sceutils/blob/master/extract_idstorage.py] to extract.<br />
<br />
= Structure =<br />
<br />
The IdStorage partition is divided in two parts: the mapping table and the leaves.<br />
<br />
== Mapping table ==<br />
<br />
The mapping table is located at the start of the partition. It's an array of 16-bit leaf IDs that serves as a leaf ID->index mapping table. The mapping table must be at least one-sector wide but may be bigger.<br />
<br />
There are two leaf IDs reserved for usage in the mapping table: all entries corresponding to the mapping table (i.e. the first <code>M</code> entries for an </code>M</code> sectors sized table) must hold the value <code>0xFFF5</code>, and all unallocated leaves hold the value <code>0xFFFF</code>.<br />
<br />
To lookup a leaf index based on its ID, use the following algorithm:<br />
<source lang="C"><br />
#define M /* implementation defined */<br />
#define SECTOR_SIZE (512)<br />
<br />
#define NUM_TABLE_ITEMS ((M * SECTOR_SIZE) / sizeof(uint16_t))<br />
uint16_t g_mappingTable[NUM_TABLE_ITEMS];<br />
<br />
int leafIndexFromId(unsigned id) {<br />
if (id >= 0xFFF0)<br />
return /* ERROR: invalid leaf ID */;<br />
<br />
for (int i = 0; i < NUM_TABLE_ITEMS; i++) {<br />
if (g_mappingTable[i] == id)<br />
return i;<br />
}<br />
return /* ERROR: leaf ID is not in mapping table */;<br />
}<br />
</source><br />
<br />
== Leaves ==<br />
<br />
Leaves are sector-sized (512 bytes) areas in the IdStorage partition used to store arbitrary data. While the data stored may be smaller, a leaf always occupies one sector in the partition.<br />
<br />
To read a leaf's data, obtain the leaf index (this can be known directly, or obtained from a leaf ID using the previously mentioned algorithm) then read 512 bytes starting at offset <code>512 * leafIndex</code> in the IdStorage partition.<br />
<br />
== Limits ==<br />
<br />
The number of leaves that can be stored in an IdStorage partition is limited by three factors: the size of the partition, the size of the mapping table and the size of leaf IDs.<br />
<br />
* An <code>M</code> sectors wide mapping table can hold up to <code>255 * M</code> leaves<br />
** This is because a single-sector mapping table can reference <code>SECTOR_SIZE/sizeof(u16) - 1 = 255</code> leaves (the <code>- 1</code> is needed because a table consumes one entry for itself)<br />
* A <code>P</code> sectors wide partition can hold up to <code>P - M</code> leaves<br />
** This is because leaves are sector-sized, and the mapping table consumes <code>M</code> sectors<br />
* There are 65520 leaf IDs available<br />
** While an unsigned 16-bit variable can hold 65536 values, IDs superior or equal to 0xFFF0 are reserved and cannot be used<br />
<br />
From this, we can conclude that an IdStorage partition of <code>P</code> sectors with an <code>M</code> sectors mapping table can hold up to <code>min(255*M, P-M, 65520)</code> leaves. We can also deduce an IdStorage partition is optimally shaped (no space is non-allocatable) when <code>P = 256 * M</code>.<br />
<br />
On Vita, the IdStorage partition is 512KiB and 32 sectors are reserved for the indexing table (<code>P = 1024, M = 32</code>, a non-optimal choice), which means the console's partition can hold '''up to 992 IdStorage leaves'''.<br />
<br />
= Leaf content =<br />
<br />
Leaves not present in this section have not been found in any unit.<br />
<br />
In the following section, "empty" means that the area has all bits set to 1 (i.e., 0xFF).<br />
"Present"/"Not present" means whether or not a leaf exists in IdStorage.<br />
<br />
When a size is indicated, this means only the first X bytes of the leaf are used, and the rest is empty.<br />
<br />
The following information may not be valid for pre-production units.<br />
<br />
== 0x000~0x007 ==<br />
<br />
SceIdStoragePspCertificates<br />
<br />
Identical across all units and duplicated in leaves 0x020 to 0x027.<br />
<br />
== 0x040~0x047 ==<br />
<br />
SceIdStoragePsp2Certificates.<br />
<br />
Console-unique.<br />
<br />
== 0x048~0x04F ==<br />
<br />
Console-unique. May be certificate(s).<br />
<br />
== 0x07E ==<br />
<br />
Console-unique.<br />
<br />
== 0x80 ==<br />
<br />
Service / Manufacturing Information (SMI)<br />
<br />
Console-unique. Contains minimal firmware version (checked in [[Second Loader|<code>second_loader</code>]]).<br />
<br />
<source lang="c"><br />
struct SMILeaf {<br />
uint8_t magic[4]; //'SMI\0'<br />
uint32_t version; //1<br />
uint32_t min_fwv; //Minimal firmware version<br />
uint8_t unused[0x80 - 0xC];<br />
//Encrypted with per-console keys.<br />
//This is used to verify the leaf has not been modified.<br />
uint8_t encrypted_data[0x200 - 0x80];<br />
};<br />
</source><br />
<br />
== 0x100 ==<br />
<br />
Console-unique. Build data strings. One string starts at offset 0, and one string starts at offset 0x100. Both strings are 0x100 characters long.<br />
<br />
In a 0.920 minfw unit, this leaf instead contains 0x0 at offset 0, 0x10 at offset 0x10, etc up to offset 0xF0, while all other bytes are zeroes.<br />
<br />
== 0x102 ==<br />
<br />
Console-unique. Per-console factory/service product information.<br />
<br />
== 0x103 ==<br />
<br />
Console-unique. Hardware information.<br />
<br />
== 0x104 ==<br />
<br />
Console-unique. Diagnostic results.<br />
<br />
Not present if diagnostic software has not been executed on the unit.<br />
<br />
== 0x110 ==<br />
<br />
WlanRegion (3 bytes)<br />
<br />
The following algorithm is used to derive it from PsCode:<br />
<source lang="c"><br />
byte WlanRegion[3];<br />
switch(pscode.product_code) {<br />
case 0x100:<br />
case 0x101:<br />
case 0x102:<br />
case 0x104:<br />
case 0x10B:<br />
case 0x10F:<br />
case 0x110:<br />
case 0x111:<br />
WlanRegion[2] = 0;<br />
WlanRegion[1] = 7;<br />
break;<br />
case 0x103:<br />
case 0x106:<br />
case 0x108:<br />
case 0x10A:<br />
case 0x10D:<br />
case 0x10E:<br />
WlanRegion[2] = 0;<br />
WlanRegion[1] = 0x1F;<br />
break;<br />
case 0x105:<br />
case 0x107:<br />
case 0x109:<br />
case 0x10C:<br />
WlanRegion[2] = 1;<br />
WlanRegion[1] = 0x1F;<br />
break;<br />
default:<br />
goto error;<br />
}<br />
WlanRegion[0] = 0xFF;<br />
</source><br />
<br />
== 0x111 ==<br />
<br />
WlanMacAddress (6 bytes)<br />
<br />
Console-unique. The MAC address of the Wireless LAN adapter.<br />
<br />
== 0x112 ==<br />
<br />
MtpSerial (<code>wchar_t[0x20]</code>)<br />
<br />
Console-unique. The serial number sent via the MTP protocol.<br />
<br />
== 0x113 ==<br />
<br />
Console-unique. Information related to the 3G modem.<br />
<br />
Empty on non-3G models.<br />
<br />
== 0x114 ==<br />
<br />
DeviceLocation?<br />
<br />
Identical for all consoles of a generation (one kind for Fat, one kind for Slim).<br />
<br />
Empty on PSTV.<br />
<br />
== 0x115 ==<br />
<br />
ProductTypeInfo (<code>char[16]</code>)<br />
<br />
Identical for consoles of the same "type".<br />
<br />
Example values:<br />
* <code>PDEL100000010000</code> (PDEL-1000)<br />
* <code>PCH01004ZAZ20000</code> (PCH-1004 - Call of Duty: Black Ops Declassified limited edition)<br />
* <code>PCH01100AA010002</code> (Crystal Black PCH-1100 - docomo carrier)<br />
* <code>PCH02000ZA120000</code> (White PCH-2000)<br />
<br />
Decomposition: <code>FFFF NNNN ZZ Y X xxx O</code><br />
* <code>FFFF</code> and <code>NNNN</code> = Model code (e.g. PDEL-1000) decomposed in two parts<br />
** <code>FFFF</code> = family (e.g., PCH, PDEL)<br />
** <code>NNNN</code> = number (e.g., 1000, 1004, 1100)<br />
* <code>ZZ</code> = ? (known values: 00, ZA, AA)<br />
* <code>Y</code> = ? (known values: 0, 1, Z)<br />
* <code>X</code> = ? (known values: 1, 2)<br />
* <code>xxx</code> = ? (always 000)<br />
* <code>O</code> = Product target operator (carrier ID for SIM-locked 3G models - same as offset 0x88 of leaf 0x113)<br />
<br />
== 0x116 ==<br />
<br />
ColorVariation (4 bytes)<br />
<br />
Not present on all units.<br />
<br />
Used for wave color by SceShell. ([https://github.com/Princess-of-Sleeping/psp2wpp/blob/master/src/main.c#L441-L467 Patch example])<br />
<br />
<source lang="c"><br />
struct ColorVariation {<br />
uint8_t unk0;<br />
uint16_t unk1;<br />
uint8_t unk3;<br />
/* rest of the leaf is empty */<br />
};<br />
</source><br />
<br />
Example values:<br />
* Call of Duty: Black Ops Declassified limited edition PCH-1004: <code>{ 0x01, 0x0000, 0x00 }</code><br />
* Glacier White PCH-2000 <code>{ 0x01, 0x000C, 0x00 }</code><br />
<br />
== 0x117 ==<br />
<br />
TemperatureThreashold[https://en.wikipedia.org/wiki/Sic <sup>[sic<nowiki>]</nowiki></sup>] (4 elements of 1 byte each)<br />
<br />
Not present on all units, and always all zeroes when present.<br />
<br />
== 0x118 ==<br />
<br />
AudioParam (1 byte)<br />
<br />
Not present on all units.<br />
<br />
If set to 0 (or the leaf is absent?), AVLS is never forcefully enabled.<br />
<br />
== 0x119 ==<br />
<br />
EtherMacAddress (6 bytes)<br />
<br />
Console-unique. The MAC address of the Ethernet adapter.<br />
<br />
Present on PSTV and PCH-2000 (where it is empty).<br />
<br />
== 0x11A ==<br />
<br />
WebBrowserParam (1 byte)<br />
<br />
Can be 0/1/2/0x11?<br />
<br />
Seen:<br />
0x02 on PCH200X, 0x11 on PSTV<br />
<br />
== 0x11B ==<br />
<br />
ShutterParam (1 byte)<br />
<br />
Seen: 0x01 on PCH200X, 0x00 on PSTV. Maybe used to disable the shutter sound?<br />
<br />
== 0x11C ==<br />
<br />
LedInfoParam (1 byte)<br />
<br />
Seen 0x01 on PCH200X, 0x00 on PSTV<br />
<br />
== Zeroed leaves ==<br />
<br />
The following leaves are present in IdStorage, but seem to always contain zeroes:<br />
* 0x008~0x01F<br />
* 0x028~0x03F<br />
* 0x050~0x07D<br />
* 0x7F</div>
CreepNT
https://wiki.henkaku.xyz/vita/index.php?title=IdStorage&diff=20834
IdStorage
2023-12-21T01:31:11Z
<p>CreepNT: /* Content */ Refactor leaf content section & add documentation</p>
<hr />
<div>See also [https://playstationdev.wiki/pspdevwiki/index.php?title=IDStorage].<br />
<br />
= Description =<br />
<br />
Region of the PSVita eMMC where perconsole info is stored.<br />
<br />
= Location =<br />
<br />
Idstorage data is stored at first raw partition (code 0x1). Use [https://github.com/TeamMolecule/sceutils/blob/master/extract_idstorage.py] to extract.<br />
<br />
= Structure =<br />
<br />
The IdStorage partition is divided in two parts: the mapping table and the leaves.<br />
<br />
== Mapping table ==<br />
<br />
The mapping table is located at the start of the partition. It's an array of 16-bit leaf IDs that serves as a leaf ID->index mapping table. The mapping table must be at least one-sector wide but may be bigger.<br />
<br />
There are two leaf IDs reserved for usage in the mapping table: all entries corresponding to the mapping table (i.e. the first <code>M</code> entries for an </code>M</code> sectors sized table) must hold the value <code>0xFFF5</code>, and all unallocated leaves hold the value <code>0xFFFF</code>.<br />
<br />
To lookup a leaf index based on its ID, use the following algorithm:<br />
<source lang="C"><br />
#define M /* implementation defined */<br />
#define SECTOR_SIZE (512)<br />
<br />
#define NUM_TABLE_ITEMS ((M * SECTOR_SIZE) / sizeof(uint16_t))<br />
uint16_t g_mappingTable[NUM_TABLE_ITEMS];<br />
<br />
int leafIndexFromId(unsigned id) {<br />
if (id >= 0xFFF0)<br />
return /* ERROR: invalid leaf ID */;<br />
<br />
for (int i = 0; i < NUM_TABLE_ITEMS; i++) {<br />
if (g_mappingTable[i] == id)<br />
return i;<br />
}<br />
return /* ERROR: leaf ID is not in mapping table */;<br />
}<br />
</source><br />
<br />
== Leaves ==<br />
<br />
Leaves are sector-sized (512 bytes) areas in the IdStorage partition used to store arbitrary data. While the data stored may be smaller, a leaf always occupies one sector in the partition.<br />
<br />
To read a leaf's data, obtain the leaf index (this can be known directly, or obtained from a leaf ID using the previously mentioned algorithm) then read 512 bytes starting at offset <code>512 * leafIndex</code> in the IdStorage partition.<br />
<br />
== Limits ==<br />
<br />
The number of leaves that can be stored in an IdStorage partition is limited by three factors: the size of the partition, the size of the mapping table and the size of leaf IDs.<br />
<br />
* An <code>M</code> sectors wide mapping table can hold up to <code>255 * M</code> leaves<br />
** This is because a single-sector mapping table can reference <code>SECTOR_SIZE/sizeof(u16) - 1 = 255</code> leaves (the <code>- 1</code> is needed because a table consumes one entry for itself)<br />
* A <code>P</code> sectors wide partition can hold up to <code>P - M</code> leaves<br />
** This is because leaves are sector-sized, and the mapping table consumes <code>M</code> sectors<br />
* There are 65520 leaf IDs available<br />
** While an unsigned 16-bit variable can hold 65536 values, IDs superior or equal to 0xFFF0 are reserved and cannot be used<br />
<br />
From this, we can conclude that an IdStorage partition of <code>P</code> sectors with an <code>M</code> sectors mapping table can hold up to <code>min(255*M, P-M, 65520)</code> leaves. We can also deduce an IdStorage partition is optimally shaped (no space is non-allocatable) when <code>P = 256 * M</code>.<br />
<br />
On Vita, the IdStorage partition is 512KiB and 32 sectors are reserved for the indexing table (<code>P = 1024, M = 32</code>, a non-optimal choice), which means the console's partition can hold '''up to 992 IdStorage leaves'''.<br />
<br />
= Leaf content =<br />
<br />
Leaves not present in this section have not been found in any unit.<br />
<br />
In the following section, "empty" means that the area has all bits set to 1 (i.e., 0xFF).<br />
"Present"/"Not present" means whether or not a leaf exists in IdStorage.<br />
<br />
When a size is indicated, this means only the first X bytes of the leaf are used, and the rest is empty.<br />
<br />
The following information may not be valid for pre-production units.<br />
<br />
== 0x000~0x007 ==<br />
<br />
SceIdStoragePspCertificates<br />
<br />
Identical across all units and duplicated in leaves 0x020 to 0x027.<br />
<br />
== 0x040~0x047 ==<br />
<br />
SceIdStoragePsp2Certificates.<br />
<br />
Console-unique.<br />
<br />
== 0x048~0x04F ==<br />
<br />
Console-unique. May be certificate(s).<br />
<br />
== 0x07E ==<br />
<br />
Console-unique.<br />
<br />
== 0x80 ==<br />
<br />
Service / Manufacturing Information (SMI)<br />
<br />
Console-unique. Contains minimal firmware version (checked in [[Second Loader|<code>second_loader</code>]]).<br />
<br />
<source lang="c"><br />
struct SMILeaf {<br />
uint8_t magic[4]; //'SMI\0'<br />
uint32_t version; //1<br />
uint32_t min_fwv; //Minimal firmware version<br />
uint8_t unused[0x80 - 0xC];<br />
//Encrypted with per-console keys.<br />
//This is used to verify the leaf has not been modified.<br />
uint8_t encrypted_data[0x200 - 0x80];<br />
};<br />
</source><br />
<br />
== 0x100 ==<br />
<br />
Console-unique. Build data strings. One string starts at offset 0, and one string starts at offset 0x100. Both strings are 0x100 characters long.<br />
<br />
In a 0.920 minfw unit, this leaf instead contains 0x0 at offset 0, 0x10 at offset 0x10, etc up to offset 0xF0, while all other bytes are zeroes.<br />
<br />
== 0x102 ==<br />
<br />
Console-unique. Per-console factory/service product information.<br />
<br />
== 0x103 ==<br />
<br />
Console-unique. Hardware information.<br />
<br />
== 0x104 ==<br />
<br />
Console-unique. Diagnostic results.<br />
<br />
Not present if diagnostic software has not been executed on the unit.<br />
<br />
== 0x110 ==<br />
<br />
WlanRegion (3 bytes)<br />
<br />
The following algorithm is used to derive it from PsCode:<br />
<source lang="c"><br />
byte WlanRegion[3];<br />
switch(pscode.product_code) {<br />
case 0x100:<br />
case 0x101:<br />
case 0x102:<br />
case 0x104:<br />
case 0x10B:<br />
case 0x10F:<br />
case 0x110:<br />
case 0x111:<br />
WlanRegion[2] = 0;<br />
WlanRegion[1] = 7;<br />
break;<br />
case 0x103:<br />
case 0x106:<br />
case 0x108:<br />
case 0x10A:<br />
case 0x10D:<br />
case 0x10E:<br />
WlanRegion[2] = 0;<br />
WlanRegion[1] = 0x1F;<br />
break;<br />
case 0x105:<br />
case 0x107:<br />
case 0x109:<br />
case 0x10C:<br />
WlanRegion[2] = 1;<br />
WlanRegion[1] = 0x1F;<br />
break;<br />
default:<br />
goto error;<br />
}<br />
WlanRegion[0] = 0xFF;<br />
</source><br />
<br />
== 0x111 ==<br />
<br />
WlanMacAddress (6 bytes)<br />
<br />
Console-unique. The MAC address of the Wireless LAN adapter.<br />
<br />
== 0x112 ==<br />
<br />
MtpSerial (<code>wchar_t[0x20]</code>)<br />
<br />
Console-unique. The serial number sent via the MTP protocol.<br />
<br />
== 0x113 ==<br />
<br />
Console-unique. Information related to the 3G modem.<br />
<br />
Empty on non-3G models.<br />
<br />
== 0x114 ==<br />
<br />
DeviceLocation?<br />
<br />
Identical for all consoles of a generation (one kind for Fat, one kind for Slim).<br />
<br />
Empty on PSTV.<br />
<br />
== 0x115 ==<br />
<br />
ProductTypeInfo (<code>char[16]</code>)<br />
<br />
Identical for consoles of the same "type".<br />
<br />
Example values:<br />
* <code>PDEL100000010000</code> (PDEL-1000)<br />
* <code>PCH01004ZAZ20000</code> (PCH-1004 - Call of Duty: Black Ops Declassified limited edition)<br />
* <code>PCH01100AA010002</code> (Black PCH-1100 - docomo carrier)<br />
* <code>PCH02000ZA120000</code> (Glacier White PCH-2000)<br />
<br />
== 0x116 ==<br />
<br />
ColorVariation (4 bytes)<br />
<br />
Not present on all units.<br />
<br />
<source lang="c"><br />
struct ColorVariation {<br />
uint8_t unk0;<br />
uint16_t unk1;<br />
uint8_t unk3;<br />
/* rest of the leaf is empty */<br />
};<br />
</source><br />
<br />
Example values:<br />
* Call of Duty: Black Ops Declassified limited edition PCH-1004: <code>{ 0x01, 0x0000, 0x00 }</code><br />
* Glacier White PCH-2000 <code>{ 0x01, 0x000C, 0x00 }</code><br />
<br />
== 0x117 ==<br />
<br />
TemperatureThreashold[https://en.wikipedia.org/wiki/Sic <sup>[sic<nowiki>]</nowiki></sup>] (4 elements of 1 byte each)<br />
<br />
Not present on all units, and always all zeroes when present.<br />
<br />
== 0x118 ==<br />
<br />
AudioParam (1 byte)<br />
<br />
Not present on all units.<br />
<br />
If set to 0 (or the leaf is absent?), AVLS is never forcefully enabled.<br />
<br />
== 0x119 ==<br />
<br />
EtherMacAddress (6 bytes)<br />
<br />
Console-unique. The MAC address of the Ethernet adapter.<br />
<br />
Present on PSTV and PCH-2000 (where it is empty).<br />
<br />
== 0x11A ==<br />
<br />
WebBrowserParam (1 byte)<br />
<br />
Can be 0/1/2/0x11?<br />
<br />
Never seen in the wild. Maybe used on IDU units?<br />
<br />
== 0x11B ==<br />
<br />
ShutterParam (1 byte)<br />
<br />
Never seen in the wild. Maybe used to disable the shutter sound?<br />
<br />
== 0x11C ==<br />
<br />
LedInfoParam (1 byte)<br />
<br />
Never seen in the wild.<br />
<br />
== Zeroed leaves ==<br />
<br />
The following leaves are present in IdStorage, but seem to always contain zeroes:<br />
* 0x008~0x01F<br />
* 0x028~0x03F<br />
* 0x050~0x07D<br />
* 0x7F</div>
CreepNT