Peter Maydell <peter.mayd...@linaro.org> writes: > On 21 October 2017 at 15:05, Lluís Vilanova <vilan...@ac.upc.edu> wrote: >> Peter Maydell writes: >> >>> On 15 October 2017 at 17:30, Lluís Vilanova <vilan...@ac.upc.edu> wrote: >>>> Thinking about it, shouldn't this always be the same given QEMU's TLB/page >>>> table >>>> consistency assurances? >> >>> What TLB/page table consistency assurances? For ARM at least >>> we will only update (ie flush) the TLB when the guest next >>> executes a relevant TLB maintenance instruction. So a >>> misbehaving guest can set things up so the page table >>> is completely different from what's in QEMU's TLB if it >>> wants. This all falls in the realms of architecturally >>> unpredictable behaviour for the guest -- whether you >>> want the instrumentation to be confused as well is a >>> different question... >> >> I meant that if the contents of a virtual memory page change while QEMU is >> translating an instruction, it must be able to detect that and act >> accordingly >> for correctness. > > That's an interesting corner case, actually. Traditionally > it simply couldn't happen because we were strictly single > threaded and so if we were translating then we weren't > running guest code. We did need to handle "writes mean we > must invalidate an already produced translation", but not > "invalidate one we're halfway through and haven't put in > our data structures yet". Did we get that right in the MTTCG > design? How does it work?
It's currently protected by locks, as you need to grab tb_lock/mmap_lock to call: void tb_invalidate_phys_page_range(tb_page_addr_t start, tb_page_addr_t end, int is_cpu_write_access) So no new blocks can be created until you've complete your invalidation - or you are serialised until the block currently being translated is completed. At which point the block will be immediately marked as invalid and not be called again. > > (Did we produce a summary of the MTTCG design anywhere? > I didn't follow the development in detail as it was going > on, but it would be useful to understand the final result.) Sure, it's in: docs/devel/multi-thread-tcg.txt > > In any case, the only assurance we provide over QEMU as a > whole is that if the guest writes to a physical address then > we don't keep hold of a now-duff translation for that physaddr. > We don't guarantee the same thing for guest changes of > the vaddr-to-physaddr mapping -- instead we let the target > specific code deal with this by invalidating QEMU's TLB > when the guest code does TLB invalidate ops. > >> Having that in mind, the same should hold true when an instrumentor reads a >> page's contents during translation (e.g., to gather information on opcodes). > > Basically I don't think we actually have very strong > guarantees here, and that's another reason for not > providing instrumentation callbacks at translate time. > > thanks > -- PMM -- Alex Bennée