Skip to content

Cache bug in VmmReadScatterPhysical #419

Description

@mecuryittle

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);
}
}
}
}
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions