SKBL: Difference between revisions

From Vita Development Wiki
Jump to navigation Jump to search
No edit summary
 
(34 intermediate revisions by 3 users not shown)
Line 1: Line 1:
= Changelog =
{| class="wikitable"
|-
! FW version !! What changed compared to previous FW version
|-
| 0.940 || Changed SKBL base physical address to 0x40040000 from 0x50000000. NSKBL is now stored in [[Kernel_Boot_Loader|<code>kernel_boot_loader.self</code>]] segment 3 instead of SKBL <code>.text</code>, and loaded (ARZL-compressed) at <code>0x50000000</code>.
Changed the early boot stack base addresses from <code>0x500Ex000</code> to <code>0x400ExC00</code>. Undef/Abort/IRQ/FIQ stack are no longer separated.
Resuming on Kermit ES1 is no longer supported (<code>sceKernelAssert(0)</code>).
|-
| 0.995 || Unknown.
|-
| 0.996 || Changed SKBL base physical address to 0x40020000 from 0x40040000.
|-
| 3.36 || Unknown
|-
| 3.50 || Initial stack base changed (+ 0x100).
Something in the function has changed (see function at: 3.50:0x40020438).
Removed some register writing (see function at: 3.36:0x4002066c/3.50:0x40020668).
|}
= Common =
= Common =


Line 4: Line 29:


