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 --- |