+static void replace_tlb_entry(SparcTLBEntry *tlb, CPUState *env1,
+ uint64_t tlb_tag, uint64_t tlb_tte)
+{
+ target_ulong mask, size, va, offset;
+
+ // flush page range if translation is valid
+ if (tlb->tte & 0x8000000000000000ULL) {
+
+ mask = 0xffffffffffffe000ULL;
+ mask <<= 3 * ((tlb->tte >> 61) & 3);
+ size = ~mask + 1;
+
+ va = tlb->tag & mask;
+
+ for (offset = 0; offset < size; offset += TARGET_PAGE_SIZE) {
+ tlb_flush_page(env1, va + offset);
+ }
+ }
+
+ tlb->tag = tlb_tag;
+ tlb->tte = tlb_tte;
+}
+
+static void demap_tlb(SparcTLBEntry *tlb, target_ulong demap_addr,
+ CPUState *env1)
+{
+ unsigned int i;
+ target_ulong mask;
+
+ for (i = 0; i < 64; i++) {
+ if (tlb[i].tte & 0x8000000000000000ULL) {
+
+ mask = 0xffffffffffffe000ULL;
+ mask <<= 3 * ((tlb[i].tte >> 61) & 3);
+
+ if ((demap_addr & mask) == (tlb[i].tag & mask)) {
+ replace_tlb_entry(&tlb[i], env1, 0, 0);
+#ifdef DEBUG_MMU
+ DPRINTF_MMU("mmu demap invalidated entry [%02u]\n",
+ i);
+ dump_mmu(env);
+#endif
+ }
+ //return;
+ }
+ }
+
+}
+