cputlb: Change tlb_flush_page() argument to CPUState
Signed-off-by: Andreas Färber <afaerber@suse.de>
This commit is contained in:
parent
0063ebd6ac
commit
31b030d4ab
4
cputlb.c
4
cputlb.c
@ -77,9 +77,9 @@ static inline void tlb_flush_entry(CPUTLBEntry *tlb_entry, target_ulong addr)
|
||||
}
|
||||
}
|
||||
|
||||
void tlb_flush_page(CPUArchState *env, target_ulong addr)
|
||||
void tlb_flush_page(CPUState *cpu, target_ulong addr)
|
||||
{
|
||||
CPUState *cpu = ENV_GET_CPU(env);
|
||||
CPUArchState *env = cpu->env_ptr;
|
||||
int i;
|
||||
int mmu_idx;
|
||||
|
||||
|
7
exec.c
7
exec.c
@ -543,7 +543,6 @@ int cpu_watchpoint_insert(CPUState *cpu, vaddr addr, vaddr len,
|
||||
int cpu_watchpoint_insert(CPUState *cpu, vaddr addr, vaddr len,
|
||||
int flags, CPUWatchpoint **watchpoint)
|
||||
{
|
||||
CPUArchState *env = cpu->env_ptr;
|
||||
vaddr len_mask = ~(len - 1);
|
||||
CPUWatchpoint *wp;
|
||||
|
||||
@ -567,7 +566,7 @@ int cpu_watchpoint_insert(CPUState *cpu, vaddr addr, vaddr len,
|
||||
QTAILQ_INSERT_TAIL(&cpu->watchpoints, wp, entry);
|
||||
}
|
||||
|
||||
tlb_flush_page(env, addr);
|
||||
tlb_flush_page(cpu, addr);
|
||||
|
||||
if (watchpoint)
|
||||
*watchpoint = wp;
|
||||
@ -594,11 +593,9 @@ int cpu_watchpoint_remove(CPUState *cpu, vaddr addr, vaddr len,
|
||||
/* Remove a specific watchpoint by reference. */
|
||||
void cpu_watchpoint_remove_by_ref(CPUState *cpu, CPUWatchpoint *watchpoint)
|
||||
{
|
||||
CPUArchState *env = cpu->env_ptr;
|
||||
|
||||
QTAILQ_REMOVE(&cpu->watchpoints, watchpoint, entry);
|
||||
|
||||
tlb_flush_page(env, watchpoint->vaddr);
|
||||
tlb_flush_page(cpu, watchpoint->vaddr);
|
||||
|
||||
g_free(watchpoint);
|
||||
}
|
||||
|
@ -98,14 +98,14 @@ void tb_invalidate_phys_range(tb_page_addr_t start, tb_page_addr_t end,
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
void tcg_cpu_address_space_init(CPUState *cpu, AddressSpace *as);
|
||||
/* cputlb.c */
|
||||
void tlb_flush_page(CPUArchState *env, target_ulong addr);
|
||||
void tlb_flush_page(CPUState *cpu, target_ulong addr);
|
||||
void tlb_flush(CPUArchState *env, int flush_global);
|
||||
void tlb_set_page(CPUArchState *env, target_ulong vaddr,
|
||||
hwaddr paddr, int prot,
|
||||
int mmu_idx, target_ulong size);
|
||||
void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr);
|
||||
#else
|
||||
static inline void tlb_flush_page(CPUArchState *env, target_ulong addr)
|
||||
static inline void tlb_flush_page(CPUState *cpu, target_ulong addr)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -69,7 +69,7 @@ void helper_tbia(CPUAlphaState *env)
|
||||
|
||||
void helper_tbis(CPUAlphaState *env, uint64_t p)
|
||||
{
|
||||
tlb_flush_page(env, p);
|
||||
tlb_flush_page(CPU(alpha_env_get_cpu(env)), p);
|
||||
}
|
||||
|
||||
void helper_tb_flush(CPUAlphaState *env)
|
||||
|
@ -342,7 +342,9 @@ static void tlbimva_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||
uint64_t value)
|
||||
{
|
||||
/* Invalidate single TLB entry by MVA and ASID (TLBIMVA) */
|
||||
tlb_flush_page(env, value & TARGET_PAGE_MASK);
|
||||
ARMCPU *cpu = arm_env_get_cpu(env);
|
||||
|
||||
tlb_flush_page(CPU(cpu), value & TARGET_PAGE_MASK);
|
||||
}
|
||||
|
||||
static void tlbiasid_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||
@ -356,7 +358,9 @@ static void tlbimvaa_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||
uint64_t value)
|
||||
{
|
||||
/* Invalidate single entry by MVA, all ASIDs (TLBIMVAA) */
|
||||
tlb_flush_page(env, value & TARGET_PAGE_MASK);
|
||||
ARMCPU *cpu = arm_env_get_cpu(env);
|
||||
|
||||
tlb_flush_page(CPU(cpu), value & TARGET_PAGE_MASK);
|
||||
}
|
||||
|
||||
static const ARMCPRegInfo cp_reginfo[] = {
|
||||
@ -1686,16 +1690,18 @@ static void tlbi_aa64_va_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||
uint64_t value)
|
||||
{
|
||||
/* Invalidate by VA (AArch64 version) */
|
||||
ARMCPU *cpu = arm_env_get_cpu(env);
|
||||
uint64_t pageaddr = value << 12;
|
||||
tlb_flush_page(env, pageaddr);
|
||||
tlb_flush_page(CPU(cpu), pageaddr);
|
||||
}
|
||||
|
||||
static void tlbi_aa64_vaa_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||
uint64_t value)
|
||||
{
|
||||
/* Invalidate by VA, all ASIDs (AArch64 version) */
|
||||
ARMCPU *cpu = arm_env_get_cpu(env);
|
||||
uint64_t pageaddr = value << 12;
|
||||
tlb_flush_page(env, pageaddr);
|
||||
tlb_flush_page(CPU(cpu), pageaddr);
|
||||
}
|
||||
|
||||
static void tlbi_aa64_asid_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||
|
@ -290,6 +290,7 @@ static int cris_mmu_translate_page(struct cris_mmu_result *res,
|
||||
|
||||
void cris_mmu_flush_pid(CPUCRISState *env, uint32_t pid)
|
||||
{
|
||||
CRISCPU *cpu = cris_env_get_cpu(env);
|
||||
target_ulong vaddr;
|
||||
unsigned int idx;
|
||||
uint32_t lo, hi;
|
||||
@ -315,7 +316,7 @@ void cris_mmu_flush_pid(CPUCRISState *env, uint32_t pid)
|
||||
vaddr = tlb_vpn << TARGET_PAGE_BITS;
|
||||
D_LOG("flush pid=%x vaddr=%x\n",
|
||||
pid, vaddr);
|
||||
tlb_flush_page(env, vaddr);
|
||||
tlb_flush_page(CPU(cpu), vaddr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -98,8 +98,11 @@ void helper_tlb_flush_pid(CPUCRISState *env, uint32_t pid)
|
||||
void helper_spc_write(CPUCRISState *env, uint32_t new_spc)
|
||||
{
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
tlb_flush_page(env, env->pregs[PR_SPC]);
|
||||
tlb_flush_page(env, new_spc);
|
||||
CRISCPU *cpu = cris_env_get_cpu(env);
|
||||
CPUState *cs = CPU(cpu);
|
||||
|
||||
tlb_flush_page(cs, env->pregs[PR_SPC]);
|
||||
tlb_flush_page(cs, new_spc);
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -114,6 +117,9 @@ void helper_dump(uint32_t a0, uint32_t a1, uint32_t a2)
|
||||
|
||||
void helper_movl_sreg_reg(CPUCRISState *env, uint32_t sreg, uint32_t reg)
|
||||
{
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
CRISCPU *cpu = cris_env_get_cpu(env);
|
||||
#endif
|
||||
uint32_t srs;
|
||||
srs = env->pregs[PR_SRS];
|
||||
srs &= 3;
|
||||
@ -155,7 +161,7 @@ void helper_movl_sreg_reg(CPUCRISState *env, uint32_t sreg, uint32_t reg)
|
||||
D_LOG("tlb flush vaddr=%x v=%d pc=%x\n",
|
||||
vaddr, tlb_v, env->pc);
|
||||
if (tlb_v) {
|
||||
tlb_flush_page(env, vaddr);
|
||||
tlb_flush_page(CPU(cpu), vaddr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -221,8 +221,10 @@ void helper_lmsw(CPUX86State *env, target_ulong t0)
|
||||
|
||||
void helper_invlpg(CPUX86State *env, target_ulong addr)
|
||||
{
|
||||
X86CPU *cpu = x86_env_get_cpu(env);
|
||||
|
||||
cpu_svm_check_intercept_param(env, SVM_EXIT_INVLPG, 0);
|
||||
tlb_flush_page(env, addr);
|
||||
tlb_flush_page(CPU(cpu), addr);
|
||||
}
|
||||
|
||||
void helper_rdtsc(CPUX86State *env)
|
||||
|
@ -469,6 +469,7 @@ void helper_skinit(CPUX86State *env)
|
||||
|
||||
void helper_invlpga(CPUX86State *env, int aflag)
|
||||
{
|
||||
X86CPU *cpu = x86_env_get_cpu(env);
|
||||
target_ulong addr;
|
||||
|
||||
cpu_svm_check_intercept_param(env, SVM_EXIT_INVLPGA, 0);
|
||||
@ -481,7 +482,7 @@ void helper_invlpga(CPUX86State *env, int aflag)
|
||||
|
||||
/* XXX: could use the ASID to see if it is needed to do the
|
||||
flush */
|
||||
tlb_flush_page(env, addr);
|
||||
tlb_flush_page(CPU(cpu), addr);
|
||||
}
|
||||
|
||||
void helper_svm_check_intercept_param(CPUX86State *env, uint32_t type,
|
||||
|
@ -34,6 +34,7 @@ static unsigned int tlb_decode_size(unsigned int f)
|
||||
|
||||
static void mmu_flush_idx(CPUMBState *env, unsigned int idx)
|
||||
{
|
||||
CPUState *cs = CPU(mb_env_get_cpu(env));
|
||||
struct microblaze_mmu *mmu = &env->mmu;
|
||||
unsigned int tlb_size;
|
||||
uint32_t tlb_tag, end, t;
|
||||
@ -47,7 +48,7 @@ static void mmu_flush_idx(CPUMBState *env, unsigned int idx)
|
||||
end = tlb_tag + tlb_size;
|
||||
|
||||
while (tlb_tag < end) {
|
||||
tlb_flush_page(env, tlb_tag);
|
||||
tlb_flush_page(cs, tlb_tag);
|
||||
tlb_tag += TARGET_PAGE_SIZE;
|
||||
}
|
||||
}
|
||||
|
@ -653,6 +653,8 @@ void mips_cpu_do_interrupt(CPUState *cs)
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
void r4k_invalidate_tlb (CPUMIPSState *env, int idx, int use_extra)
|
||||
{
|
||||
MIPSCPU *cpu = mips_env_get_cpu(env);
|
||||
CPUState *cs;
|
||||
r4k_tlb_t *tlb;
|
||||
target_ulong addr;
|
||||
target_ulong end;
|
||||
@ -678,6 +680,7 @@ void r4k_invalidate_tlb (CPUMIPSState *env, int idx, int use_extra)
|
||||
/* 1k pages are not supported. */
|
||||
mask = tlb->PageMask | ~(TARGET_PAGE_MASK << 1);
|
||||
if (tlb->V0) {
|
||||
cs = CPU(cpu);
|
||||
addr = tlb->VPN & ~mask;
|
||||
#if defined(TARGET_MIPS64)
|
||||
if (addr >= (0xFFFFFFFF80000000ULL & env->SEGMask)) {
|
||||
@ -686,11 +689,12 @@ void r4k_invalidate_tlb (CPUMIPSState *env, int idx, int use_extra)
|
||||
#endif
|
||||
end = addr | (mask >> 1);
|
||||
while (addr < end) {
|
||||
tlb_flush_page (env, addr);
|
||||
tlb_flush_page(cs, addr);
|
||||
addr += TARGET_PAGE_SIZE;
|
||||
}
|
||||
}
|
||||
if (tlb->V1) {
|
||||
cs = CPU(cpu);
|
||||
addr = (tlb->VPN & ~mask) | ((mask >> 1) + 1);
|
||||
#if defined(TARGET_MIPS64)
|
||||
if (addr >= (0xFFFFFFFF80000000ULL & env->SEGMask)) {
|
||||
@ -699,7 +703,7 @@ void r4k_invalidate_tlb (CPUMIPSState *env, int idx, int use_extra)
|
||||
#endif
|
||||
end = addr | mask;
|
||||
while (addr - 1 < end) {
|
||||
tlb_flush_page (env, addr);
|
||||
tlb_flush_page(cs, addr);
|
||||
addr += TARGET_PAGE_SIZE;
|
||||
}
|
||||
}
|
||||
|
@ -84,7 +84,7 @@ void HELPER(mtspr)(CPUOpenRISCState *env,
|
||||
case TO_SPR(1, 512) ... TO_SPR(1, 512+DTLB_SIZE-1): /* DTLBW0MR 0-127 */
|
||||
idx = spr - TO_SPR(1, 512);
|
||||
if (!(rb & 1)) {
|
||||
tlb_flush_page(env, env->tlb->dtlb[0][idx].mr & TARGET_PAGE_MASK);
|
||||
tlb_flush_page(cs, env->tlb->dtlb[0][idx].mr & TARGET_PAGE_MASK);
|
||||
}
|
||||
env->tlb->dtlb[0][idx].mr = rb;
|
||||
break;
|
||||
@ -103,7 +103,7 @@ void HELPER(mtspr)(CPUOpenRISCState *env,
|
||||
case TO_SPR(2, 512) ... TO_SPR(2, 512+ITLB_SIZE-1): /* ITLBW0MR 0-127 */
|
||||
idx = spr - TO_SPR(2, 512);
|
||||
if (!(rb & 1)) {
|
||||
tlb_flush_page(env, env->tlb->itlb[0][idx].mr & TARGET_PAGE_MASK);
|
||||
tlb_flush_page(cs, env->tlb->itlb[0][idx].mr & TARGET_PAGE_MASK);
|
||||
}
|
||||
env->tlb->itlb[0][idx].mr = rb;
|
||||
break;
|
||||
|
@ -252,6 +252,7 @@ static inline void ppc6xx_tlb_invalidate_virt2(CPUPPCState *env,
|
||||
int is_code, int match_epn)
|
||||
{
|
||||
#if !defined(FLUSH_ALL_TLBS)
|
||||
CPUState *cs = CPU(ppc_env_get_cpu(env));
|
||||
ppc6xx_tlb_t *tlb;
|
||||
int way, nr;
|
||||
|
||||
@ -263,7 +264,7 @@ static inline void ppc6xx_tlb_invalidate_virt2(CPUPPCState *env,
|
||||
LOG_SWTLB("TLB invalidate %d/%d " TARGET_FMT_lx "\n", nr,
|
||||
env->nb_tlb, eaddr);
|
||||
pte_invalidate(&tlb->pte0);
|
||||
tlb_flush_page(env, tlb->EPN);
|
||||
tlb_flush_page(cs, tlb->EPN);
|
||||
}
|
||||
}
|
||||
#else
|
||||
@ -657,6 +658,7 @@ static inline void ppc4xx_tlb_invalidate_virt(CPUPPCState *env,
|
||||
target_ulong eaddr, uint32_t pid)
|
||||
{
|
||||
#if !defined(FLUSH_ALL_TLBS)
|
||||
CPUState *cs = CPU(ppc_env_get_cpu(env));
|
||||
ppcemb_tlb_t *tlb;
|
||||
hwaddr raddr;
|
||||
target_ulong page, end;
|
||||
@ -667,7 +669,7 @@ static inline void ppc4xx_tlb_invalidate_virt(CPUPPCState *env,
|
||||
if (ppcemb_tlb_check(env, tlb, &raddr, eaddr, pid, 0, i) == 0) {
|
||||
end = tlb->EPN + tlb->size;
|
||||
for (page = tlb->EPN; page < end; page += TARGET_PAGE_SIZE) {
|
||||
tlb_flush_page(env, page);
|
||||
tlb_flush_page(cs, page);
|
||||
}
|
||||
tlb->prot &= ~PAGE_VALID;
|
||||
break;
|
||||
@ -1727,6 +1729,7 @@ static int cpu_ppc_handle_mmu_fault(CPUPPCState *env, target_ulong address,
|
||||
static inline void do_invalidate_BAT(CPUPPCState *env, target_ulong BATu,
|
||||
target_ulong mask)
|
||||
{
|
||||
CPUState *cs = CPU(ppc_env_get_cpu(env));
|
||||
target_ulong base, end, page;
|
||||
|
||||
base = BATu & ~0x0001FFFF;
|
||||
@ -1734,7 +1737,7 @@ static inline void do_invalidate_BAT(CPUPPCState *env, target_ulong BATu,
|
||||
LOG_BATS("Flush BAT from " TARGET_FMT_lx " to " TARGET_FMT_lx " ("
|
||||
TARGET_FMT_lx ")\n", base, end, mask);
|
||||
for (page = base; page != end; page += TARGET_PAGE_SIZE) {
|
||||
tlb_flush_page(env, page);
|
||||
tlb_flush_page(cs, page);
|
||||
}
|
||||
LOG_BATS("Flush done\n");
|
||||
}
|
||||
@ -1941,6 +1944,7 @@ void ppc_tlb_invalidate_one(CPUPPCState *env, target_ulong addr)
|
||||
{
|
||||
#if !defined(FLUSH_ALL_TLBS)
|
||||
PowerPCCPU *cpu = ppc_env_get_cpu(env);
|
||||
CPUState *cs;
|
||||
|
||||
addr &= TARGET_PAGE_MASK;
|
||||
switch (env->mmu_model) {
|
||||
@ -1974,25 +1978,26 @@ void ppc_tlb_invalidate_one(CPUPPCState *env, target_ulong addr)
|
||||
case POWERPC_MMU_601:
|
||||
/* tlbie invalidate TLBs for all segments */
|
||||
addr &= ~((target_ulong)-1ULL << 28);
|
||||
cs = CPU(cpu);
|
||||
/* XXX: this case should be optimized,
|
||||
* giving a mask to tlb_flush_page
|
||||
*/
|
||||
tlb_flush_page(env, addr | (0x0 << 28));
|
||||
tlb_flush_page(env, addr | (0x1 << 28));
|
||||
tlb_flush_page(env, addr | (0x2 << 28));
|
||||
tlb_flush_page(env, addr | (0x3 << 28));
|
||||
tlb_flush_page(env, addr | (0x4 << 28));
|
||||
tlb_flush_page(env, addr | (0x5 << 28));
|
||||
tlb_flush_page(env, addr | (0x6 << 28));
|
||||
tlb_flush_page(env, addr | (0x7 << 28));
|
||||
tlb_flush_page(env, addr | (0x8 << 28));
|
||||
tlb_flush_page(env, addr | (0x9 << 28));
|
||||
tlb_flush_page(env, addr | (0xA << 28));
|
||||
tlb_flush_page(env, addr | (0xB << 28));
|
||||
tlb_flush_page(env, addr | (0xC << 28));
|
||||
tlb_flush_page(env, addr | (0xD << 28));
|
||||
tlb_flush_page(env, addr | (0xE << 28));
|
||||
tlb_flush_page(env, addr | (0xF << 28));
|
||||
tlb_flush_page(cs, addr | (0x0 << 28));
|
||||
tlb_flush_page(cs, addr | (0x1 << 28));
|
||||
tlb_flush_page(cs, addr | (0x2 << 28));
|
||||
tlb_flush_page(cs, addr | (0x3 << 28));
|
||||
tlb_flush_page(cs, addr | (0x4 << 28));
|
||||
tlb_flush_page(cs, addr | (0x5 << 28));
|
||||
tlb_flush_page(cs, addr | (0x6 << 28));
|
||||
tlb_flush_page(cs, addr | (0x7 << 28));
|
||||
tlb_flush_page(cs, addr | (0x8 << 28));
|
||||
tlb_flush_page(cs, addr | (0x9 << 28));
|
||||
tlb_flush_page(cs, addr | (0xA << 28));
|
||||
tlb_flush_page(cs, addr | (0xB << 28));
|
||||
tlb_flush_page(cs, addr | (0xC << 28));
|
||||
tlb_flush_page(cs, addr | (0xD << 28));
|
||||
tlb_flush_page(cs, addr | (0xE << 28));
|
||||
tlb_flush_page(cs, addr | (0xF << 28));
|
||||
break;
|
||||
#if defined(TARGET_PPC64)
|
||||
case POWERPC_MMU_64B:
|
||||
@ -2325,6 +2330,7 @@ void helper_4xx_tlbwe_hi(CPUPPCState *env, target_ulong entry,
|
||||
target_ulong val)
|
||||
{
|
||||
PowerPCCPU *cpu = ppc_env_get_cpu(env);
|
||||
CPUState *cs = CPU(cpu);
|
||||
ppcemb_tlb_t *tlb;
|
||||
target_ulong page, end;
|
||||
|
||||
@ -2338,7 +2344,7 @@ void helper_4xx_tlbwe_hi(CPUPPCState *env, target_ulong entry,
|
||||
LOG_SWTLB("%s: invalidate old TLB %d start " TARGET_FMT_lx " end "
|
||||
TARGET_FMT_lx "\n", __func__, (int)entry, tlb->EPN, end);
|
||||
for (page = tlb->EPN; page < end; page += TARGET_PAGE_SIZE) {
|
||||
tlb_flush_page(env, page);
|
||||
tlb_flush_page(cs, page);
|
||||
}
|
||||
}
|
||||
tlb->size = booke_tlb_to_page_size((val >> PPC4XX_TLBHI_SIZE_SHIFT)
|
||||
@ -2348,7 +2354,7 @@ void helper_4xx_tlbwe_hi(CPUPPCState *env, target_ulong entry,
|
||||
* of the ppc or ppc64 one
|
||||
*/
|
||||
if ((val & PPC4XX_TLBHI_V) && tlb->size < TARGET_PAGE_SIZE) {
|
||||
cpu_abort(CPU(cpu), "TLB size " TARGET_FMT_lu " < %u "
|
||||
cpu_abort(cs, "TLB size " TARGET_FMT_lu " < %u "
|
||||
"are not supported (%d)\n",
|
||||
tlb->size, TARGET_PAGE_SIZE, (int)((val >> 7) & 0x7));
|
||||
}
|
||||
@ -2357,7 +2363,7 @@ void helper_4xx_tlbwe_hi(CPUPPCState *env, target_ulong entry,
|
||||
tlb->prot |= PAGE_VALID;
|
||||
if (val & PPC4XX_TLBHI_E) {
|
||||
/* XXX: TO BE FIXED */
|
||||
cpu_abort(CPU(cpu),
|
||||
cpu_abort(cs,
|
||||
"Little-endian TLB entries are not supported by now\n");
|
||||
}
|
||||
} else {
|
||||
@ -2377,7 +2383,7 @@ void helper_4xx_tlbwe_hi(CPUPPCState *env, target_ulong entry,
|
||||
LOG_SWTLB("%s: invalidate TLB %d start " TARGET_FMT_lx " end "
|
||||
TARGET_FMT_lx "\n", __func__, (int)entry, tlb->EPN, end);
|
||||
for (page = tlb->EPN; page < end; page += TARGET_PAGE_SIZE) {
|
||||
tlb_flush_page(env, page);
|
||||
tlb_flush_page(cs, page);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2666,7 +2672,7 @@ void helper_booke206_tlbwe(CPUPPCState *env)
|
||||
}
|
||||
|
||||
if (booke206_tlb_to_page_size(env, tlb) == TARGET_PAGE_SIZE) {
|
||||
tlb_flush_page(env, tlb->mas2 & MAS2_EPN_MASK);
|
||||
tlb_flush_page(CPU(cpu), tlb->mas2 & MAS2_EPN_MASK);
|
||||
} else {
|
||||
tlb_flush(env, 1);
|
||||
}
|
||||
@ -2775,6 +2781,8 @@ static inline void booke206_invalidate_ea_tlb(CPUPPCState *env, int tlbn,
|
||||
|
||||
void helper_booke206_tlbivax(CPUPPCState *env, target_ulong address)
|
||||
{
|
||||
PowerPCCPU *cpu = ppc_env_get_cpu(env);
|
||||
|
||||
if (address & 0x4) {
|
||||
/* flush all entries */
|
||||
if (address & 0x8) {
|
||||
@ -2794,7 +2802,7 @@ void helper_booke206_tlbivax(CPUPPCState *env, target_ulong address)
|
||||
} else {
|
||||
/* flush TLB0 entries */
|
||||
booke206_invalidate_ea_tlb(env, 0, address);
|
||||
tlb_flush_page(env, address & MAS2_EPN_MASK);
|
||||
tlb_flush_page(CPU(cpu), address & MAS2_EPN_MASK);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1027,13 +1027,13 @@ void HELPER(ipte)(CPUS390XState *env, uint64_t pte_addr, uint64_t vaddr)
|
||||
|
||||
/* XXX we exploit the fact that Linux passes the exact virtual
|
||||
address here - it's not obliged to! */
|
||||
tlb_flush_page(env, page);
|
||||
tlb_flush_page(cs, page);
|
||||
|
||||
/* XXX 31-bit hack */
|
||||
if (page & 0x80000000) {
|
||||
tlb_flush_page(env, page & ~0x80000000);
|
||||
tlb_flush_page(cs, page & ~0x80000000);
|
||||
} else {
|
||||
tlb_flush_page(env, page | 0x80000000);
|
||||
tlb_flush_page(cs, page | 0x80000000);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -237,11 +237,13 @@ uint64_t HELPER(diag)(CPUS390XState *env, uint32_t num, uint64_t mem,
|
||||
/* Set Prefix */
|
||||
void HELPER(spx)(CPUS390XState *env, uint64_t a1)
|
||||
{
|
||||
CPUState *cs = CPU(s390_env_get_cpu(env));
|
||||
uint32_t prefix = a1 & 0x7fffe000;
|
||||
|
||||
env->psa = prefix;
|
||||
qemu_log("prefix: %#x\n", prefix);
|
||||
tlb_flush_page(env, 0);
|
||||
tlb_flush_page(env, TARGET_PAGE_SIZE);
|
||||
tlb_flush_page(cs, 0);
|
||||
tlb_flush_page(cs, TARGET_PAGE_SIZE);
|
||||
}
|
||||
|
||||
static inline uint64_t clock_value(CPUS390XState *env)
|
||||
|
@ -304,7 +304,7 @@ static int copy_utlb_entry_itlb(CPUSH4State *env, int utlb)
|
||||
itlb = itlb_replacement(env);
|
||||
ientry = &env->itlb[itlb];
|
||||
if (ientry->v) {
|
||||
tlb_flush_page(env, ientry->vpn << 10);
|
||||
tlb_flush_page(CPU(sh_env_get_cpu(env)), ientry->vpn << 10);
|
||||
}
|
||||
*ientry = env->utlb[utlb];
|
||||
update_itlb_use(env, itlb);
|
||||
@ -535,7 +535,7 @@ void cpu_load_tlb(CPUSH4State * env)
|
||||
if (entry->v) {
|
||||
/* Overwriting valid entry in utlb. */
|
||||
target_ulong address = entry->vpn << 10;
|
||||
tlb_flush_page(env, address);
|
||||
tlb_flush_page(CPU(cpu), address);
|
||||
}
|
||||
|
||||
/* Take values into cpu status from registers. */
|
||||
@ -611,7 +611,7 @@ void cpu_sh4_write_mmaped_itlb_addr(CPUSH4State *s, hwaddr addr,
|
||||
if (entry->v) {
|
||||
/* Overwriting valid entry in itlb. */
|
||||
target_ulong address = entry->vpn << 10;
|
||||
tlb_flush_page(s, address);
|
||||
tlb_flush_page(CPU(sh_env_get_cpu(s)), address);
|
||||
}
|
||||
entry->asid = asid;
|
||||
entry->vpn = vpn;
|
||||
@ -653,7 +653,7 @@ void cpu_sh4_write_mmaped_itlb_data(CPUSH4State *s, hwaddr addr,
|
||||
if (entry->v) {
|
||||
/* Overwriting valid entry in utlb. */
|
||||
target_ulong address = entry->vpn << 10;
|
||||
tlb_flush_page(s, address);
|
||||
tlb_flush_page(CPU(sh_env_get_cpu(s)), address);
|
||||
}
|
||||
entry->ppn = (mem_value & 0x1ffffc00) >> 10;
|
||||
entry->v = (mem_value & 0x00000100) >> 8;
|
||||
@ -737,16 +737,19 @@ void cpu_sh4_write_mmaped_utlb_addr(CPUSH4State *s, hwaddr addr,
|
||||
}
|
||||
}
|
||||
|
||||
if (needs_tlb_flush)
|
||||
tlb_flush_page(s, vpn << 10);
|
||||
if (needs_tlb_flush) {
|
||||
tlb_flush_page(CPU(sh_env_get_cpu(s)), vpn << 10);
|
||||
}
|
||||
|
||||
} else {
|
||||
int index = (addr & 0x00003f00) >> 8;
|
||||
tlb_t * entry = &s->utlb[index];
|
||||
if (entry->v) {
|
||||
CPUState *cs = CPU(sh_env_get_cpu(s));
|
||||
|
||||
/* Overwriting valid entry in utlb. */
|
||||
target_ulong address = entry->vpn << 10;
|
||||
tlb_flush_page(s, address);
|
||||
tlb_flush_page(cs, address);
|
||||
}
|
||||
entry->asid = asid;
|
||||
entry->vpn = vpn;
|
||||
@ -797,7 +800,7 @@ void cpu_sh4_write_mmaped_utlb_data(CPUSH4State *s, hwaddr addr,
|
||||
if (entry->v) {
|
||||
/* Overwriting valid entry in utlb. */
|
||||
target_ulong address = entry->vpn << 10;
|
||||
tlb_flush_page(s, address);
|
||||
tlb_flush_page(CPU(sh_env_get_cpu(s)), address);
|
||||
}
|
||||
entry->ppn = (mem_value & 0x1ffffc00) >> 10;
|
||||
entry->v = (mem_value & 0x00000100) >> 8;
|
||||
|
@ -141,6 +141,7 @@ static void replace_tlb_entry(SparcTLBEntry *tlb,
|
||||
|
||||
/* flush page range if translation is valid */
|
||||
if (TTE_IS_VALID(tlb->tte)) {
|
||||
CPUState *cs = CPU(sparc_env_get_cpu(env1));
|
||||
|
||||
mask = 0xffffffffffffe000ULL;
|
||||
mask <<= 3 * ((tlb->tte >> 61) & 3);
|
||||
@ -149,7 +150,7 @@ static void replace_tlb_entry(SparcTLBEntry *tlb,
|
||||
va = tlb->tag & mask;
|
||||
|
||||
for (offset = 0; offset < size; offset += TARGET_PAGE_SIZE) {
|
||||
tlb_flush_page(env1, va + offset);
|
||||
tlb_flush_page(cs, va + offset);
|
||||
}
|
||||
}
|
||||
|
||||
@ -716,7 +717,9 @@ uint64_t helper_ld_asi(CPUSPARCState *env, target_ulong addr, int asi, int size,
|
||||
void helper_st_asi(CPUSPARCState *env, target_ulong addr, uint64_t val, int asi,
|
||||
int size)
|
||||
{
|
||||
CPUState *cs = CPU(sparc_env_get_cpu(env));
|
||||
SPARCCPU *cpu = sparc_env_get_cpu(env);
|
||||
CPUState *cs = CPU(cpu);
|
||||
|
||||
helper_check_align(env, addr, size - 1);
|
||||
switch (asi) {
|
||||
case 2: /* SuperSparc MXCC registers and Leon3 cache control */
|
||||
@ -862,7 +865,7 @@ void helper_st_asi(CPUSPARCState *env, target_ulong addr, uint64_t val, int asi,
|
||||
DPRINTF_MMU("mmu flush level %d\n", mmulev);
|
||||
switch (mmulev) {
|
||||
case 0: /* flush page */
|
||||
tlb_flush_page(env, addr & 0xfffff000);
|
||||
tlb_flush_page(CPU(cpu), addr & 0xfffff000);
|
||||
break;
|
||||
case 1: /* flush segment (256k) */
|
||||
case 2: /* flush region (16M) */
|
||||
|
@ -687,7 +687,7 @@ void HELPER(itlb)(CPUXtensaState *env, uint32_t v, uint32_t dtlb)
|
||||
uint32_t wi;
|
||||
xtensa_tlb_entry *entry = get_tlb_entry(env, v, dtlb, &wi);
|
||||
if (entry->variable && entry->asid) {
|
||||
tlb_flush_page(env, entry->vaddr);
|
||||
tlb_flush_page(CPU(xtensa_env_get_cpu(env)), entry->vaddr);
|
||||
entry->asid = 0;
|
||||
}
|
||||
}
|
||||
@ -732,21 +732,23 @@ void xtensa_tlb_set_entry_mmu(const CPUXtensaState *env,
|
||||
void xtensa_tlb_set_entry(CPUXtensaState *env, bool dtlb,
|
||||
unsigned wi, unsigned ei, uint32_t vpn, uint32_t pte)
|
||||
{
|
||||
XtensaCPU *cpu = xtensa_env_get_cpu(env);
|
||||
CPUState *cs = CPU(cpu);
|
||||
xtensa_tlb_entry *entry = xtensa_tlb_get_entry(env, dtlb, wi, ei);
|
||||
|
||||
if (xtensa_option_enabled(env->config, XTENSA_OPTION_MMU)) {
|
||||
if (entry->variable) {
|
||||
if (entry->asid) {
|
||||
tlb_flush_page(env, entry->vaddr);
|
||||
tlb_flush_page(cs, entry->vaddr);
|
||||
}
|
||||
xtensa_tlb_set_entry_mmu(env, entry, dtlb, wi, ei, vpn, pte);
|
||||
tlb_flush_page(env, entry->vaddr);
|
||||
tlb_flush_page(cs, entry->vaddr);
|
||||
} else {
|
||||
qemu_log("%s %d, %d, %d trying to set immutable entry\n",
|
||||
__func__, dtlb, wi, ei);
|
||||
}
|
||||
} else {
|
||||
tlb_flush_page(env, entry->vaddr);
|
||||
tlb_flush_page(cs, entry->vaddr);
|
||||
if (xtensa_option_enabled(env->config,
|
||||
XTENSA_OPTION_REGION_TRANSLATION)) {
|
||||
entry->paddr = pte & REGION_PAGE_MASK;
|
||||
|
Loading…
Reference in New Issue
Block a user