Should only cahce 0x1000 size mem
// 5: cache put
if(fCache) {
for(i = 0; i < cpMEMsPhys; i++) {
pMEM = ppMEMsPhys[i];
tp = MEM_SCATTER_STACK_POP(pMEM);
if(fCachePut) {
// 仅完整页(cb == 0x1000)才入缓存, 与上面 cache get 路径(检查 pMEM->cb == 0x1000)对称.
// 子页读取(cb < 0x1000)时 LcReadScatter/设备只填充 pb[0..cb), pb[cb..0x1000) 保留调用前残值,
// 若直接 memcpy 0x1000 写入缓存, 会污染整页缓存项; 后续同物理地址的完整页请求命中缓存时,
// 会从 pObCacheEntry->pb 拷贝 0x1000 字节, 拿到污染区段(伪零或脏数据), 而非真实物理页内容.
if((tp == 1) && pMEM->f && (pMEM->cb == 0x1000)) { // 1 = normal read
if((pObReservedMEM = VmmCacheReserve(H, VMM_CACHE_TAG_PHYS))) {
pObReservedMEM->h.f = TRUE;
pObReservedMEM->h.qwA = pMEM->qwA;
memcpy(pObReservedMEM->h.pb, pMEM->pb, 0x1000);
VmmCacheReserveReturn(H, pObReservedMEM);
}
}
}
}
}
Should only cahce 0x1000 size mem
// 5: cache putif(fCache) {for(i = 0; i < cpMEMsPhys; i++) {pMEM = ppMEMsPhys[i];tp = MEM_SCATTER_STACK_POP(pMEM);if(fCachePut) {// 仅完整页(cb == 0x1000)才入缓存, 与上面 cache get 路径(检查 pMEM->cb == 0x1000)对称.// 子页读取(cb < 0x1000)时 LcReadScatter/设备只填充 pb[0..cb), pb[cb..0x1000) 保留调用前残值,// 若直接 memcpy 0x1000 写入缓存, 会污染整页缓存项; 后续同物理地址的完整页请求命中缓存时,// 会从 pObCacheEntry->pb 拷贝 0x1000 字节, 拿到污染区段(伪零或脏数据), 而非真实物理页内容.if((tp == 1) && pMEM->f && (pMEM->cb == 0x1000)) { // 1 = normal readif((pObReservedMEM = VmmCacheReserve(H, VMM_CACHE_TAG_PHYS))) {pObReservedMEM->h.f = TRUE;pObReservedMEM->h.qwA = pMEM->qwA;memcpy(pObReservedMEM->h.pb, pMEM->pb, 0x1000);VmmCacheReserveReturn(H, pObReservedMEM);}}}}}