Revision 28de16da target-cris/mmu.c

b/target-cris/mmu.c
140 140

  
141 141
	r_cause = env->sregs[SFR_R_MM_CAUSE];
142 142
	r_cfg = env->sregs[SFR_RW_MM_CFG];
143
	pid = env->pregs[PR_PID];
143
	pid = env->pregs[PR_PID] & 0xff;
144 144

  
145 145
	switch (rw) {
146 146
		case 2: rwcause = CRIS_MMU_ERR_EXEC; mmu = 0; break;
......
270 270
		/* Update RW_MM_CAUSE.  */
271 271
		set_field(&r_cause, rwcause, 8, 2);
272 272
		set_field(&r_cause, vpage, 13, 19);
273
		set_field(&r_cause, env->pregs[PR_PID], 0, 8);
273
		set_field(&r_cause, pid, 0, 8);
274 274
		env->sregs[SFR_R_MM_CAUSE] = r_cause;
275 275
		D(printf("refill vaddr=%x pc=%x\n", vaddr, env->pc));
276 276
	}
......
280 280
		  __func__, rw, match, env->pc,
281 281
		  vaddr, vpage,
282 282
		  tlb_vpn, tlb_pfn, tlb_pid, 
283
		  env->pregs[PR_PID],
283
		  pid,
284 284
		  r_cause,
285 285
		  env->sregs[SFR_RW_MM_TLB_SEL],
286 286
		  env->regs[R_SP], env->pregs[PR_USP], env->ksp));
......
315 315

  
316 316
				/* Kernel protected areas need to be flushed
317 317
				   as well.  */
318
				if (tlb_v && !tlb_g) {
318
				if (tlb_v && !tlb_g && (tlb_pid == pid || tlb_k)) {
319 319
					vaddr = tlb_vpn << TARGET_PAGE_BITS;
320 320
					D(fprintf(logfile,
321 321
						  "flush pid=%x vaddr=%x\n", 

Also available in: Unified diff