Fix 9: dmaFail and kern_pattern_scan again

This commit is contained in:
khanhduytran0
2026-06-01 14:41:16 +07:00
parent 090468ffa4
commit 6e2a71848b
+125 -145
View File
@@ -334,13 +334,13 @@ __int64 __fastcall sub_228E4(const char *a1, const char *a2, char a3);
__int64 __fastcall sub_22ADC(const char *a1, const char *a2);
bool __fastcall sub_22CA8(bool *a1);
__int64 __fastcall nullsub_2(_QWORD); // weak
__int64 __fastcall sub_22D6C(struct_krwCtx *a1, __int64 a2, int a3);
__int64 __fastcall sub_23348(__int64 a1, int a2);
__int64 __fastcall sub_23424(struct_krwCtx *a1);
bool __fastcall sub_236A4(struct_krwCtx *a1, __int64 a2, _OWORD *a3);
__int64 __fastcall sub_23700(__int64 a1, __int64 a2);
__int64 __fastcall sub_23760(struct_krwCtx *a1, __int64 a2);
__int64 __fastcall sub_2385C(struct_krwCtx *a1, __int64 a2);
__int64 __fastcall dmaFail_physwrite32(struct_krwCtx *a1, __int64 a2, int a3);
__int64 __fastcall dmaFail_set_power_state(__int64 a1, int a2);
__int64 __fastcall dmaFail_gfx_power_init(struct_krwCtx *a1);
bool __fastcall dmaFail_map_dbgwrap(struct_krwCtx *a1, __int64 a2, _OWORD *a3);
__int64 __fastcall dmaFail_phystokv_cached(__int64 a1, __int64 a2);
__int64 __fastcall dmaFail_dbgwrap_halt_cpu(struct_krwCtx *a1, __int64 a2);
__int64 __fastcall dmaFail_dbgwrap_unhalt_cpu(struct_krwCtx *a1, __int64 a2);
__int64 __fastcall sub_23940(struct_krwCtx *a1, __int64 a2);
__int64 __fastcall sub_239D8(struct_krwCtx *a1, _QWORD *a2, _DWORD *a3, _QWORD *a4, _DWORD *a5, int a6);
void __fastcall sub_23D30(__int64 a1, char a2);
@@ -436,7 +436,7 @@ __int64 __fastcall sub_2ADB4(__int64 a1);
__int64 __fastcall sub_2B03C(__int64 a1);
__int64 __fastcall sub_2B0E8(struct_krwCtx *krwCtx, unsigned __int64 vaddr, __int64 a3);
void __fastcall physwrite64_maybe(struct_krwCtx *krwCtx, unsigned __int64 paddr, __int64 value_1);
__int64 __fastcall physwritebuf_ppl_MAYBENOTSURE(__int64 a1, __int64 paddr, _QWORD *data, unsigned int size);
__int64 __fastcall dmaFail_physwritebuf_ppl(__int64 a1, __int64 paddr, _QWORD *data, unsigned int size);
__int64 __fastcall sub_2B5BC(__int64 a1, __int64 a2);
__int64 __fastcall sub_2B788(const char **a1);
unsigned __int64 __fastcall sub_2B94C(struct_krwCtx *a1, unsigned int a2, __int64 *a3, unsigned __int8 a4, unsigned __int64 *a5);
@@ -591,11 +591,11 @@ unsigned __int64 __fastcall sub_38544(__int64 a1, __int64 a2, __int64 a3, unsign
__int64 __fastcall sub_385F4(struct_krwCtx *a1, unsigned __int64 a2);
__int64 __fastcall sub_386AC(struct_krwCtx *a1, unsigned __int64 a2);
__int64 __fastcall sub_38764(__int64 a1);
__int64 __fastcall sub_38870(struct_krwCtx *krwCtx, unsigned __int64 paddr, __int64 a3);
double __fastcall sub_38BCC(__int64 a1, __int64 a2);
__int64 __fastcall physmap_map_cached(struct_krwCtx *krwCtx, unsigned __int64 paddr, __int64 a3);
double __fastcall physmap_unmap_cached(__int64 a1, __int64 a2);
__int64 __fastcall sub_38C8C(__int64 a1, __int64 a2, __int64 a3);
void __fastcall sub_38D60(__int64 a1, unsigned __int64 a2, void *a3, unsigned int a4, int a5);
void __fastcall physwritebuf_idk_maybe(struct_krwCtx *krwCtx, unsigned __int64 paddr, const void *buf, unsigned int size, int something);
void __fastcall physwritebuf_direct_mapped(struct_krwCtx *krwCtx, unsigned __int64 paddr, const void *buf, unsigned int size, int something);
__int64 __fastcall sub_38F38(__int64 a1, __int64 a2, __int64 a3);
__int64 __fastcall sub_38F6C(__int64 a1, __int64 a2, __int16 a3);
__int64 __fastcall sub_38FAC(unsigned int);
@@ -674,6 +674,17 @@ enum
COMM_PAGE_MEMORY_SIZE_OFFSET = 0x38,
COMM_PAGE_CPUFAMILY_OFFSET = 0x80,
};
enum
{
DMAFAIL_DBGWRAP_DBGHALT = 1u << 31,
DMAFAIL_DBGWRAP_DBGACK = 1u << 28,
DMAFAIL_DMA_CTRL = 0x206140108ULL,
DMAFAIL_DMA_ENABLE = 0x206140008ULL,
DMAFAIL_DMA_DATA = 0x206150048ULL,
DMAFAIL_DMA_ADDR = 0x206150040ULL,
DMAFAIL_A15_A16_DMA_BACKUP = 0x206150020ULL,
};
void *__memcpy_chk(void *dst, const void *src, size_t len, size_t dstlen);
void *__memset_chk(void *dst, int val, size_t len, size_t dstlen);
size_t __strlcpy_chk(char *dst, const char *src, size_t len, size_t dstlen);
@@ -1317,7 +1328,7 @@ _DWORD dword_43428[10] = { 17, 4, 3, 6, 7, 5, 40, 20, 2, 42 }; // weak
__int128 xmmword_43450 = IDA_INT128_C(0x0000000000000002ULL, 0x0000000000000000ULL); // weak
__int128 xmmword_43460 = 17230332160LL; // weak
__int128 xmmword_43478 = IDA_INT128_C(0x0000000000000000ULL, 0x8000000100000000ULL); // weak
__int16 asc_43490[3] = { 7, 11, 13 }; // weak
__int16 dmaFail_sbox[3] = { 7, 11, 13 }; // weak
__int128 xmmword_43690 = IDA_INT128_C(0x0000064000000730ULL, 0x0000030000000060ULL); // weak
__int128 xmmword_436C0 = IDA_INT128_C(0x1000000000000000ULL, 0x0000000000000000ULL); // weak
unsigned int dword_436F0[4] = { 20u, 32u, 20u, 48u }; // weak
@@ -9423,7 +9434,7 @@ __int64 __fastcall sub_10214(__int64 a1, __int64 a2, unsigned __int64 a3)
if ( v14 )
return v14 | 0x80000000;
}
else if ( (unsigned int)sub_38870((struct_krwCtx *)a1, v9, (__int64)v20) )
else if ( (unsigned int)physmap_map_cached((struct_krwCtx *)a1, v9, (__int64)v20) )
{
return 0xFFFFFFFFLL;
}
@@ -9447,7 +9458,7 @@ __int64 __fastcall sub_10214(__int64 a1, __int64 a2, unsigned __int64 a3)
if ( (unsigned int)(v15 + 1) >= 2 )
vm_deallocate(mach_task_self_, address, v11);
else
sub_38BCC(a1, (__int64)v20);
physmap_unmap_cached(a1, (__int64)v20);
}
}
return v5;
@@ -11592,7 +11603,7 @@ bool __fastcall sub_13924(struct_krwCtx *a1, unsigned __int64 a2, int a3)
if ( !krw_ctx_has_flag(a1, 84934656) )
{
LABEL_22:
v8 = sub_22D6C(a1, a2, a3);
v8 = dmaFail_physwrite32(a1, a2, a3);
return v8 == 0;
}
v10 = a1->someLargeNumber;
@@ -14043,13 +14054,13 @@ LABEL_44:
{
v90 = v345 & 0xFFFFFFFFC000LL;
if ( (v345 & 0xFFFFFFFFC000LL) != 0
&& !(unsigned int)sub_38870(
&& !(unsigned int)physmap_map_cached(
(struct_krwCtx *)a1,
v88,
(__int64)(v4 + 10)) )
{
*((_QWORD *)v4 + 19) = *((_QWORD *)v4 + 5);
if ( !(unsigned int)sub_38870(
if ( !(unsigned int)physmap_map_cached(
(struct_krwCtx *)a1,
v90,
(__int64)(v4 + 24)) )
@@ -14097,7 +14108,7 @@ LABEL_67:
v41 = 0xFFFFFC0000000000LL;
else
v41 = 0xFFFFFF8000000000LL;
v1 = sub_38870((struct_krwCtx *)a1, v40, (__int64)inputStruct);
v1 = physmap_map_cached((struct_krwCtx *)a1, v40, (__int64)inputStruct);
if ( (_DWORD)v1 )
goto LABEL_27;
v42 = **(_QWORD **)inputStruct;
@@ -14106,14 +14117,14 @@ LABEL_67:
if ( !v43 )
v44 = 0xFFFFFFFFELL;
v45 = v44 & v42;
sub_38BCC(a1, (__int64)inputStruct);
physmap_unmap_cached(a1, (__int64)inputStruct);
*((_QWORD *)v4 + 33) = v45;
v46 = sub_18B14((struct_krwCtx *)a1, v45);
*((_QWORD *)v4 + 31) = v46;
v47 = 163855;
if ( !v46 )
goto LABEL_370;
v1 = sub_38870((struct_krwCtx *)a1, *((_QWORD *)v4 + 33), (__int64)inputStruct);
v1 = physmap_map_cached((struct_krwCtx *)a1, *((_QWORD *)v4 + 33), (__int64)inputStruct);
if ( (_DWORD)v1 )
goto LABEL_27;
v48 = *(__int64 **)inputStruct;
@@ -14128,7 +14139,7 @@ LABEL_67:
*((_QWORD *)v4 + 40) = v51;
*((_QWORD *)v4 + 36) = *v48;
*((_QWORD *)v4 + 35) = v48[7];
sub_38BCC(a1, (__int64)inputStruct);
physmap_unmap_cached(a1, (__int64)inputStruct);
v52 = *((_QWORD *)v4 + 33);
v53 = *((_QWORD *)v4 + 39);
v54 = *(unsigned int *)(a1 + 384);
@@ -14150,7 +14161,7 @@ LABEL_81:
v57 = v53 / v54;
while ( 1 )
{
v58 = sub_38870((struct_krwCtx *)a1, v52 + v56 * *(unsigned int *)(a1 + 384), (__int64)src_address);
v58 = physmap_map_cached((struct_krwCtx *)a1, v52 + v56 * *(unsigned int *)(a1 + 384), (__int64)src_address);
if ( (_DWORD)v58 )
break;
v59 = *(unsigned int *)(a1 + 384);
@@ -14318,7 +14329,7 @@ LABEL_213:
*((_BYTE *)&v344[-2] + (v103 - v102) / v106) = -1;
goto LABEL_169;
}
if ( (unsigned int)sub_38870((struct_krwCtx *)a1, v104, (__int64)inputStruct) )
if ( (unsigned int)physmap_map_cached((struct_krwCtx *)a1, v104, (__int64)inputStruct) )
{
LABEL_212:
free(v99);
@@ -14327,7 +14338,7 @@ LABEL_212:
v105 = *(unsigned int *)(a1 + 384);
if ( !memcmp(*(const void **)inputStruct, v99, v105) )
*((_BYTE *)&v344[-2] + (v103 - v102) / v105) = 1;
sub_38BCC(a1, (__int64)inputStruct);
physmap_unmap_cached(a1, (__int64)inputStruct);
v106 = *(unsigned int *)(a1 + 384);
LABEL_169:
v103 += v106;
@@ -14809,7 +14820,7 @@ LABEL_382:
v236 = 832;
else
v236 = 848;
v1 = sub_38870((struct_krwCtx *)a1, 0x23B080000uLL, (__int64)inputStruct);
v1 = physmap_map_cached((struct_krwCtx *)a1, 0x23B080000uLL, (__int64)inputStruct);
if ( (_DWORD)v1 )
goto LABEL_431;
v303 = *(_QWORD *)inputStruct;
@@ -14989,7 +15000,7 @@ LABEL_428:
{
v1 = 0;
LABEL_430:
sub_38BCC(a1, (__int64)inputStruct);
physmap_unmap_cached(a1, (__int64)inputStruct);
goto LABEL_431;
}
if ( (v280 & 1) == 0 )
@@ -15702,7 +15713,7 @@ __int64 __fastcall sub_18FCC(struct_krwCtx *a1, unsigned __int64 a2, _QWORD *a3)
v6 = sub_18EA4((__int64)a1, a2, 0, 0);
if ( !v6 )
return 163855;
result = sub_38870(a1, v6, (__int64)(a3 + 3));
result = physmap_map_cached(a1, v6, (__int64)(a3 + 3));
if ( !(_DWORD)result )
{
*a3 = a3[3];
@@ -15747,7 +15758,7 @@ LABEL_11:
v11 = v12;
if ( (_DWORD)v12 )
goto LABEL_11;
v11 = sub_38870(a1, v8, a3);
v11 = physmap_map_cached(a1, v8, a3);
if ( (_DWORD)v11 )
goto LABEL_11;
return v11;
@@ -17265,7 +17276,7 @@ __int64 __fastcall sub_1AADC(__int64 a1, __int64 a2)
qword_480B0,
1,
&v77);
result = sub_38870(*(struct_krwCtx **)(*(_QWORD *)a1 + 32LL), v75, a2 + 40);
result = physmap_map_cached(*(struct_krwCtx **)(*(_QWORD *)a1 + 32LL), v75, a2 + 40);
**(_QWORD **)(a2 + 40) = 0;
return result;
}
@@ -17318,7 +17329,7 @@ __int64 __fastcall sub_1B158(__int64 a1, __int64 a2)
kwrite64_via_kwritebuf(*(_QWORD *)a1, v4 + 72, *(_QWORD *)(a2 + 24));
kwrite64_via_kwritebuf(*(_QWORD *)a1, v4, *(_QWORD *)(a2 + 32));
sub_10708(*(_QWORD *)a1, v4 + 156, 0);
v5 = sub_38BCC(*(_QWORD *)(*(_QWORD *)a1 + 32LL), a2 + 40);
v5 = physmap_unmap_cached(*(_QWORD *)(*(_QWORD *)a1 + 32LL), a2 + 40);
v7 = *(_QWORD *)(a2 + 8);
v8 = 0x4000;
(*(void (__fastcall **)(_QWORD, __int64, __int64, __int64 *, double))(**(_QWORD **)(a1 + 8) + 8LL))(
@@ -19209,20 +19220,16 @@ __int64 __fastcall sub_1DE40(__int64 *a1, __int64 a2, __int64 a3, __int64 a4, in
int len; // w22
int last; // w22
int i; // w10
int fallback_shift; // w26
unsigned __int64 page_mask; // x28
unsigned int align_mask; // w8
unsigned __int64 mapped; // x8
unsigned __int64 mapped_size; // x1
unsigned __int64 mapped_end; // x26
unsigned __int64 cursor; // x22
unsigned __int64 initial_cursor; // x25
unsigned __int64 last_prefetched; // x9
unsigned __int64 vm_addr; // x8
unsigned __int64 candidate; // x10
__int16 *pattern; // x23
__int16 pat_byte; // w10
unsigned char shift[256]; // [xsp+30h] [xbp-160h]
__int64 scan_range[3]; // [xsp+10h] [xbp-180h] BYREF
sub_197A8_result v31; // x0,x1
@@ -19246,23 +19253,6 @@ __int64 __fastcall sub_1DE40(__int64 *a1, __int64 a2, __int64 a3, __int64 a4, in
return 0;
}
memset(shift, (unsigned char)len, sizeof(shift));
for ( i = 0; i < len - 1; ++i )
{
int distance = len - 1 - i;
pat_byte = pattern[i];
if ( pat_byte == -1 )
{
memset(shift, (unsigned char)distance, sizeof(shift));
}
else
{
shift[(unsigned char)pat_byte] = (unsigned char)distance;
}
}
fallback_shift = (signed char)shift[(unsigned char)pattern[last]];
shift[(unsigned char)pattern[last]] = 0;
scan_range[0] = a1[0];
scan_range[1] = a1[1];
scan_range[2] = a1[2];
@@ -19272,51 +19262,38 @@ __int64 __fastcall sub_1DE40(__int64 *a1, __int64 a2, __int64 a3, __int64 a4, in
if ( !mapped || !mapped_size )
return 0;
initial_cursor = mapped + last;
mapped_end = mapped + mapped_size;
if ( initial_cursor >= mapped_end )
if ( mapped_size < (unsigned int)len )
return 0;
page_mask = (unsigned __int64)-(int)*(_DWORD *)(*a1 + 56);
align_mask = a5 ? (unsigned int)(a5 - 1) : 0;
last_prefetched = 0;
cursor = initial_cursor;
while ( cursor < mapped_end )
cursor = mapped;
while ( cursor <= mapped_end - (unsigned int)len )
{
unsigned int step;
unsigned __int64 touch;
if ( ((last_prefetched ^ cursor) & page_mask) != 0 )
touch = cursor + (unsigned int)last;
if ( ((last_prefetched ^ touch) & page_mask) != 0 )
{
sub_19AC4(*a1, cursor, 1u, mapped_end - cursor);
last_prefetched = cursor;
sub_19AC4(*a1, touch, 1u, mapped_end - touch);
last_prefetched = touch;
}
step = shift[*(unsigned __int8 *)cursor];
cursor += step;
if ( cursor >= mapped_end )
return 0;
if ( step )
continue;
for ( i = last; ; --i )
vm_addr = a1[1] + cursor - mapped;
if ( !align_mask || (vm_addr & align_mask) == 0 )
{
pat_byte = pattern[i];
if ( pat_byte != -1 && *(unsigned __int8 *)(cursor - (last - i)) != (unsigned __int8)pat_byte )
break;
if ( i == 0 )
for ( i = 0; i < len; ++i )
{
candidate = cursor - last;
vm_addr = a1[1] + candidate - mapped;
if ( !align_mask || (vm_addr & align_mask) == 0 )
{
if ( !vm_addr )
return 0;
return vm_addr + a4;
}
break;
pat_byte = pattern[i];
if ( pat_byte != -1 && *(unsigned __int8 *)(cursor + i) != (unsigned __int8)pat_byte )
break;
}
if ( i == len )
return vm_addr ? vm_addr + a4 : 0;
}
cursor += fallback_shift;
++cursor;
}
return 0;
}
@@ -23335,8 +23312,9 @@ bool __fastcall sub_22CA8(bool *a1)
return result;
}
// dmaFail cluster: this maps to Dopamine's dmaFail.c DMA-backed PPL physical write path.
//----- (0000000000022D6C) ----------------------------------------------------
__int64 __fastcall sub_22D6C(struct_krwCtx *a1, __int64 a2, int a3)
__int64 __fastcall dmaFail_physwrite32(struct_krwCtx *a1, __int64 a2, int a3)
{
__int64 v6; // x23
char v7; // w25
@@ -23411,32 +23389,32 @@ __int64 __fastcall sub_22D6C(struct_krwCtx *a1, __int64 a2, int a3)
v8 = 0x3FFFFF;
}
v9 = 708642;
if ( (unsigned int)sub_23348((__int64)a1, 1) )
if ( (unsigned int)dmaFail_set_power_state((__int64)a1, 1) )
{
v10 = sub_23424(a1);
v10 = dmaFail_gfx_power_init(a1);
if ( (_DWORD)v10 )
{
LABEL_85:
sub_25164((__int64)a1, 4u);
return v10;
}
if ( (unsigned int)sub_38870(a1, v6 | 0x140000, (__int64)v49) )
if ( (unsigned int)physmap_map_cached(a1, v6 | 0x140000, (__int64)v49) )
{
v10 = 708642;
goto LABEL_85;
}
if ( (unsigned int)sub_38870(a1, v6 | 0x150000, (__int64)v50) )
if ( (unsigned int)physmap_map_cached(a1, v6 | 0x150000, (__int64)v50) )
{
v11 = v49;
LABEL_84:
sub_38BCC((__int64)a1, (__int64)v11);
physmap_unmap_cached((__int64)a1, (__int64)v11);
v10 = v9;
goto LABEL_85;
}
if ( !sub_236A4(a1, v6, v48) )
if ( !dmaFail_map_dbgwrap(a1, v6, v48) )
{
LABEL_83:
sub_38BCC((__int64)a1, (__int64)v49);
physmap_unmap_cached((__int64)a1, (__int64)v49);
v11 = v50;
goto LABEL_84;
}
@@ -23456,7 +23434,7 @@ LABEL_83:
v39 = 0;
v40 = 0;
}
v16 = sub_23700((__int64)a1, a2 & 0xFFFFFFFFFFFFFFC0LL);
v16 = dmaFail_phystokv_cached((__int64)a1, a2 & 0xFFFFFFFFFFFFFFC0LL);
if ( v16 )
{
v47 = v42 | 0x8000000000000000LL;
@@ -23497,7 +23475,7 @@ LABEL_72:
v56[1] = v54;
*(_DWORD *)((char *)v55 + v21) = a3;
LABEL_30:
if ( !(unsigned int)sub_23760(a1, (__int64)v48) )
if ( !(unsigned int)dmaFail_dbgwrap_halt_cpu(a1, (__int64)v48) )
goto LABEL_72;
*(_QWORD *)(v12 + 264) |= 0x8000000000000001LL;
while ( (~*(_QWORD *)(v12 + 264) & 0x8000000000000001LL) != 0 )
@@ -23516,7 +23494,7 @@ LABEL_30:
while ( v22 != 64 );
v23 = 0;
v24 = 0;
v25 = asc_43490;
v25 = dmaFail_sbox;
do
{
for ( i = 0; i != 32; ++i )
@@ -23531,7 +23509,7 @@ LABEL_30:
v46 = v19;
v27 = 0;
v28 = 0;
v29 = asc_43490;
v29 = dmaFail_sbox;
do
{
for ( j = 0; j != 32; ++j )
@@ -23587,7 +23565,7 @@ LABEL_74:
*(_QWORD *)(v12 + 264) &= v47;
while ( (*(_QWORD *)(v12 + 264) & 0x8000000000000001LL) != 0 )
sub_2AABC((__int64)a1, 0x64u);
if ( (sub_2385C(a1, (__int64)v48) & 1) == 0 )
if ( (dmaFail_dbgwrap_unhalt_cpu(a1, (__int64)v48) & 1) == 0 )
goto LABEL_74;
v19 = v46 + 1;
if ( v46 == 15 )
@@ -23606,7 +23584,7 @@ LABEL_76:
if ( (v37 & 1) == 0 )
{
LABEL_82:
sub_38BCC((__int64)a1, (__int64)v48);
physmap_unmap_cached((__int64)a1, (__int64)v48);
goto LABEL_83;
}
}
@@ -23614,15 +23592,15 @@ LABEL_82:
{
goto LABEL_82;
}
sub_2385C(a1, (__int64)v48);
dmaFail_dbgwrap_unhalt_cpu(a1, (__int64)v48);
goto LABEL_82;
}
return v9;
}
// 43490: using guessed type __int16 asc_43490[3];
// 43490: using guessed type __int16 dmaFail_sbox[3];
//----- (0000000000023348) ----------------------------------------------------
__int64 __fastcall sub_23348(__int64 a1, int a2)
__int64 __fastcall dmaFail_set_power_state(__int64 a1, int a2)
{
__int64 v3; // x8
__int64 v4; // x20
@@ -23660,7 +23638,7 @@ __int64 __fastcall sub_23348(__int64 a1, int a2)
}
//----- (0000000000023424) ----------------------------------------------------
__int64 __fastcall sub_23424(struct_krwCtx *a1)
__int64 __fastcall dmaFail_gfx_power_init(struct_krwCtx *a1)
{
unsigned __int64 v1; // d8
unsigned __int64 v2; // d9
@@ -23709,7 +23687,7 @@ LABEL_7:
if ( !krw_ctx_has_flag(a1, 0x4000) && !krw_ctx_has_flag(a1, 1) )
return 708642;
LABEL_10:
if ( (unsigned int)sub_38870(a1, v4, (__int64)v16) )
if ( (unsigned int)physmap_map_cached(a1, v4, (__int64)v16) )
return 708642;
v9 = 520102911;
if ( !krw_ctx_has_flag(a1, 0x1000000) )
@@ -23748,7 +23726,7 @@ LABEL_10:
if ( !krw_ctx_has_flag(a1, 1) )
{
v8 = 708642;
sub_38BCC((__int64)a1, (__int64)v16);
physmap_unmap_cached((__int64)a1, (__int64)v16);
return v8;
}
v11 = (unsigned int)number_of_cpus() == 8;
@@ -23772,14 +23750,14 @@ LABEL_33:
;
sub_2AABC((__int64)a1, 0x3E8u);
}
sub_38BCC((__int64)a1, (__int64)v16);
physmap_unmap_cached((__int64)a1, (__int64)v16);
return 0;
}
// 23600: variable 'v2' is possibly undefined
// 23604: variable 'v1' is possibly undefined
//----- (00000000000236A4) ----------------------------------------------------
bool __fastcall sub_236A4(struct_krwCtx *a1, __int64 a2, _OWORD *a3)
bool __fastcall dmaFail_map_dbgwrap(struct_krwCtx *a1, __int64 a2, _OWORD *a3)
{
int v5; // w21
@@ -23787,14 +23765,14 @@ bool __fastcall sub_236A4(struct_krwCtx *a1, __int64 a2, _OWORD *a3)
a3[3] = 0u;
*a3 = 0u;
a3[1] = 0u;
v5 = sub_38870(a1, a2 + 0x40000, (__int64)a3);
v5 = physmap_map_cached(a1, a2 + 0x40000, (__int64)a3);
if ( v5 )
sub_38BCC((__int64)a1, (__int64)a3);
physmap_unmap_cached((__int64)a1, (__int64)a3);
return v5 == 0;
}
//----- (0000000000023700) ----------------------------------------------------
__int64 __fastcall sub_23700(__int64 a1, __int64 a2)
__int64 __fastcall dmaFail_phystokv_cached(__int64 a1, __int64 a2)
{
int v4; // w0
_BYTE v6[32]; // [xsp+8h] [xbp-38h] BYREF
@@ -23809,7 +23787,7 @@ __int64 __fastcall sub_23700(__int64 a1, __int64 a2)
// 2372C: variable 'v4' is possibly undefined
//----- (0000000000023760) ----------------------------------------------------
__int64 __fastcall sub_23760(struct_krwCtx *a1, __int64 a2)
__int64 __fastcall dmaFail_dbgwrap_halt_cpu(struct_krwCtx *a1, __int64 a2)
{
__int64 v4; // x21
unsigned __int64 v6; // d0
@@ -23836,14 +23814,14 @@ __int64 __fastcall sub_23760(struct_krwCtx *a1, __int64 a2)
}
}
if ( *(_BYTE *)(a2 + 56) )
sub_2385C(a1, a2);
dmaFail_dbgwrap_unhalt_cpu(a1, a2);
return 0;
}
// 23808: variable 'v6' is possibly undefined
// 2380C: variable 'v7' is possibly undefined
//----- (000000000002385C) ----------------------------------------------------
__int64 __fastcall sub_2385C(struct_krwCtx *a1, __int64 a2)
__int64 __fastcall dmaFail_dbgwrap_unhalt_cpu(struct_krwCtx *a1, __int64 a2)
{
unsigned __int64 v4; // x21
unsigned __int64 v5; // d0
@@ -28211,15 +28189,17 @@ LABEL_29:
v3 = 708609;
if ( v23 )
{
sub_19D10(v23, &v37);
*((_QWORD *)&v37 + 1) = *((_QWORD *)&v37 + 1) + v38 - 0x20000;
*(_QWORD *)&v38 = 0x20000;
v29 = v37;
*(_QWORD *)&v30 = 0x20000;
v24 = kernel_pattern_scan((__int64)&v29, "E8 0B 80 52", 0);
uint64_t text_range[3];
uint64_t scan_range[3];
sub_19D10(v23, text_range);
scan_range[0] = text_range[0];
scan_range[1] = text_range[1] + text_range[2] - 0x20000;
scan_range[2] = 0x20000;
v24 = kernel_pattern_scan4((__int64)scan_range, "E8 0B 80 52", 0, 1);
if ( !v24 )
return 708625;
v25 = (unsigned __int16)((unsigned int)sub_19ACC((__int64 *)v37, (__int64 *)(v24 - 8)) >> 5);
v25 = (unsigned __int16)((unsigned int)sub_19ACC((__int64 *)text_range[0], (__int64 *)(v24 - 8)) >> 5);
if ( (unsigned int)(v25 - 1) >= 0xBFF )
return 163857;
*((_DWORD *)v6 + 14) = v25;
@@ -28605,7 +28585,7 @@ LABEL_64:
if ( v28 )
{
v65 = v28 + 1;
physwritebuf_idk_maybe(a1, v41 + 52, &v65, 4u, 0);
physwritebuf_direct_mapped(a1, v41 + 52, &v65, 4u, 0);
v5 = v46;
if ( (_DWORD)v46 )
goto LABEL_66;
@@ -28616,11 +28596,11 @@ LABEL_64:
v47 = 2;
}
v66 = v47;
physwritebuf_idk_maybe(a1, v41 + 56, &v66, 4u, 0);
physwritebuf_direct_mapped(a1, v41 + 56, &v66, 4u, 0);
v5 = v52;
if ( !(_DWORD)v52 )
{
physwritebuf_idk_maybe(a1, v60 + 24, &v70, a1->int168, 0);
physwritebuf_direct_mapped(a1, v60 + 24, &v70, a1->int168, 0);
v5 = v53;
if ( !(_DWORD)v53 )
{
@@ -28921,7 +28901,7 @@ LABEL_45:
v33 = v32 + (v22 & ~qword188);
__dsb(0xBu);
v49 = v33 - 16;
physwritebuf_idk_maybe(krwCtx, *(_QWORD *)&krwCtx->gap42[40], &v49, 8u, 0);
physwritebuf_direct_mapped(krwCtx, *(_QWORD *)&krwCtx->gap42[40], &v49, 8u, 0);
v5 = v34;
if ( !(_DWORD)v34 )
{
@@ -28943,7 +28923,7 @@ LABEL_45:
{
v36 = 708642;
}
physwritebuf_idk_maybe(krwCtx, *(_QWORD *)&krwCtx->gap42[40], old_stateCnt, 8u, 0);
physwritebuf_direct_mapped(krwCtx, *(_QWORD *)&krwCtx->gap42[40], old_stateCnt, 8u, 0);
if ( v36 )
v39 = v36;
else
@@ -29307,7 +29287,7 @@ __int64 __fastcall sub_2A0D8(struct_krwCtx *a1, __int64 a2, __int64 a3)
sub_2183C((__int64)a1, a2 & ~a1->qword188, (__int64)v11);
if ( !v6 )
return 0;
v7 = sub_38870(a1, v12 & 0xFFFFFFFFC000LL, (__int64)v13);
v7 = physmap_map_cached(a1, v12 & 0xFFFFFFFFC000LL, (__int64)v13);
v8 = *(_QWORD *)&v13[0];
if ( v7 )
{
@@ -29320,7 +29300,7 @@ __int64 __fastcall sub_2A0D8(struct_krwCtx *a1, __int64 a2, __int64 a3)
v9 = 1;
if ( v8 )
LABEL_7:
sub_38BCC((__int64)a1, (__int64)v13);
physmap_unmap_cached((__int64)a1, (__int64)v13);
return v9;
}
// 2A11C: variable 'v6' is possibly undefined
@@ -30209,9 +30189,9 @@ __int64 __fastcall sub_2B0E8(struct_krwCtx *krwCtx, unsigned __int64 vaddr, __in
}
v32 = 0;
if ( krwCtx->someLargeNumber >= 0x27120F04B00003LL && (krwCtx->flags & 0x20) != 0 )
physwritebuf_idk_maybe(krwCtx, paddr_1, &v32, 4u, 0);
physwritebuf_direct_mapped(krwCtx, paddr_1, &v32, 4u, 0);
else
v23 = physwritebuf_ppl_MAYBENOTSURE((__int64)krwCtx, paddr_1, &v32, 4u);
v23 = dmaFail_physwritebuf_ppl((__int64)krwCtx, paddr_1, &v32, 4u);
v9 = v23;
if ( !(_DWORD)v23 )
{
@@ -30249,13 +30229,13 @@ void __fastcall physwrite64_maybe(struct_krwCtx *krwCtx, unsigned __int64 paddr,
value = value_1;
if ( krwCtx->someLargeNumber >= 0x27120F04B00003LL && (krwCtx->flags & 0x20) != 0 )
physwritebuf_idk_maybe(krwCtx, paddr, &value, 8u, 0);
physwritebuf_direct_mapped(krwCtx, paddr, &value, 8u, 0);
else
physwritebuf_ppl_MAYBENOTSURE((__int64)krwCtx, paddr, &value, 8u);
dmaFail_physwritebuf_ppl((__int64)krwCtx, paddr, &value, 8u);
}
//----- (000000000002B4C8) ----------------------------------------------------
__int64 __fastcall physwritebuf_ppl_MAYBENOTSURE(__int64 a1, __int64 paddr, _QWORD *data, unsigned int size)
__int64 __fastcall dmaFail_physwritebuf_ppl(__int64 a1, __int64 paddr, _QWORD *data, unsigned int size)
{
vm_size_t v4; // x19
__int64 result; // x0
@@ -34711,7 +34691,7 @@ LABEL_442:
if ( !(_QWORD)v181 )
goto LABEL_446;
LABEL_445:
sub_38BCC(v2, (__int64)&v181);
physmap_unmap_cached(v2, (__int64)&v181);
goto LABEL_446;
}
}
@@ -34817,7 +34797,7 @@ LABEL_467:
sub_2183C(v2, (v209 + 16) & ~*(_QWORD *)(v2 + 392), (__int64)__src);
if ( v107 )
{
size_4a = sub_38870((struct_krwCtx *)v2, v180 & 0xFFFFFFFFC000LL, (__int64)&v181);
size_4a = physmap_map_cached((struct_krwCtx *)v2, v180 & 0xFFFFFFFFC000LL, (__int64)&v181);
if ( size_4a )
goto LABEL_442;
LOWORD(name[0]) = 0;
@@ -34942,7 +34922,7 @@ LABEL_361:
v119 = 163878;
goto LABEL_362;
}
size_4a = sub_38870((struct_krwCtx *)v2, v180 & 0xFFFFFFFFC000LL, (__int64)&v181);
size_4a = physmap_map_cached((struct_krwCtx *)v2, v180 & 0xFFFFFFFFC000LL, (__int64)&v181);
if ( size_4a )
goto LABEL_363;
v148 = 0;
@@ -34964,11 +34944,11 @@ LABEL_361:
if ( v87 != v148 )
{
if ( *(_QWORD *)name )
sub_38BCC(v2, (__int64)name);
physmap_unmap_cached(v2, (__int64)name);
sub_2183C(v2, v87, (__int64)__src);
if ( !v91 )
goto LABEL_361;
size_4a = sub_38870((struct_krwCtx *)v2, v180 & 0xFFFFFFFFC000LL, (__int64)name);
size_4a = physmap_map_cached((struct_krwCtx *)v2, v180 & 0xFFFFFFFFC000LL, (__int64)name);
if ( size_4a )
goto LABEL_363;
}
@@ -35038,7 +35018,7 @@ LABEL_363:
}
v33 = sizea;
if ( *(_QWORD *)name )
sub_38BCC(v2, (__int64)name);
physmap_unmap_cached(v2, (__int64)name);
if ( (_QWORD)v181 )
goto LABEL_445;
LABEL_446:
@@ -40810,7 +40790,7 @@ __int64 __fastcall sub_38158(struct_krwCtx *a1, __int64 a2, int a3, int a4, __in
}
else
{
physwritebuf_idk_maybe(a1, v15 + a2, &v29, a1->int168, 1);
physwritebuf_direct_mapped(a1, v15 + a2, &v29, a1->int168, 1);
v9 = v17;
if ( !(_DWORD)v17 )
{
@@ -40818,13 +40798,13 @@ __int64 __fastcall sub_38158(struct_krwCtx *a1, __int64 a2, int a3, int a4, __in
if ( !a4
|| *(_DWORD *)(v14 + v26) <= 3u
&& (v18 = v25, *(_DWORD *)(v14 + v25) <= 0xB71B00u)
&& (v23 = 1, physwritebuf_idk_maybe(a1, v26 + a2, &v23, 4u, 1), v9 = v19, !(_DWORD)v19)
&& (v22 = 12000000, physwritebuf_idk_maybe(a1, v18 + a2, &v22, 4u, 1), v9 = v20, !(_DWORD)v20) )
&& (v23 = 1, physwritebuf_direct_mapped(a1, v26 + a2, &v23, 4u, 1), v9 = v19, !(_DWORD)v19)
&& (v22 = 12000000, physwritebuf_direct_mapped(a1, v18 + a2, &v22, 4u, 1), v9 = v20, !(_DWORD)v20) )
{
v9 = 163857;
if ( *(unsigned __int16 *)(v14 + v24) <= 0x7Fu )
{
physwritebuf_idk_maybe(a1, v24 + a2, &v30, 2u, 1);
physwritebuf_direct_mapped(a1, v24 + a2, &v30, 2u, 1);
v9 = v21;
}
}
@@ -41090,7 +41070,7 @@ __int64 __fastcall sub_38764(__int64 a1)
}
//----- (0000000000038870) ----------------------------------------------------
__int64 __fastcall sub_38870(struct_krwCtx *krwCtx, unsigned __int64 paddr, __int64 a3)
__int64 __fastcall physmap_map_cached(struct_krwCtx *krwCtx, unsigned __int64 paddr, __int64 a3)
{
vm_size_t pageSize; // x27
int xnuMajorVersion; // w8
@@ -41227,7 +41207,7 @@ LABEL_20:
}
//----- (0000000000038BCC) ----------------------------------------------------
double __fastcall sub_38BCC(__int64 a1, __int64 a2)
double __fastcall physmap_unmap_cached(__int64 a1, __int64 a2)
{
__int64 v4; // x8
double result; // d0
@@ -41312,15 +41292,15 @@ void __fastcall sub_38D60(__int64 a1, unsigned __int64 a2, void *a3, unsigned in
}
else if ( a5
&& (*(_QWORD *)(a1 + 344) < 0x27120F04B00003uLL || (*(_BYTE *)a1 & 0x20) == 0)
&& !(unsigned int)sub_38870((struct_krwCtx *)a1, a2, (__int64)v10) )
&& !(unsigned int)physmap_map_cached((struct_krwCtx *)a1, a2, (__int64)v10) )
{
memcpy(a3, (const void *)((*(_QWORD *)(a1 + 392) & a2) + v10[0]), a4);
sub_38BCC(a1, (__int64)v10);
physmap_unmap_cached(a1, (__int64)v10);
}
}
//----- (0000000000038E4C) ----------------------------------------------------
void __fastcall physwritebuf_idk_maybe(
void __fastcall physwritebuf_direct_mapped(
struct_krwCtx *krwCtx,
unsigned __int64 paddr,
const void *buf,
@@ -41340,10 +41320,10 @@ void __fastcall physwritebuf_idk_maybe(
}
else if ( something
&& (krwCtx->someLargeNumber < 0x27120F04B00003LL || (krwCtx->flags & 0x20) == 0)
&& !(unsigned int)sub_38870(krwCtx, paddr, (__int64)v10) )
&& !(unsigned int)physmap_map_cached(krwCtx, paddr, (__int64)v10) )
{
memcpy((void *)((krwCtx->qword188 & paddr) + v10[0]), buf, size);
sub_38BCC((__int64)krwCtx, (__int64)v10);
physmap_unmap_cached((__int64)krwCtx, (__int64)v10);
}
}