Result jitTransitionToExecutable(Jit* j) { Result rc = 0; switch (j->type) { case JitType_CodeMemory: rc = svcMapProcessCodeMemory(envGetOwnProcessHandle(), (u64) j->rx_addr, (u64) j->src_addr, j->size); if (R_SUCCEEDED(rc)) { rc = svcSetProcessMemoryPermission(envGetOwnProcessHandle(), (u64) j->rx_addr, j->size, Perm_Rx); if (R_FAILED(rc)) { jitTransitionToWritable(j); } } break; case JitType_JitMemory: armDCacheFlush(j->rw_addr, j->size); armICacheInvalidate(j->rx_addr, j->size); break; } return rc; }
/********************************************************************************************************* ** 函数名称: armCacheV5DataUpdate ** 功能描述: 回写 D CACHE (仅回写 CPU 独享级 CACHE) ** 输 入 : pvAdrs 虚拟地址 ** stBytes 长度 ** bInv 是否为回写无效 ** 输 出 : ERROR or OK ** 全局变量: ** 调用模块: ** 注 意 : L2 cache 为统一 CACHE 所以 data update 不需要操作 L2 cache. *********************************************************************************************************/ static INT armCacheV5DataUpdate (PVOID pvAdrs, size_t stBytes, BOOL bInv) { addr_t ulEnd; if (bInv == LW_FALSE) { if (stBytes >= ARMv5_CACHE_LOOP_OP_MAX_SIZE) { armDCacheV5FlushAll(); /* 全部回写 */ } else { ARM_CACHE_GET_END(pvAdrs, stBytes, ulEnd, ARMv5_CACHE_LINE_SIZE); armDCacheFlush(pvAdrs, (PVOID)ulEnd, ARMv5_CACHE_LINE_SIZE);/* 部分回写 */ } } else { if (stBytes >= ARMv5_CACHE_LOOP_OP_MAX_SIZE) { armDCacheV5ClearAll(); /* 全部回写 */ } else { ARM_CACHE_GET_END(pvAdrs, stBytes, ulEnd, ARMv5_CACHE_LINE_SIZE); armDCacheClear(pvAdrs, (PVOID)ulEnd, ARMv5_CACHE_LINE_SIZE);/* 部分回写 */ } } return (ERROR_NONE); }
/********************************************************************************************************* ** 函数名称: armCacheV5Flush ** 功能描述: CACHE 脏数据回写 ** 输 入 : cachetype CACHE 类型 ** pvAdrs 虚拟地址 ** stBytes 长度 ** 输 出 : ERROR or OK ** 全局变量: ** 调用模块: *********************************************************************************************************/ static INT armCacheV5Flush (LW_CACHE_TYPE cachetype, PVOID pvAdrs, size_t stBytes) { addr_t ulEnd; if (cachetype == DATA_CACHE) { if (stBytes >= ARMv5_CACHE_LOOP_OP_MAX_SIZE) { armDCacheV5FlushAll(); } else { ARM_CACHE_GET_END(pvAdrs, stBytes, ulEnd, ARMv5_CACHE_LINE_SIZE); armDCacheFlush(pvAdrs, (PVOID)ulEnd, ARMv5_CACHE_LINE_SIZE);/* 部分回写 */ } } return (ERROR_NONE); }
/********************************************************************************************************* ** 函数名称: armCacheV5TextUpdate ** 功能描述: 清空(回写内存) D CACHE 无效(访问不命中) I CACHE ** 输 入 : pvAdrs 虚拟地址 ** stBytes 长度 ** 输 出 : ERROR or OK ** 全局变量: ** 调用模块: ** 注 意 : L2 cache 为统一 CACHE 所以 text update 不需要操作 L2 cache. *********************************************************************************************************/ static INT armCacheV5TextUpdate (PVOID pvAdrs, size_t stBytes) { addr_t ulEnd; if (stBytes >= ARMv5_CACHE_LOOP_OP_MAX_SIZE) { armDCacheV5FlushAll(); /* DCACHE 全部回写 */ armICacheInvalidateAll(); /* ICACHE 全部无效 */ } else { ARM_CACHE_GET_END(pvAdrs, stBytes, ulEnd, ARMv5_CACHE_LINE_SIZE); armDCacheFlush(pvAdrs, (PVOID)ulEnd, ARMv5_CACHE_LINE_SIZE); /* 部分回写 */ armICacheInvalidate(pvAdrs, (PVOID)ulEnd, ARMv5_CACHE_LINE_SIZE); } return (ERROR_NONE); }