Skip to content
  • Peter Maydell's avatar
    cputlb: Don't assume do_unassigned_access() never returns · 44d7ce0e
    Peter Maydell authored
    
    
    In get_page_addr_code(), if the guest PC doesn't correspond to RAM
    then we currently run the CPU's do_unassigned_access() hook if it has
    one, and otherwise we give up and exit QEMU with a more-or-less
    useful message.  This code assumes that the do_unassigned_access hook
    will never return, because if it does then we'll plough on attempting
    to use a non-RAM TLB entry to get a RAM address and will abort() in
    qemu_ram_addr_from_host_nofail().  Unfortunately some CPU
    implementations of this hook do return: Microblaze, SPARC and the ARM
    v7M.
    
    Change the code to call report_bad_exec() if the hook returns, as
    well as if it didn't have one.  This means we can tidy it up to use
    the cpu_unassigned_access() function which wraps the "get the CPU
    class and call the hook if it has one" work, since we aren't trying
    to distinguish "no hook" from "hook existed and returned" any more.
    
    This brings the handling of this hook into line with the handling
    used for data accesses, where "hook returned" is treated the
    same as "no hook existed" and gets you the default behaviour.
    
    Signed-off-by: default avatarPeter Maydell <peter.maydell@linaro.org>
    Reviewed-by: default avatarRichard Henderson <rth@twiddle.net>
    44d7ce0e