On 10.07.2013, at 02:12, Scott Wood wrote: > On 07/09/2013 04:45:10 PM, Alexander Graf wrote: >> On 28.06.2013, at 11:20, Mihai Caraman wrote: >> > + /* Get page size */ >> > + if (MAS0_GET_TLBSEL(mfspr(SPRN_MAS0)) == 0) >> > + psize_shift = PAGE_SHIFT; >> > + else >> > + psize_shift = MAS1_GET_TSIZE(mas1) + 10; >> > + >> > + mas7_mas3 = (((u64) mfspr(SPRN_MAS7)) << 32) | >> > + mfspr(SPRN_MAS3); >> > + addr = (mas7_mas3 & (~0ULL << psize_shift)) | >> > + (geaddr & ((1ULL << psize_shift) - 1ULL)); >> > + >> > + /* Map a page and get guest's instruction */ >> > + page = pfn_to_page(addr >> PAGE_SHIFT); >> While looking at this I just realized that you're missing a check here. What if our IP is in some PCI BAR? Or can't we execute from those? > > We at least need to check pfn_valid() first. That'll just keep us from accessing a bad pointer in the host kernel, though -- it won't make the emulation actually work. If we need that, we'll probably need to create a temporary TLB entry manually. ioremap()? However, if we were walking the guest TLB cache instead we would get a guest physical address which we can always resolve to a host virtual address. I'm not sure how important that whole use case is though. Maybe we should just error out to the guest for now. Alex -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html