diff -rupN xen-access/xen-access.c xen-access.patched/xen-access.c --- xen-access/xen-access.c 2014-03-10 06:43:57.000000000 -0400 +++ xen-access.patched/xen-access.c 2014-04-10 18:35:35.627808719 -0400 @@ -449,7 +449,7 @@ static int xenaccess_resume_page(xenacce void usage(char* progname) { fprintf(stderr, - "Usage: %s [-m] write|exec|int3\n" + "Usage: %s [-m] write|exec|int3|cr3\n" "\n" "Logs first page writes, execs, or int3 traps that occur on the domain.\n" "\n" @@ -472,6 +472,7 @@ int main(int argc, char *argv[]) int required = 0; int int3 = 0; int shutting_down = 0; + int cr3 = 0; char* progname = argv[0]; argv++; @@ -513,6 +514,10 @@ int main(int argc, char *argv[]) else if ( !strcmp(argv[0], "int3") ) { int3 = 1; + } + else if ( !strcmp(argv[0], "cr3") ) + { + cr3 = 1; } else { @@ -573,6 +578,16 @@ int main(int argc, char *argv[]) goto exit; } + if ( cr3 ) + rc = xc_set_hvm_param(xch, domain_id, HVM_PARAM_MEMORY_EVENT_CR3, HVMPME_mode_sync); + else + rc = xc_set_hvm_param(xch, domain_id, HVM_PARAM_MEMORY_EVENT_CR3, HVMPME_mode_disabled); + if ( rc < 0 ) + { + ERROR("Error %d setting cr3 mem_event\n", rc); + goto exit; + } + /* Wait for access */ for (;;) { @@ -584,7 +599,7 @@ int main(int argc, char *argv[]) rc = xc_hvm_set_mem_access(xch, domain_id, HVMMEM_access_rwx, ~0ull, 0); rc = xc_hvm_set_mem_access(xch, domain_id, HVMMEM_access_rwx, 0, xenaccess->domain_info->max_pages); rc = xc_set_hvm_param(xch, domain_id, HVM_PARAM_MEMORY_EVENT_INT3, HVMPME_mode_disabled); - + rc = xc_set_hvm_param(xch, domain_id, HVM_PARAM_MEMORY_EVENT_CR3, HVMPME_mode_disabled); shutting_down = 1; } @@ -653,6 +668,12 @@ int main(int argc, char *argv[]) rsp.gfn = req.gfn; rsp.p2mt = req.p2mt; break; + case MEM_EVENT_REASON_CR3: + printf("CR3: rip=%016"PRIx64", gfn=%"PRIx64" (vcpu %d)\n", + req.gla, + req.gfn, + req.vcpu_id); + break; case MEM_EVENT_REASON_INT3: printf("INT3: rip=%016"PRIx64", gfn=%"PRIx64" (vcpu %d)\n", req.gla,