PowerPC merge (Jocelyn Mayer)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@566 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
		
							parent
							
								
									3f5dcc340c
								
							
						
					
					
						commit
						985a19d6d1
					
				@ -453,13 +453,6 @@ PPC_OP(reset_scrfx)
 | 
				
			|||||||
    RETURN();
 | 
					    RETURN();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Set reservation */
 | 
					 | 
				
			||||||
PPC_OP(set_reservation)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    regs->reserve = T0 & ~0x03;
 | 
					 | 
				
			||||||
    RETURN();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* crf operations */
 | 
					/* crf operations */
 | 
				
			||||||
PPC_OP(getbit_T0)
 | 
					PPC_OP(getbit_T0)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
				
			|||||||
@ -349,9 +349,13 @@ void do_fnabs (void)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Instruction cache invalidation helper */
 | 
					/* Instruction cache invalidation helper */
 | 
				
			||||||
 | 
					#define ICACHE_LINE_SIZE 32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void do_icbi (void)
 | 
					void do_icbi (void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    //    tb_invalidate_page(T0);
 | 
					    /* Invalidate one cache line */
 | 
				
			||||||
 | 
					    T0 &= ~(ICACHE_LINE_SIZE - 1);
 | 
				
			||||||
 | 
					    tb_invalidate_page_range(T0, T0 + ICACHE_LINE_SIZE);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* TLB invalidation helpers */
 | 
					/* TLB invalidation helpers */
 | 
				
			||||||
 | 
				
			|||||||
@ -134,6 +134,19 @@ PPC_OP(glue(glue(l, name), MEMSUFFIX))                                        \
 | 
				
			|||||||
PPC_LDF_OP(fd, ldfq);
 | 
					PPC_LDF_OP(fd, ldfq);
 | 
				
			||||||
PPC_LDF_OP(fs, ldfl);
 | 
					PPC_LDF_OP(fs, ldfl);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Load and set reservation */
 | 
				
			||||||
 | 
					PPC_OP(glue(lwarx, MEMSUFFIX))
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (T0 & 0x03) {
 | 
				
			||||||
 | 
					        do_queue_exception(EXCP_ALIGN);
 | 
				
			||||||
 | 
					        do_process_exceptions();
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
						glue(ldl, MEMSUFFIX)((void *)T0);
 | 
				
			||||||
 | 
						regs->reserve = T0 & ~0x03;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    RETURN();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Store with reservation */
 | 
					/* Store with reservation */
 | 
				
			||||||
PPC_OP(glue(stwcx, MEMSUFFIX))
 | 
					PPC_OP(glue(stwcx, MEMSUFFIX))
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
				
			|||||||
@ -1302,8 +1302,14 @@ GEN_HANDLER(isync, 0x13, 0x16, 0xFF, 0x03FF0801, PPC_MEM)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
/* lwarx */
 | 
					/* lwarx */
 | 
				
			||||||
#if defined(CONFIG_USER_ONLY)
 | 
					#if defined(CONFIG_USER_ONLY)
 | 
				
			||||||
 | 
					#define op_lwarx() gen_op_lwarx_raw()
 | 
				
			||||||
#define op_stwcx() gen_op_stwcx_raw()
 | 
					#define op_stwcx() gen_op_stwcx_raw()
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
 | 
					#define op_lwarx() (*gen_op_lwarx[ctx->mem_idx])()
 | 
				
			||||||
 | 
					static GenOpFunc *gen_op_lwarx[] = {
 | 
				
			||||||
 | 
					    &gen_op_lwarx_user,
 | 
				
			||||||
 | 
					    &gen_op_lwarx_kernel,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
#define op_stwcx() (*gen_op_stwcx[ctx->mem_idx])()
 | 
					#define op_stwcx() (*gen_op_stwcx[ctx->mem_idx])()
 | 
				
			||||||
static GenOpFunc *gen_op_stwcx[] = {
 | 
					static GenOpFunc *gen_op_stwcx[] = {
 | 
				
			||||||
    &gen_op_stwcx_user,
 | 
					    &gen_op_stwcx_user,
 | 
				
			||||||
@ -1320,9 +1326,8 @@ GEN_HANDLER(lwarx, 0x1F, 0x14, 0xFF, 0x00000001, PPC_RES)
 | 
				
			|||||||
        gen_op_load_gpr_T1(rB(ctx->opcode));
 | 
					        gen_op_load_gpr_T1(rB(ctx->opcode));
 | 
				
			||||||
        gen_op_add();
 | 
					        gen_op_add();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    op_ldst(lwz);
 | 
					    op_lwarx();
 | 
				
			||||||
    gen_op_store_T1_gpr(rD(ctx->opcode));
 | 
					    gen_op_store_T1_gpr(rD(ctx->opcode));
 | 
				
			||||||
    gen_op_set_reservation();
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* stwcx. */
 | 
					/* stwcx. */
 | 
				
			||||||
@ -3169,9 +3174,11 @@ int gen_intermediate_code_internal (CPUState *env, TranslationBlock *tb,
 | 
				
			|||||||
        while (lj <= j)
 | 
					        while (lj <= j)
 | 
				
			||||||
            gen_opc_instr_start[lj++] = 0;
 | 
					            gen_opc_instr_start[lj++] = 0;
 | 
				
			||||||
        tb->size = 0;
 | 
					        tb->size = 0;
 | 
				
			||||||
 | 
					#if 0
 | 
				
			||||||
        if (loglevel > 0) {
 | 
					        if (loglevel > 0) {
 | 
				
			||||||
            page_dump(logfile);
 | 
					            page_dump(logfile);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        tb->size = (uint32_t)ctx.nip - pc_start;
 | 
					        tb->size = (uint32_t)ctx.nip - pc_start;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user