Skip to content
Snippets Groups Projects
  • Daniel Henrique Barboza's avatar
    1770b2f2
    accel/tcg: Add 'size' param to probe_access_flags() · 1770b2f2
    Daniel Henrique Barboza authored
    
    probe_access_flags() as it is today uses probe_access_full(), which in
    turn uses probe_access_internal() with size = 0. probe_access_internal()
    then uses the size to call the tlb_fill() callback for the given CPU.
    This size param ('fault_size' as probe_access_internal() calls it) is
    ignored by most existing .tlb_fill callback implementations, e.g.
    arm_cpu_tlb_fill(), ppc_cpu_tlb_fill(), x86_cpu_tlb_fill() and
    mips_cpu_tlb_fill() to name a few.
    
    But RISC-V riscv_cpu_tlb_fill() actually uses it. The 'size' parameter
    is used to check for PMP (Physical Memory Protection) access. This is
    necessary because PMP does not make any guarantees about all the bytes
    of the same page having the same permissions, i.e. the same page can
    have different PMP properties, so we're forced to make sub-page range
    checks. To allow RISC-V emulation to do a probe_acess_flags() that
    covers PMP, we need to either add a 'size' param to the existing
    probe_acess_flags() or create a new interface (e.g.
    probe_access_range_flags).
    
    There are quite a few probe_* APIs already, so let's add a 'size' param
    to probe_access_flags() and re-use this API. This is done by open coding
    what probe_access_full() does inside probe_acess_flags() and passing the
    'size' param to probe_acess_internal(). Existing probe_access_flags()
    callers use size = 0 to not change their current API usage. 'size' is
    asserted to enforce single page access like probe_access() already does.
    
    No behavioral changes intended.
    
    Signed-off-by: default avatarDaniel Henrique Barboza <dbarboza@ventanamicro.com>
    Message-Id: <20230223234427.521114-2-dbarboza@ventanamicro.com>
    Reviewed-by: default avatarRichard Henderson <richard.henderson@linaro.org>
    Signed-off-by: default avatarRichard Henderson <richard.henderson@linaro.org>
    1770b2f2
    History
    accel/tcg: Add 'size' param to probe_access_flags()
    Daniel Henrique Barboza authored
    
    probe_access_flags() as it is today uses probe_access_full(), which in
    turn uses probe_access_internal() with size = 0. probe_access_internal()
    then uses the size to call the tlb_fill() callback for the given CPU.
    This size param ('fault_size' as probe_access_internal() calls it) is
    ignored by most existing .tlb_fill callback implementations, e.g.
    arm_cpu_tlb_fill(), ppc_cpu_tlb_fill(), x86_cpu_tlb_fill() and
    mips_cpu_tlb_fill() to name a few.
    
    But RISC-V riscv_cpu_tlb_fill() actually uses it. The 'size' parameter
    is used to check for PMP (Physical Memory Protection) access. This is
    necessary because PMP does not make any guarantees about all the bytes
    of the same page having the same permissions, i.e. the same page can
    have different PMP properties, so we're forced to make sub-page range
    checks. To allow RISC-V emulation to do a probe_acess_flags() that
    covers PMP, we need to either add a 'size' param to the existing
    probe_acess_flags() or create a new interface (e.g.
    probe_access_range_flags).
    
    There are quite a few probe_* APIs already, so let's add a 'size' param
    to probe_access_flags() and re-use this API. This is done by open coding
    what probe_access_full() does inside probe_acess_flags() and passing the
    'size' param to probe_acess_internal(). Existing probe_access_flags()
    callers use size = 0 to not change their current API usage. 'size' is
    asserted to enforce single page access like probe_access() already does.
    
    No behavioral changes intended.
    
    Signed-off-by: default avatarDaniel Henrique Barboza <dbarboza@ventanamicro.com>
    Message-Id: <20230223234427.521114-2-dbarboza@ventanamicro.com>
    Reviewed-by: default avatarRichard Henderson <richard.henderson@linaro.org>
    Signed-off-by: default avatarRichard Henderson <richard.henderson@linaro.org>