mmu_common.c (aa781c102a445e1007a307a972fed24c66b9c24c) mmu_common.c (68bf3a7bbc64d75d6a78a7d31b6b26e343a96320)
1/*
2 * PowerPC MMU, TLB, SLB and BAT emulation helpers for QEMU.
3 *
4 * Copyright (c) 2003-2007 Jocelyn Mayer
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either

--- 207 unchanged lines hidden (view full) ---

216 }
217 }
218 *blp = bl;
219 *validp = valid;
220 *protp = prot;
221}
222
223static int get_bat_6xx_tlb(CPUPPCState *env, mmu_ctx_t *ctx,
1/*
2 * PowerPC MMU, TLB, SLB and BAT emulation helpers for QEMU.
3 *
4 * Copyright (c) 2003-2007 Jocelyn Mayer
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either

--- 207 unchanged lines hidden (view full) ---

216 }
217 }
218 *blp = bl;
219 *validp = valid;
220 *protp = prot;
221}
222
223static int get_bat_6xx_tlb(CPUPPCState *env, mmu_ctx_t *ctx,
224 target_ulong virtual, MMUAccessType access_type)
224 target_ulong eaddr, MMUAccessType access_type)
225{
226 target_ulong *BATlt, *BATut, *BATu, *BATl;
227 target_ulong BEPIl, BEPIu, bl;
228 int i, valid, prot;
229 int ret = -1;
230 bool ifetch = access_type == MMU_INST_FETCH;
231
232 qemu_log_mask(CPU_LOG_MMU, "%s: %cBAT v " TARGET_FMT_lx "\n", __func__,
225{
226 target_ulong *BATlt, *BATut, *BATu, *BATl;
227 target_ulong BEPIl, BEPIu, bl;
228 int i, valid, prot;
229 int ret = -1;
230 bool ifetch = access_type == MMU_INST_FETCH;
231
232 qemu_log_mask(CPU_LOG_MMU, "%s: %cBAT v " TARGET_FMT_lx "\n", __func__,
233 ifetch ? 'I' : 'D', virtual);
233 ifetch ? 'I' : 'D', eaddr);
234 if (ifetch) {
235 BATlt = env->IBAT[1];
236 BATut = env->IBAT[0];
237 } else {
238 BATlt = env->DBAT[1];
239 BATut = env->DBAT[0];
240 }
241 for (i = 0; i < env->nb_BATs; i++) {
242 BATu = &BATut[i];
243 BATl = &BATlt[i];
244 BEPIu = *BATu & 0xF0000000;
245 BEPIl = *BATu & 0x0FFE0000;
246 bat_size_prot(env, &bl, &valid, &prot, BATu, BATl);
247 qemu_log_mask(CPU_LOG_MMU, "%s: %cBAT%d v " TARGET_FMT_lx " BATu "
248 TARGET_FMT_lx " BATl " TARGET_FMT_lx "\n", __func__,
234 if (ifetch) {
235 BATlt = env->IBAT[1];
236 BATut = env->IBAT[0];
237 } else {
238 BATlt = env->DBAT[1];
239 BATut = env->DBAT[0];
240 }
241 for (i = 0; i < env->nb_BATs; i++) {
242 BATu = &BATut[i];
243 BATl = &BATlt[i];
244 BEPIu = *BATu & 0xF0000000;
245 BEPIl = *BATu & 0x0FFE0000;
246 bat_size_prot(env, &bl, &valid, &prot, BATu, BATl);
247 qemu_log_mask(CPU_LOG_MMU, "%s: %cBAT%d v " TARGET_FMT_lx " BATu "
248 TARGET_FMT_lx " BATl " TARGET_FMT_lx "\n", __func__,
249 ifetch ? 'I' : 'D', i, virtual, *BATu, *BATl);
250 if ((virtual & 0xF0000000) == BEPIu &&
251 ((virtual & 0x0FFE0000) & ~bl) == BEPIl) {
249 ifetch ? 'I' : 'D', i, eaddr, *BATu, *BATl);
250 if ((eaddr & 0xF0000000) == BEPIu &&
251 ((eaddr & 0x0FFE0000) & ~bl) == BEPIl) {
252 /* BAT matches */
253 if (valid != 0) {
254 /* Get physical address */
255 ctx->raddr = (*BATl & 0xF0000000) |
252 /* BAT matches */
253 if (valid != 0) {
254 /* Get physical address */
255 ctx->raddr = (*BATl & 0xF0000000) |
256 ((virtual & 0x0FFE0000 & bl) | (*BATl & 0x0FFE0000)) |
257 (virtual & 0x0001F000);
256 ((eaddr & 0x0FFE0000 & bl) | (*BATl & 0x0FFE0000)) |
257 (eaddr & 0x0001F000);
258 /* Compute access rights */
259 ctx->prot = prot;
260 if (check_prot_access_type(ctx->prot, access_type)) {
261 qemu_log_mask(CPU_LOG_MMU, "BAT %d match: r " HWADDR_FMT_plx
262 " prot=%c%c\n", i, ctx->raddr,
263 ctx->prot & PAGE_READ ? 'R' : '-',
264 ctx->prot & PAGE_WRITE ? 'W' : '-');
265 ret = 0;
266 } else {
267 ret = -2;
268 }
269 break;
270 }
271 }
272 }
273 if (ret < 0) {
274 if (qemu_log_enabled()) {
275 qemu_log_mask(CPU_LOG_MMU, "no BAT match for "
258 /* Compute access rights */
259 ctx->prot = prot;
260 if (check_prot_access_type(ctx->prot, access_type)) {
261 qemu_log_mask(CPU_LOG_MMU, "BAT %d match: r " HWADDR_FMT_plx
262 " prot=%c%c\n", i, ctx->raddr,
263 ctx->prot & PAGE_READ ? 'R' : '-',
264 ctx->prot & PAGE_WRITE ? 'W' : '-');
265 ret = 0;
266 } else {
267 ret = -2;
268 }
269 break;
270 }
271 }
272 }
273 if (ret < 0) {
274 if (qemu_log_enabled()) {
275 qemu_log_mask(CPU_LOG_MMU, "no BAT match for "
276 TARGET_FMT_lx ":\n", virtual);
276 TARGET_FMT_lx ":\n", eaddr);
277 for (i = 0; i < 4; i++) {
278 BATu = &BATut[i];
279 BATl = &BATlt[i];
280 BEPIu = *BATu & 0xF0000000;
281 BEPIl = *BATu & 0x0FFE0000;
282 bl = (*BATu & 0x00001FFC) << 15;
283 qemu_log_mask(CPU_LOG_MMU, "%s: %cBAT%d v " TARGET_FMT_lx
284 " BATu " TARGET_FMT_lx " BATl " TARGET_FMT_lx
285 "\n\t" TARGET_FMT_lx " " TARGET_FMT_lx " "
286 TARGET_FMT_lx "\n", __func__, ifetch ? 'I' : 'D',
277 for (i = 0; i < 4; i++) {
278 BATu = &BATut[i];
279 BATl = &BATlt[i];
280 BEPIu = *BATu & 0xF0000000;
281 BEPIl = *BATu & 0x0FFE0000;
282 bl = (*BATu & 0x00001FFC) << 15;
283 qemu_log_mask(CPU_LOG_MMU, "%s: %cBAT%d v " TARGET_FMT_lx
284 " BATu " TARGET_FMT_lx " BATl " TARGET_FMT_lx
285 "\n\t" TARGET_FMT_lx " " TARGET_FMT_lx " "
286 TARGET_FMT_lx "\n", __func__, ifetch ? 'I' : 'D',
287 i, virtual, *BATu, *BATl, BEPIu, BEPIl, bl);
287 i, eaddr, *BATu, *BATl, BEPIu, BEPIl, bl);
288 }
289 }
290 }
291 /* No hit */
292 return ret;
293}
294
295static int mmu6xx_get_physical_address(CPUPPCState *env, mmu_ctx_t *ctx,

--- 612 unchanged lines hidden ---
288 }
289 }
290 }
291 /* No hit */
292 return ret;
293}
294
295static int mmu6xx_get_physical_address(CPUPPCState *env, mmu_ctx_t *ctx,

--- 612 unchanged lines hidden ---