Offsets are relative to SKBL text segment base address. See [[Physical_Memory#Secure_DRAM|Secure DRAM]].
Offsets are relative to SKBL text segment base address. See [[Physical_Memory#Secure_DRAM|Secure DRAM]].
== SceKernelModulemgr ==
=== sceKernelLoadStartModule ===
{| class="wikitable"
|-
! Version !! offset !! mode
|-
| 3.60 || 0x20B0 || thumb
|}
<source lang="C">
typedef struct SceTzsModule {
const void *pModule;
const void *pModuleEnd;
} SceTzsModule;
int sceKernelLoadStartModule(SceTzsModule *pModule, void *argp);
</source>
=== get_module_object ===
{| class="wikitable"
|-
! Version !! offset !! mode
|-
| 3.60 || 0x2350 || thumb
|}
<source lang="C">SceModuleObject *get_module_object(SceUID modid);</source>
=== sceKernelLoadModuleWithBuffer ===
{| class="wikitable"
|-
! Version !! offset !! mode
|-
| 3.60 || 0x2494 || thumb
|}
<source lang="C">SceUID sceKernelLoadModuleWithBuffer(const void *pModule, SceSize size);</source>
=== sceKernelStartModuleForPid ===
{| class="wikitable"
|-
! Version !! offset !! mode
|-
| 3.60 || 0x25BC || thumb
|}
<source lang="C">int sceKernelStartModuleForPid(SceUID pid, SceUID modid, SceSize args, void *argp, int flags, SceKernelLMOption *option, int *status);</source>
=== sceKernelStartModule ===
{| class="wikitable"
|-
! Version !! offset !! mode
|-
| 3.60 || 0x2710 || thumb
|}
<source lang="C">int sceKernelStartModule(SceUID modid, SceSize args, void *argp, int flags, SceKernelLMOption *option, int *status);</source>
=== get_module_bootstart ===
{| class="wikitable"
|-
! Version !! offset !! mode
|-
| 3.60 || 0x2744 || thumb
|}
<source lang="C">int get_module_bootstart(SceUID modid, void *entry);</source>
=== print_module_load_info ===
{| class="wikitable"
|-
! Version !! offset !! mode
|-
| 3.60 || 0x2A70 || thumb
|}
=== resolve_import_function ===
{| class="wikitable"
|-
! Version !! offset !! mode
|-
| 3.60 || 0x4748 || thumb
|}
== SceExcpmgr ==
=== excp_handler ===
{| class="wikitable"
|-
! Version !! offset !! mode
|-
| 3.60 || 0x4A3C || thumb
|}
=== sceExcpmgrRegisterHandler ===
{| class="wikitable"
|-
! Version !! offset !! mode
|-
| 3.60 || 0x4A70 || thumb
|}
=== SceExcpmgr_module_start ===
{| class="wikitable"
|-
! Version !! offset !! mode
|-
| 3.60 || 0x4CB4 || thumb
|}


== SceSysmem ==
== SceSysmem ==
=== SceSysmem_NS_0x8100156C ===
{| class="wikitable"
|-
! Version !! offset !! mode
|-
| 3.60 || 0x6EC0 || thumb
|}


=== sceGUIDReferObjectWithClass ===
=== sceGUIDReferObjectWithClass ===
Line 39: Line 192:


<source lang="C">int sceKernelIsColdBoot(void);</source>
<source lang="C">int sceKernelIsColdBoot(void);</source>
=== memcpy ===
{| class="wikitable"
|-
! Version !! offset !! mode
|-
| 3.60 || 0x15920 || thumb
|}
See [[SceSysmem]].


=== memset ===
=== memset ===
Line 49: Line 213:
|}
|}


<source lang="C">void *memset(void *dst, int ch, int len);</source>
See [[SceSysmem]].


=== sceKernelCpuDcacheCleanMVACRange ===
=== sceKernelL1CacheInvalidateEntire ===
{| class="wikitable"
{| class="wikitable"
|-
|-
! Version !! offset !! mode
! Version !! offset !! mode
|-
|-
| 3.60 || 0x1650C || thumb
| 3.60 || 0x16480 || thumb
|}
|}


<source lang="C">void sceKernelCpuDcacheCleanMVACRange(void *addr, unsigned int size);</source>
See [[SceSysmem]].


=== sceKernelDcacheWritebackInvalidateRange ===
=== sceKernelL1IcacheInvalidateRange ===
{| class="wikitable"
{| class="wikitable"
|-
|-
! Version !! offset !! mode
! Version !! offset !! mode
|-
|-
| 3.60 || 0x1652C || thumb
| 3.60 || 0x164A0 || thumb
|}
|}


Temp name was sceKernelCpuDcacheCleanInvalidateMVACRangeForKernel, sceKernelCpuDcacheWritebackInvalidateRangeForKernel.
See [[SceSysmem]].
 
=== sceKernelL1DcacheCleanRange ===
{| class="wikitable"
|-
! Version !! offset !! mode
|-
| 3.60 || 0x1650C || thumb
|}


<source lang="C">
See [[SceSysmem]].
// DCCIMVAC, Data cache clean and invalidate by MVA (PoC)
void sceKernelDcacheWritebackInvalidateRange(const void *addr, unsigned int size);
</source>


=== sceKernelDcacheCleanRange_0x20 ===
=== sceKernelL1DcacheCleanInvalidateRange ===
{| class="wikitable"
{| class="wikitable"
|-
|-
! Version !! offset !! mode
! Version !! offset !! mode
|-
|-
| 3.60 || 0x16E54 || thumb
| 3.60 || 0x1652C || thumb
|}
|}


<source lang="C">int sceKernelDcacheCleanRange_0x20(const void *start, SceSize size);</source>
See [[SceSysmem]].


=== sceKernelDcacheCleanRange_0x1 ===
=== sceKernelDcacheCleanRange ===
{| class="wikitable"
{| class="wikitable"
|-
|-
Line 94: Line 263:
|}
|}


<source lang="C">int sceKernelDcacheCleanRange_0x1(const void *start, SceSize size);</source>
See [[SceSysmem]].


=== sceKernelCpuUnrestrictedMemcpy ===
=== sceKernelDcacheCleanRangeForL1WBWA ===
{| class="wikitable"
{| class="wikitable"
|-
|-
! Version !! offset !! mode
! Version !! offset !! mode
|-
|-
| 3.60 || 0x16E90 || thumb
| 3.60 || 0x16E54 || thumb
|}
|}


<source lang="C">int sceKernelCpuUnrestrictedMemcpy(void *dst, const void *src, SceSize len);</source>
See [[SceSysmem]].


=== sceKernelCpuGetPaddr ===
=== sceKernelCorelockContextInitialize ===
{| class="wikitable"
{| class="wikitable"
|-
|-
! Version !! offset !! mode
! Version !! offset !! mode
|-
|-
| 3.60 || 0x179E0 || thumb
| 3.60 || 0x16A80 || thumb
|}
|}


<source lang="C">int sceKernelCpuGetPaddr(void *VA,uintptr_t *pPA);</source>
<source lang="C">
typedef struct SceCorelockContext {
int lock;
int16_t core_count;
int16_t last_wait_core; // 0:core3, 1:core0, 2:core1, 3:core2
} SceCorelockContext;


== SceKernelModulemgr ==
void sceKernelCorelockContextInitialize(SceCorelockContext *ctx);
 
</source>
=== get_module_object ===


=== sceKernelCorelockLock ===
{| class="wikitable"
{| class="wikitable"
|-
|-
! Version !! offset !! mode
! Version !! offset !! mode
|-
|-
| 3.60 || 0x2350 || thumb
| 3.60 || 0x16A8C || thumb
|}
|}


<source lang="C">SceModuleObject *get_module_object(SceUID modid);</source>
<source lang="C">void sceKernelCorelockLock(SceCorelockContext *ctx, int core);</source>
 
=== get_module_bootstart ===


=== sceKernelCorelockUnlock ===
{| class="wikitable"
{| class="wikitable"
|-
|-
! Version !! offset !! mode
! Version !! offset !! mode
|-
|-
| 3.60 || 0x2744 || thumb
| 3.60 || 0x16AC0 || thumb
|}
|}


<source lang="C">int get_module_bootstart(SceUID modid, void *entry);</source>
<source lang="C">void sceKernelCorelockUnlock(SceCorelockContext *ctx);</source>
 
=== sceKernelLoadModuleWithBuffer ===


=== sceKernelDomainTextMemcpy ===
{| class="wikitable"
{| class="wikitable"
|-
|-
! Version !! offset !! mode
! Version !! offset !! mode
|-
|-
| 3.60 || 0x2494 || thumb
| 3.60 || 0x16E90 || thumb
|}
|}


<source lang="C">SceUID sceKernelLoadModuleWithBuffer(const void *pModule, SceSize size);</source>
See [[SceSysmem]].
 
=== sceKernelStartModule ===


=== sceKernelVAtoPA ===
{| class="wikitable"
{| class="wikitable"
|-
|-
! Version !! offset !! mode
! Version !! offset !! mode
|-
|-
| 3.60 || 0x2710 || thumb
| 3.60 || 0x179E0 || thumb
|}
|}


<source lang="C">int sceKernelStartModule(SceUID modid, SceSize args, void *argp, int flags, SceKernelLMOption *option, int *status);</source>
See [[SceSysmem]].


=== sceKernelStartModuleForPid ===
== SceSkbl ==


=== sceArlzDecode ===
{| class="wikitable"
{| class="wikitable"
|-
|-
! Version !! offset !! mode
! Version !! Offset !! Mode
|-
| 0.931 || 0x31E10 || ARM
|-
| 0.990 || 0x2BF50 || ARM
|-
|-
| 3.60 || 0x25BC || thumb
| 3.60 || 0x183A8 || ARM
|}
|}


<source lang="C">int sceKernelStartModuleForPid(SceUID pid, SceUID modid, SceSize args, void *argp, int flags, SceKernelLMOption *option, int *status);</source>
Decodes an [[ARZL]] encoded buffer stored at <code>src</code>, of size <code>size</code> and writes result to <code>dst</code>. Source must point to just after "ARZL" magic.
 
Returns written size.


=== sceKernelLoadStartModule ===
<source lang="C">SceSSize sceArlzDecode(void *dst_start, SceSize dst_max_size, const void *src, void **dst_end);</source>


=== sceArlzArmFilter ===
{| class="wikitable"
{| class="wikitable"
|-
|-
! Version !! offset !! mode
! Version !! Offset !! Mode
|-
| 0.931 || 0x32620 || ARM
|-
| 0.990 || 0x2C760 || ARM
|-
|-
| 3.60 || 0x20B0 || thumb
| 3.60 || 0x18E24 || ARM
|}
|}


<source lang="C">
Returns actual size of decoded [[ARZL]] data coming from [[#sceArlzDecode]].
typedef struct SceTzsModule {
 
const void *pModule;
<source lang="C">SceSSize sceArlzArmFilter(void *data, SceSize size, SceUInt32 version);</source>
const void *pModuleEnd;
} SceTzsModule;


int sceKernelLoadStartModule(SceTzsModule *pModule, void *argp);
[[Category:ARM]]
</source>
[[Category:Kernel]]

Latest revision as of 21:59, 1 May 2023

Changelog

FW version What changed compared to previous FW version
0.940 Changed SKBL base physical address to 0x40040000 from 0x50000000. NSKBL is now stored in kernel_boot_loader.self segment 3 instead of SKBL .text, and loaded (ARZL-compressed) at 0x50000000.

Changed the early boot stack base addresses from 0x500Ex000 to 0x400ExC00. Undef/Abort/IRQ/FIQ stack are no longer separated.

Resuming on Kermit ES1 is no longer supported (sceKernelAssert(0)).

0.995 Unknown.
0.996 Changed SKBL base physical address to 0x40020000 from 0x40040000.
3.36 Unknown
3.50 Initial stack base changed (+ 0x100).

Something in the function has changed (see function at: 3.50:0x40020438).

Removed some register writing (see function at: 3.36:0x4002066c/3.50:0x40020668).

Common

These functions are at different offsets than those of SceTzs modules.

Offsets are relative to SKBL text segment base address. See Secure DRAM.

SceKernelModulemgr

sceKernelLoadStartModule

Version offset mode
3.60 0x20B0 thumb
typedef struct SceTzsModule {
	const void *pModule;
	const void *pModuleEnd;
} SceTzsModule;

int sceKernelLoadStartModule(SceTzsModule *pModule, void *argp);

get_module_object

Version offset mode
3.60 0x2350 thumb
SceModuleObject *get_module_object(SceUID modid);

sceKernelLoadModuleWithBuffer

Version offset mode
3.60 0x2494 thumb
SceUID sceKernelLoadModuleWithBuffer(const void *pModule, SceSize size);

sceKernelStartModuleForPid

Version offset mode
3.60 0x25BC thumb
int sceKernelStartModuleForPid(SceUID pid, SceUID modid, SceSize args, void *argp, int flags, SceKernelLMOption *option, int *status);

sceKernelStartModule

Version offset mode
3.60 0x2710 thumb
int sceKernelStartModule(SceUID modid, SceSize args, void *argp, int flags, SceKernelLMOption *option, int *status);

get_module_bootstart

Version offset mode
3.60 0x2744 thumb
int get_module_bootstart(SceUID modid, void *entry);

print_module_load_info

Version offset mode
3.60 0x2A70 thumb

resolve_import_function

Version offset mode
3.60 0x4748 thumb

SceExcpmgr

excp_handler

Version offset mode
3.60 0x4A3C thumb

sceExcpmgrRegisterHandler

Version offset mode
3.60 0x4A70 thumb

SceExcpmgr_module_start

Version offset mode
3.60 0x4CB4 thumb

SceSysmem

SceSysmem_NS_0x8100156C

Version offset mode
3.60 0x6EC0 thumb

sceGUIDReferObjectWithClass

Version offset mode
3.60 0x9DF8 thumb
int sceGUIDReferObjectWithClass(SceUID uid, SceClass *pClass, SceKernelObject **ppEntry);

sceKernelUidRelease

Version offset mode
3.60 0x9E60 thumb
int sceKernelUidRelease(SceUID uid);

sceKernelIsColdBoot

Version offset mode
3.60 0x14904 thumb
int sceKernelIsColdBoot(void);

memcpy

Version offset mode
3.60 0x15920 thumb

See SceSysmem.

memset

Version offset mode
3.60 0x15A30 thumb

See SceSysmem.

sceKernelL1CacheInvalidateEntire

Version offset mode
3.60 0x16480 thumb

See SceSysmem.

sceKernelL1IcacheInvalidateRange

Version offset mode
3.60 0x164A0 thumb

See SceSysmem.

sceKernelL1DcacheCleanRange

Version offset mode
3.60 0x1650C thumb

See SceSysmem.

sceKernelL1DcacheCleanInvalidateRange

Version offset mode
3.60 0x1652C thumb

See SceSysmem.

sceKernelDcacheCleanRange

Version offset mode
3.60 0x16E60 thumb

See SceSysmem.

sceKernelDcacheCleanRangeForL1WBWA

Version offset mode
3.60 0x16E54 thumb

See SceSysmem.

sceKernelCorelockContextInitialize

Version offset mode
3.60 0x16A80 thumb
typedef struct SceCorelockContext {
	int lock;
	int16_t core_count;
	int16_t last_wait_core; // 0:core3, 1:core0, 2:core1, 3:core2
} SceCorelockContext;

void sceKernelCorelockContextInitialize(SceCorelockContext *ctx);

sceKernelCorelockLock

Version offset mode
3.60 0x16A8C thumb
void sceKernelCorelockLock(SceCorelockContext *ctx, int core);

sceKernelCorelockUnlock

Version offset mode
3.60 0x16AC0 thumb
void sceKernelCorelockUnlock(SceCorelockContext *ctx);

sceKernelDomainTextMemcpy

Version offset mode
3.60 0x16E90 thumb

See SceSysmem.

sceKernelVAtoPA

Version offset mode
3.60 0x179E0 thumb

See SceSysmem.

SceSkbl

sceArlzDecode

Version Offset Mode
0.931 0x31E10 ARM
0.990 0x2BF50 ARM
3.60 0x183A8 ARM

Decodes an ARZL encoded buffer stored at src, of size size and writes result to dst. Source must point to just after "ARZL" magic.

Returns written size.

SceSSize sceArlzDecode(void *dst_start, SceSize dst_max_size, const void *src, void **dst_end);

sceArlzArmFilter

Version Offset Mode
0.931 0x32620 ARM
0.990 0x2C760 ARM
3.60 0x18E24 ARM

Returns actual size of decoded ARZL data coming from #sceArlzDecode.

SceSSize sceArlzArmFilter(void *data, SceSize size, SceUInt32 version);