Rename current allocation_tag_mem_probe to allocation_tag_mem_internal, then create a new allocation_tag_mem_probe that lacks probe and ra arguments. Force those to true and 0 when passing off to _internal.
Signed-off-by: Richard Henderson <[email protected]> --- target/arm/tcg/mte_helper.h | 18 +++--------------- target/arm/gdbstub64.c | 10 +++++----- target/arm/tcg/mte_helper.c | 29 ++++++++++++++++++----------- 3 files changed, 26 insertions(+), 31 deletions(-) diff --git a/target/arm/tcg/mte_helper.h b/target/arm/tcg/mte_helper.h index 1f471fb69b..b23a5de193 100644 --- a/target/arm/tcg/mte_helper.h +++ b/target/arm/tcg/mte_helper.h @@ -19,8 +19,6 @@ * @ptr_access: the access to use for the virtual address * @ptr_size: the number of bytes in the normal memory access * @tag_access: the access to use for the tag memory - * @probe: true to merely probe, never taking an exception - * @ra: the return address for exception handling * * Our tag memory is formatted as a sequence of little-endian nibbles. * That is, the byte at (addr >> (LOG2_TAG_GRANULE + 1)) contains two @@ -31,22 +29,12 @@ * a pointer to the corresponding tag byte. * * If there is no tag storage corresponding to @ptr, return NULL. - * - * If the page is inaccessible for @ptr_access, or has a watchpoint, there are - * three options: - * (1) probe = true, ra = 0 : pure probe -- we return NULL if the page is not - * accessible, and do not take watchpoint traps. The calling code must - * handle those cases in the right priority compared to MTE traps. - * (2) probe = false, ra = 0 : probe, no fault expected -- the caller guarantees - * that the page is going to be accessible. We will take watchpoint traps. - * (3) probe = false, ra != 0 : non-probe -- we will take both memory access - * traps and watchpoint traps. - * (probe = true, ra != 0 is invalid and will assert.) + * If the page is inaccessible for @ptr_access, return NULL. + * Do not take watcnpoint traps. */ uint8_t *allocation_tag_mem_probe(CPUARMState *env, int ptr_mmu_idx, uint64_t ptr, MMUAccessType ptr_access, - int ptr_size, MMUAccessType tag_access, - bool probe, uintptr_t ra); + int ptr_size, MMUAccessType tag_access); /** * load_tag1 - Load 1 tag (nibble) from byte diff --git a/target/arm/gdbstub64.c b/target/arm/gdbstub64.c index 0c3e5b30bd..08900f6843 100644 --- a/target/arm/gdbstub64.c +++ b/target/arm/gdbstub64.c @@ -725,8 +725,8 @@ static void handle_q_memtag(GArray *params, void *user_ctx) /* Find out the current translation regime for probe. */ mmu_index = cpu_mmu_index(env_cpu(env), false); /* Note that tags are packed here (2 tags packed in one byte). */ - tags = allocation_tag_mem_probe(env, mmu_index, addr, MMU_DATA_LOAD, 1, - MMU_DATA_LOAD, true, 0); + tags = allocation_tag_mem_probe(env, mmu_index, addr, MMU_DATA_LOAD, + 1, MMU_DATA_LOAD); if (!tags) { /* Address is not in a tagged region. */ gdb_put_packet("E04"); @@ -753,8 +753,8 @@ static void handle_q_isaddresstagged(GArray *params, void *user_ctx) /* Find out the current translation regime for probe. */ mmu_index = cpu_mmu_index(env_cpu(env), false); - tags = allocation_tag_mem_probe(env, mmu_index, addr, MMU_DATA_LOAD, 1, - MMU_DATA_LOAD, true, 0); + tags = allocation_tag_mem_probe(env, mmu_index, addr, MMU_DATA_LOAD, + 1, MMU_DATA_LOAD); reply = tags ? "01" : "00"; gdb_put_packet(reply); @@ -800,7 +800,7 @@ static void handle_Q_memtag(GArray *params, void *user_ctx) /* Find out the current translation regime for probe. */ mmu_index = cpu_mmu_index(env_cpu(env), false); tags = allocation_tag_mem_probe(env, mmu_index, start_addr, MMU_DATA_STORE, - 1, MMU_DATA_STORE, true, 0); + 1, MMU_DATA_STORE); if (!tags) { /* Address is not in a tagged region. */ gdb_put_packet("E04"); diff --git a/target/arm/tcg/mte_helper.c b/target/arm/tcg/mte_helper.c index dc87dc283f..905e9d7eaf 100644 --- a/target/arm/tcg/mte_helper.c +++ b/target/arm/tcg/mte_helper.c @@ -80,10 +80,11 @@ static void mte_perm_check_fail(CPUARMState *env, uint64_t dirty_ptr, } #endif -uint8_t *allocation_tag_mem_probe(CPUARMState *env, int ptr_mmu_idx, - uint64_t ptr, MMUAccessType ptr_access, - int ptr_size, MMUAccessType tag_access, - bool probe, uintptr_t ra) +static uint8_t * +allocation_tag_mem_internal(CPUARMState *env, int ptr_mmu_idx, + uint64_t ptr, MMUAccessType ptr_access, + int ptr_size, MMUAccessType tag_access, + bool probe, uintptr_t ra) { #ifdef CONFIG_USER_ONLY const size_t page_data_size = TARGET_PAGE_SIZE >> (LOG2_TAG_GRANULE + 1); @@ -92,8 +93,6 @@ uint8_t *allocation_tag_mem_probe(CPUARMState *env, int ptr_mmu_idx, uint8_t *tags; uintptr_t index; - assert(!(probe && ra)); - if (!(flags & (ptr_access == MMU_DATA_STORE ? PAGE_WRITE_ORG : PAGE_READ))) { if (probe) { return NULL; @@ -250,8 +249,16 @@ static uint8_t *allocation_tag_mem(CPUARMState *env, int ptr_mmu_idx, int ptr_size, MMUAccessType tag_access, uintptr_t ra) { - return allocation_tag_mem_probe(env, ptr_mmu_idx, ptr, ptr_access, - ptr_size, tag_access, false, ra); + return allocation_tag_mem_internal(env, ptr_mmu_idx, ptr, ptr_access, + ptr_size, tag_access, false, ra); +} + +uint8_t *allocation_tag_mem_probe(CPUARMState *env, int ptr_mmu_idx, + uint64_t ptr, MMUAccessType ptr_access, + int ptr_size, MMUAccessType tag_access) +{ + return allocation_tag_mem_internal(env, ptr_mmu_idx, ptr, ptr_access, + ptr_size, tag_access, true, 0); } uint64_t HELPER(irg)(CPUARMState *env, uint64_t rn, uint64_t rm) @@ -1221,7 +1228,7 @@ uint64_t mte_mops_probe(CPUARMState *env, uint64_t ptr, uint64_t size, /* True probe; this will never fault */ mem = allocation_tag_mem_probe(env, mmu_idx, ptr, w ? MMU_DATA_STORE : MMU_DATA_LOAD, - size, MMU_DATA_LOAD, true, 0); + size, MMU_DATA_LOAD); if (!mem) { return size; } @@ -1279,7 +1286,7 @@ uint64_t mte_mops_probe_rev(CPUARMState *env, uint64_t ptr, uint64_t size, */ mem = allocation_tag_mem_probe(env, mmu_idx, ptr, w ? MMU_DATA_STORE : MMU_DATA_LOAD, - 1, MMU_DATA_LOAD, true, 0); + 1, MMU_DATA_LOAD); if (!mem) { return size; } @@ -1331,7 +1338,7 @@ void mte_mops_set_tags(CPUARMState *env, uint64_t ptr, uint64_t size, mmu_idx = FIELD_EX32(desc, MTEDESC, MIDX); /* True probe: this will never fault */ mem = allocation_tag_mem_probe(env, mmu_idx, ptr, MMU_DATA_STORE, size, - MMU_DATA_STORE, true, 0); + MMU_DATA_STORE); if (!mem) { return; } -- 2.43.0
