1715 gKernelBootParam.revision0 = __perv_get_revision0();
1716 gKernelBootParam.revision1 = __perv_get_revision1();
1720 gKernelBootParam.pKblParam = &gKblParam;
1722#if __SCx_KBL_SECURE_BUILD
1725 if ((gKblParam.pscode.product_code & 0xFEFFu) == 1
1731 extern uint32_t g_NoCP_dipsw[8];
1732 for (
int i = 0; i < 8; i++) {
1733 gKblParam.bootsw[i] |= g_NoCP_dipsw[i];
1740#if __SCx_KBL_SECURE_BUILD
1741 if (gKblParam.boot_flags[1] == 0xFF) {
1749 if (!(gKblParam.boot_flags[4] & 0x1)) {
1753 if ((gKblParam.pscode.product_code & 0xFEFFu) == 1
1798 if ((gKernelBootParam.revision0 & 0x1FF00u) == 0u) {
1803 if ((gKernelBootParam.revision0 & 0x80000000u) == 0u) {
1815 if ((gKernelBootParam.revision0 & 0x30000000) == 0x20000000u) {
1824 if (((gKernelBootParam.revision0 & 0x1FF00u) == 0x100u)
1825 && ((gKernelBootParam.revision0 & 0x80000000u) != 0u)
1826 && ((gKernelBootParam.revision0 & 0x30000000u) == 0x20000000u))
1838 if (gKernelBootParam.pKblParam->powerInfo & 0x40)
1865 FUN_5101c43c(&FUN_51020c75, 0);
1868 DBG_KMC_PRINT(0,
"===================================================\n");
1869#if __SCx_KBL_SECURE_BUILD
1871 DBG_KMC_PRINT(0,
"Starting PSP2 Kernel Boot Loader [0x%08X]: %d\n",
1878 if (cp_bid_ver != 0) {
1879 const SceUInt16 bid = (cp_bid_ver >> 16) & 0xFFFFu;
1880 const SceUInt16 ver = (cp_bid_ver >> 0) & 0xFFFFu;
1887 const bool is_product_mode = (gKblParam.BootTypeIndicator1 & 0x4) != 0;
1888 if (is_product_mode) {
1892 if ((is_product_mode || !!(gKblParam.qaf[0xD] & 0x1)) && (gKblParam.BootTypeIndicator1 & 0x8) != 0) {
1900 gpKernelBootParam = &gKernelBootParam;
1903 gKernelBootParam.KermitRevision = kermitRevision;
1906 gKernelBootParam.pCorelock = &kbp_corelock;
1932 __ASSERT_LVL(SCx_ASSERT_LVL_1, gKernelBootParam.KermitRevision != 0);
1934#if __SCx_KBL_SECURE_BUILD
1935 const char *soc_name;
1936 if (gKblParam.qaf[0xD] & 0x1) {
1937 soc_name = ((kermitRevision & 0x1FF00u) == 0) ?
"Kermit1.0" :
"Kermit1.5";
1942 (kermitRevision & 0xF0u) >> 4, kermitRevision & 0xFu);
1944 const SceUInt32 rev = gpKernelBootParam->kermitRevision;
1951 }
else if ((rev == 0x40)
1958 || (rev == 0x115)) {
1959 const SceUInt32 revision1 = gpKernelBootParam->revision1;
1960 const bool bad_l2_cache = !!(revision1 & 0x2);
1974 for (
int i = 0; i < ARRAY_SIZE(gKblParam.bootsw); i++) {
1989#if __SCx_KBL_SECURE_BUILD
1990 const SceUInt8 *pSessionId = gKblParam.session_id;
1993 DBG_KMC_PRINT(0,
"session ID : %02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X\n",
1994 pSessionId[0], pSessionId[1], pSessionId[2], pSessionId[3],
1995 pSessionId[4], pSessionId[5], pSessionId[6], pSessionId[7],
1996 pSessionId[8], pSessionId[9], pSessionId[10], pSessionId[11],
1997 pSessionId[12], pSessionId[13], pSessionId[14], pSessionId[15]);
2001#if __SCx_KBL_SECURE_BUILD
2003 gpKernelBootParam->num_memory = 1;
2004 gpKernelBootParam->memory[0].addr = 0x40000000;
2005 gpKernelBootParam->memory[0].size = 0x02000000;
2008 gpKernelBootParam->num_memory = 3;
2009 gpKernelBootParam->memory[0].addr = 0x40200000;
2011 gpKernelBootParam->memory[0].size = 0x3fe00000;
2013 gpKernelBootParam->memory[0].size = 0x1fe00000;
2016 gpKernelBootParam->memory[1].addr = 0x20000000;
2017 gpKernelBootParam->memory[1].size = 0x08000000;
2018 gpKernelBootParam->memory[2].addr = 0x80000000;
2019 gpKernelBootParam->memory[2].size = 0x40000000;
2022 for (
int i = 0; i < gpKernelBootParam->num_memory; i++) {
2035 if ((gKernelBootParam.pKblParam->boot_flags[0] != 0xFF)
2036 || sceKernelSysrootIsSafeMode()) {
2050#if __SCx_KBL_SECURE_BUILD
2066 if ((gpKernelBootParam->KermitRevision & 0x1FFF0) == 0x30) {
2096 FUN_40042038(0xC0000);
2102 if (gpKernelBootParam->revision0 & 0x80000000u) {
2147 if (gKblParam.wakeupFactor & 0x80) {
2150 while ((*(
volatile SceUInt32*)0xe5888020) != 0x44) {
2157 while ((*(
volatile SceUInt32*)0xe5888020) != 0x11) {
2183 LongTimer *lt5 = (
void *)0xE20B6000u;
2184 lt5->configuration = 0x2F345008u;
2185 lt5->current.u.lo = 0u;
2186 lt5->current.u.hi = 0u;
2187 lt5->compare.u.lo = 0xFFFFFFFFu;
2188 lt5->compare.u.hi = 0xFFFFFFFFu;
2189 lt5->configuration = 0x2F34500Du;
2194#if __SCx_KBL_SECURE_BUILD
2195 if (DAT_4007a800 == 0) {
2202 memcpy((
void *)0x40200100, &gKblParam,
sizeof(gKblParam));
2226 gpKernelBootParam->bootCpu[cpuId].mmuContext.TTBR1 = 2;
2227 gpKernelBootParam->bootCpu[cpuId].mmuContext.DACR = 0x55555555;
2228 gpKernelBootParam->bootCpu[cpuId].mmuContext.contextid = 0xf7;
2229 sceArmSetDACR(0x55555555);
2236 for (
int i = 0; i < ARRAY_SIZE(aslr_bitmap); i++) {
2239 for (
int i = 0; i < ARRAY_SIZE(mega_aslr_bitmap); i++) {
2240 mega_aslr_bitmap[i] = 0;
2256 __set_TTBR0(
l1pt_to_ttbr(gpKernelBootParam->ttbr0.pbase));
2257 __set_TTBR1(
l1pt_to_ttbr(gpKernelBootParam->ttbr1.pbase));
2258 __set_TTBCR(gpKernelBootParam->bootCpu[cpuId].mmuContext.TTBR1);
2259 __set_DACR(0x55555555);
2260 __set_CONTEXTIDR(gpKernelBootParam->bootCpu[cpuId].mmuContext.contextid);
2270 gpKernelBootParam->resetVector = gpKernelBootParam->excpEntry.vbase + 0x100;
2272#if __SCx_KBL_SECURE_BUILD
2273 extern char MONITOR_TABLE[];
2274 const SceSize MONITOR_TABLE_SIZE = 0x34;
2283 memcpy(
ALIGN_UP(gpKernelBootParam->memory[0].addr, 0x20), MONITOR_TABLE, MONITOR_TABLE_SIZE);
2286 *(
SceUInt32*)(gpKernelBootParam->memory[0].addr + 0xA0) = 0x9E3199B7;
2291#if __SCx_KBL_SECURE_BUILD
2293 FUN_40040514(L2C_BASE);
2301#if __SCx_KBL_SECURE_BUILD
2303 FUN_40040514(L2C_BASE);
2322#if __SCx_KBL_SECURE_BUILD
2334 __set_VBAR(gpKernelBootParam->resetVector);
2335#if __SCx_KBL_SECURE_BUILD
2336 __set_MVBAR(ROUND_UP((
SceUIntPtr)gpKernelBootParam->resetVector + 0x5B, 0x20u));