[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v3 05/88] target/hppa: Split out hppa_flush_tlb_range
|
From: |
Richard Henderson |
|
Subject: |
[PATCH v3 05/88] target/hppa: Split out hppa_flush_tlb_range |
|
Date: |
Wed, 1 Nov 2023 18:28:53 -0700 |
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
target/hppa/mem_helper.c | 39 ++++++++++++++++++++++++---------------
1 file changed, 24 insertions(+), 15 deletions(-)
diff --git a/target/hppa/mem_helper.c b/target/hppa/mem_helper.c
index 60cae646cc..828cceb29c 100644
--- a/target/hppa/mem_helper.c
+++ b/target/hppa/mem_helper.c
@@ -67,6 +67,25 @@ static void hppa_flush_tlb_ent(CPUHPPAState *env,
HPPATLBEntry *ent,
ent->itree.start = -1;
}
+static HPPATLBEntry *hppa_flush_tlb_range(CPUHPPAState *env,
+ vaddr va_b, vaddr va_e)
+{
+ HPPATLBEntry *empty = NULL;
+
+ /* Zap any old entries covering ADDR; notice empty entries on the way. */
+ for (int i = HPPA_BTLB_ENTRIES; i < ARRAY_SIZE(env->tlb); ++i) {
+ HPPATLBEntry *ent = &env->tlb[i];
+
+ if (!ent->entry_valid) {
+ empty = ent;
+ } else if (va_e >= ent->itree.start && va_b <= ent->itree.last) {
+ hppa_flush_tlb_ent(env, ent, false);
+ empty = ent;
+ }
+ }
+ return empty;
+}
+
static HPPATLBEntry *hppa_alloc_tlb_ent(CPUHPPAState *env)
{
HPPATLBEntry *ent;
@@ -284,21 +303,11 @@ bool hppa_cpu_tlb_fill(CPUState *cs, vaddr addr, int size,
/* Insert (Insn/Data) TLB Address. Note this is PA 1.1 only. */
void HELPER(itlba)(CPUHPPAState *env, target_ulong addr, target_ureg reg)
{
- HPPATLBEntry *empty = NULL;
- int i;
+ HPPATLBEntry *empty;
/* Zap any old entries covering ADDR; notice empty entries on the way. */
- for (i = HPPA_BTLB_ENTRIES; i < ARRAY_SIZE(env->tlb); ++i) {
- HPPATLBEntry *ent = &env->tlb[i];
- if (ent->itree.start <= addr && addr <= ent->itree.last) {
- if (ent->entry_valid) {
- hppa_flush_tlb_ent(env, ent, false);
- }
- if (!empty) {
- empty = ent;
- }
- }
- }
+ addr &= TARGET_PAGE_MASK;
+ empty = hppa_flush_tlb_range(env, addr, addr + TARGET_PAGE_SIZE - 1);
/* If we didn't see an empty entry, evict one. */
if (empty == NULL) {
@@ -306,8 +315,8 @@ void HELPER(itlba)(CPUHPPAState *env, target_ulong addr,
target_ureg reg)
}
/* Note that empty->entry_valid == 0 already. */
- empty->itree.start = addr & TARGET_PAGE_MASK;
- empty->itree.last = empty->itree.start + TARGET_PAGE_SIZE - 1;
+ empty->itree.start = addr;
+ empty->itree.last = addr + TARGET_PAGE_SIZE - 1;
empty->pa = extract32(reg, 5, 20) << TARGET_PAGE_BITS;
trace_hppa_tlb_itlba(env, empty, empty->itree.start,
empty->itree.last, empty->pa);
--
2.34.1
- [PATCH v3 00/88] target/hppa: Implement hppa64 cpu, Richard Henderson, 2023/11/01
- [PATCH v3 03/88] target/hppa: Use IntervalTreeNode in HPPATLBEntry, Richard Henderson, 2023/11/01
- [PATCH v3 07/88] tcg: Improve expansion of deposit of constant, Richard Henderson, 2023/11/01
- [PATCH v3 10/88] target/hppa: Remove get_temp_tl, Richard Henderson, 2023/11/01
- [PATCH v3 05/88] target/hppa: Split out hppa_flush_tlb_range,
Richard Henderson <=
- [PATCH v3 01/88] target/hppa: Include PSW_P in tb flags and mmu index, Richard Henderson, 2023/11/01
- [PATCH v3 02/88] target/hppa: Rename hppa_tlb_entry to HPPATLBEntry, Richard Henderson, 2023/11/01
- [PATCH v3 14/88] target/hppa: Truncate rotate count in trans_shrpw_sar, Richard Henderson, 2023/11/01
- [PATCH v3 09/88] target/hppa: Remove get_temp, Richard Henderson, 2023/11/01
- [PATCH v3 04/88] target/hppa: Always report one page to tlb_set_page, Richard Henderson, 2023/11/01
- [PATCH v3 18/88] target/hppa: Fix extrw and depw with sar for hppa64, Richard Henderson, 2023/11/01
- [PATCH v3 15/88] target/hppa: Fix trans_ds for hppa64, Richard Henderson, 2023/11/01
- [PATCH v3 17/88] target/hppa: Fix bb_sar for hppa64, Richard Henderson, 2023/11/01
- [PATCH v3 06/88] target/hppa: Populate an interval tree with valid tlb entries, Richard Henderson, 2023/11/01
- [PATCH v3 12/88] target/hppa: Fix hppa64 case in machine.c, Richard Henderson, 2023/11/01