ppc_mmu.c

来自「skyeye是一个可以模拟嵌入式硬件开发板的系统软件」· C语言 代码 · 共 2,269 行 · 第 1/5 页

C
2,269
字号
					return false;				} else {					// ok					return true;				}			}			pteg_addr+=8;		}		hash1 = ~hash1;		h = PTE1_H;	}	return false;}bool ppc_prom_page_free(uint32 ea){	return true;}/*************************************************************************** *	MMU Opcodes */#include "ppc_dec.h"/* *	dcbz		Data Cache Clear to Zero *	.464 */void ppc_opc_dcbz(){#ifdef E500	//printf("DBG:In %s, for e500,cache is not implemented.\n",__FUNCTION__);#else	//PPC_L1_CACHE_LINE_SIZE	int rA, rD, rB;	PPC_OPC_TEMPL_X(gCPU.current_opc, rD, rA, rB);	// assert rD=0	uint32 a = (rA?gCPU.gpr[rA]:0)+gCPU.gpr[rB];	// BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA	ppc_write_effective_dword(a, 0)	|| ppc_write_effective_dword(a+8, 0)	|| ppc_write_effective_dword(a+16, 0)	|| ppc_write_effective_dword(a+24, 0);#endif}void ppc_opc_dcbtls(){#ifdef E500        //printf("DBG:In %s, for e500,cache is not implemented.\n",__FUNCTION__);#else	fprintf(stderr,"In %s, cache is not implemented.\n",__FUNCTION__);#endif}/* *	lbz		Load Byte and Zero *	.521 */void ppc_opc_lbz(){	int rA, rD;	uint32 imm;	PPC_OPC_TEMPL_D_SImm(gCPU.current_opc, rD, rA, imm);	uint8 r;	int ret = ppc_read_effective_byte((rA?gCPU.gpr[rA]:0)+imm, &r);	if (ret == PPC_MMU_OK) {		gCPU.gpr[rD] = r;	}}/* *	lbzu		Load Byte and Zero with Update *	.522 */void ppc_opc_lbzu(){	int rA, rD;	uint32 imm;	PPC_OPC_TEMPL_D_SImm(gCPU.current_opc, rD, rA, imm);	// FIXME: check rA!=0 && rA!=rD	uint8 r;	int ret = ppc_read_effective_byte(gCPU.gpr[rA]+imm, &r);	if (ret == PPC_MMU_OK) {		gCPU.gpr[rA] += imm;		gCPU.gpr[rD] = r;	}	}/* *	lbzux		Load Byte and Zero with Update Indexed *	.523 */void ppc_opc_lbzux(){	int rA, rD, rB;	PPC_OPC_TEMPL_X(gCPU.current_opc, rD, rA, rB);	// FIXME: check rA!=0 && rA!=rD	uint8 r;	int ret = ppc_read_effective_byte(gCPU.gpr[rA]+gCPU.gpr[rB], &r);	if (ret == PPC_MMU_OK) {		gCPU.gpr[rA] += gCPU.gpr[rB];		gCPU.gpr[rD] = r;	}}/* *	lbzx		Load Byte and Zero Indexed *	.524 */void ppc_opc_lbzx(){	int rA, rD, rB;	PPC_OPC_TEMPL_X(gCPU.current_opc, rD, rA, rB);	uint8 r;	int ret = ppc_read_effective_byte((rA?gCPU.gpr[rA]:0)+gCPU.gpr[rB], &r);	if (ret == PPC_MMU_OK) {		gCPU.gpr[rD] = r;	}}/* *	lfd		Load Floating-Point Double *	.530 */void ppc_opc_lfd(){	if ((gCPU.msr & MSR_FP) == 0) {		ppc_exception(PPC_EXC_NO_FPU, 0, 0);		return;	}	int rA, frD;	uint32 imm;	PPC_OPC_TEMPL_D_SImm(gCPU.current_opc, frD, rA, imm);	uint64 r;	int ret = ppc_read_effective_dword((rA?gCPU.gpr[rA]:0)+imm, &r);	if (ret == PPC_MMU_OK) {		gCPU.fpr[frD] = r;	}	}/* *	lfdu		Load Floating-Point Double with Update *	.531 */void ppc_opc_lfdu(){	if ((gCPU.msr & MSR_FP) == 0) {		ppc_exception(PPC_EXC_NO_FPU, 0, 0);		return;	}	int rA, frD;	uint32 imm;	PPC_OPC_TEMPL_D_SImm(gCPU.current_opc, frD, rA, imm);	// FIXME: check rA!=0	uint64 r;	int ret = ppc_read_effective_dword(gCPU.gpr[rA]+imm, &r);	if (ret == PPC_MMU_OK) {		gCPU.fpr[frD] = r;		gCPU.gpr[rA] += imm;	}	}/* *	lfdux		Load Floating-Point Double with Update Indexed *	.532 */void ppc_opc_lfdux(){	if ((gCPU.msr & MSR_FP) == 0) {		ppc_exception(PPC_EXC_NO_FPU, 0, 0);		return;	}	int rA, frD, rB;	PPC_OPC_TEMPL_X(gCPU.current_opc, frD, rA, rB);	// FIXME: check rA!=0	uint64 r;	int ret = ppc_read_effective_dword(gCPU.gpr[rA]+gCPU.gpr[rB], &r);	if (ret == PPC_MMU_OK) {		gCPU.gpr[rA] += gCPU.gpr[rB];		gCPU.fpr[frD] = r;	}	}/* *	lfdx		Load Floating-Point Double Indexed *	.533 */void ppc_opc_lfdx(){	if ((gCPU.msr & MSR_FP) == 0) {		ppc_exception(PPC_EXC_NO_FPU, 0, 0);		return;	}	int rA, frD, rB;	PPC_OPC_TEMPL_X(gCPU.current_opc, frD, rA, rB);	uint64 r;	int ret = ppc_read_effective_dword((rA?gCPU.gpr[rA]:0)+gCPU.gpr[rB], &r);	if (ret == PPC_MMU_OK) {		gCPU.fpr[frD] = r;	}	}/* *	lfs		Load Floating-Point Single *	.534 */void ppc_opc_lfs(){	if ((gCPU.msr & MSR_FP) == 0) {		ppc_exception(PPC_EXC_NO_FPU, 0, 0);		return;	}	int rA, frD;	uint32 imm;	PPC_OPC_TEMPL_D_SImm(gCPU.current_opc, frD, rA, imm);	uint32 r;	int ret = ppc_read_effective_word((rA?gCPU.gpr[rA]:0)+imm, &r);	if (ret == PPC_MMU_OK) {		ppc_single s;		ppc_double d;		ppc_fpu_unpack_single(&s, r);		ppc_fpu_single_to_double(&s, &d);		ppc_fpu_pack_double(&d, &(gCPU.fpr[frD]));	}	}/* *	lfsu		Load Floating-Point Single with Update *	.535 */void ppc_opc_lfsu(){	if ((gCPU.msr & MSR_FP) == 0) {		ppc_exception(PPC_EXC_NO_FPU, 0, 0);		return;	}	int rA, frD;	uint32 imm;	PPC_OPC_TEMPL_D_SImm(gCPU.current_opc, frD, rA, imm);	// FIXME: check rA!=0	uint32 r;	int ret = ppc_read_effective_word(gCPU.gpr[rA]+imm, &r);	if (ret == PPC_MMU_OK) {		ppc_single s;		ppc_double d;		ppc_fpu_unpack_single(&s, r);		ppc_fpu_single_to_double(&s, &d);		ppc_fpu_pack_double(&d, &(gCPU.fpr[frD]));		gCPU.gpr[rA] += imm;	}	}/* *	lfsux		Load Floating-Point Single with Update Indexed *	.536 */void ppc_opc_lfsux(){	if ((gCPU.msr & MSR_FP) == 0) {		ppc_exception(PPC_EXC_NO_FPU, 0, 0);		return;	}	int rA, frD, rB;	PPC_OPC_TEMPL_X(gCPU.current_opc, frD, rA, rB);	// FIXME: check rA!=0	uint32 r;	int ret = ppc_read_effective_word(gCPU.gpr[rA]+gCPU.gpr[rB], &r);	if (ret == PPC_MMU_OK) {		gCPU.gpr[rA] += gCPU.gpr[rB];		ppc_single s;		ppc_double d;		ppc_fpu_unpack_single(&s, r);		ppc_fpu_single_to_double(&s, &d);		ppc_fpu_pack_double(&d, &(gCPU.fpr[frD]));	}	}/* *	lfsx		Load Floating-Point Single Indexed *	.537 */void ppc_opc_lfsx(){	if ((gCPU.msr & MSR_FP) == 0) {		ppc_exception(PPC_EXC_NO_FPU, 0, 0);		return;	}	int rA, frD, rB;	PPC_OPC_TEMPL_X(gCPU.current_opc, frD, rA, rB);	uint32 r;	int ret = ppc_read_effective_word((rA?gCPU.gpr[rA]:0)+gCPU.gpr[rB], &r);	if (ret == PPC_MMU_OK) {		ppc_single s;		ppc_double d;		ppc_fpu_unpack_single(&s, r);		ppc_fpu_single_to_double(&s, &d);		ppc_fpu_pack_double(&d, &(gCPU.fpr[frD]));	}	}/* *	lha		Load Half Word Algebraic *	.538 */void ppc_opc_lha(){	int rA, rD;	uint32 imm;	PPC_OPC_TEMPL_D_SImm(gCPU.current_opc, rD, rA, imm);	uint16 r;	int ret = ppc_read_effective_half((rA?gCPU.gpr[rA]:0)+imm, &r);	if (ret == PPC_MMU_OK) {		gCPU.gpr[rD] = (r&0x8000)?(r|0xffff0000):r;	}}/* *	lhau		Load Half Word Algebraic with Update *	.539 */void ppc_opc_lhau(){	int rA, rD;	uint32 imm;	PPC_OPC_TEMPL_D_SImm(gCPU.current_opc, rD, rA, imm);	uint16 r;	// FIXME: rA != 0	int ret = ppc_read_effective_half(gCPU.gpr[rA]+imm, &r);	if (ret == PPC_MMU_OK) {		gCPU.gpr[rA] += imm;		gCPU.gpr[rD] = (r&0x8000)?(r|0xffff0000):r;	}}/* *	lhaux		Load Half Word Algebraic with Update Indexed *	.540 */void ppc_opc_lhaux(){	int rA, rD, rB;	PPC_OPC_TEMPL_X(gCPU.current_opc, rD, rA, rB);	uint16 r;	// FIXME: rA != 0	int ret = ppc_read_effective_half(gCPU.gpr[rA]+gCPU.gpr[rB], &r);	if (ret == PPC_MMU_OK) {		gCPU.gpr[rA] += gCPU.gpr[rB];		gCPU.gpr[rD] = (r&0x8000)?(r|0xffff0000):r;	}}/* *	lhax		Load Half Word Algebraic Indexed *	.541 */void ppc_opc_lhax(){	int rA, rD, rB;	PPC_OPC_TEMPL_X(gCPU.current_opc, rD, rA, rB);	uint16 r;	// FIXME: rA != 0	int ret = ppc_read_effective_half((rA?gCPU.gpr[rA]:0)+gCPU.gpr[rB], &r);	if (ret == PPC_MMU_OK) {		gCPU.gpr[rD] = (r&0x8000) ? (r|0xffff0000):r;	}}/* *	lhbrx		Load Half Word Byte-Reverse Indexed *	.542 */void ppc_opc_lhbrx(){	int rA, rD, rB;	PPC_OPC_TEMPL_X(gCPU.current_opc, rD, rA, rB);	uint16 r;	int ret = ppc_read_effective_half((rA?gCPU.gpr[rA]:0)+gCPU.gpr[rB], &r);	if (ret == PPC_MMU_OK) {		gCPU.gpr[rD] = ppc_bswap_half(r);	}}/* *	lhz		Load Half Word and Zero *	.543 */void ppc_opc_lhz(){	int rA, rD;	uint32 imm;	PPC_OPC_TEMPL_D_SImm(gCPU.current_opc, rD, rA, imm);	uint16 r;	int ret = ppc_read_effective_half((rA?gCPU.gpr[rA]:0)+imm, &r);	if (ret == PPC_MMU_OK) {		gCPU.gpr[rD] = r;	}}/* *	lhzu		Load Half Word and Zero with Update *	.544 */void ppc_opc_lhzu(){	int rA, rD;	uint32 imm;	PPC_OPC_TEMPL_D_SImm(gCPU.current_opc, rD, rA, imm);	uint16 r;	// FIXME: rA!=0	int ret = ppc_read_effective_half(gCPU.gpr[rA]+imm, &r);	if (ret == PPC_MMU_OK) {		gCPU.gpr[rD] = r;		gCPU.gpr[rA] += imm;	}}/* *	lhzux		Load Half Word and Zero with Update Indexed *	.545 */void ppc_opc_lhzux(){	int rA, rD, rB;	PPC_OPC_TEMPL_X(gCPU.current_opc, rD, rA, rB);	uint16 r;	// FIXME: rA != 0	int ret = ppc_read_effective_half(gCPU.gpr[rA]+gCPU.gpr[rB], &r);	if (ret == PPC_MMU_OK) {		gCPU.gpr[rA] += gCPU.gpr[rB];		gCPU.gpr[rD] = r;	}}/* *	lhzx		Load Half Word and Zero Indexed *	.546 */void ppc_opc_lhzx(){	int rA, rD, rB;	PPC_OPC_TEMPL_X(gCPU.current_opc, rD, rA, rB);	uint16 r;	int ret = ppc_read_effective_half((rA?gCPU.gpr[rA]:0)+gCPU.gpr[rB], &r);	if (ret == PPC_MMU_OK) {		gCPU.gpr[rD] = r;	}}/* *	lmw		Load Multiple Word *	.547 */void ppc_opc_lmw(){	int rD, rA;	uint32 imm;	PPC_OPC_TEMPL_D_SImm(gCPU.current_opc, rD, rA, imm);	uint32 ea = (rA ? gCPU.gpr[rA] : 0) + imm;	while (rD <= 31) {		if (ppc_read_effective_word(ea, &(gCPU.gpr[rD]))) {			return;		}		rD++;		ea += 4;	}}/* *	lswi		Load String Word Immediate *	.548 */void ppc_opc_lswi(){	int rA, rD, NB;	PPC_OPC_TEMPL_X(gCPU.current_opc, rD, rA, NB);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?