⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mipsmem.c

📁 skyeye的开源代码
💻 C
字号:
#include "skyeye_config.h"#include "mipsdef.h"#include "emul.h"mips_mem_state_t mips_mem;mips_mem_bank_t *mips_global_mbp;//This is the memory banks congfigure variableextern mips_mem_config_t mips_mem_config;extern MIPS_State* mstate;extern FILE * skyeye_logfd;void mips_mem_reset (){	int i, num, bank;	FILE *f;	unsigned char *p;	long s;	UInt32 swap;	mips_mem_config_t *mc = &mips_mem_config;	mips_mem_bank_t *mb = mc->mem_banks;	num = mc->current_num;	for (i = 0; i < num; i++) {		bank = i;		if (mips_mem.rom[bank])			free (mips_mem.rom[bank]);		//chy 2003-09-21: if mem type =MEMTYPE_IO, we need not malloc space for it.		mips_mem.rom_size[bank] = mb[bank].len;		if (mb[bank].type != MEMTYPE_IO) {			mips_mem.rom[bank] = malloc (mb[bank].len);			if (!mips_mem.rom[bank]) {				fprintf (stderr,					 "SKYEYE: mem_reset: Error allocating mem for bank number %d.\n",					 bank);				exit (-1);			}							if (mb[bank].filename			    && (f = fopen (mb[bank].filename, "r"))) {				if (fread				    (mips_mem.rom[bank], 1, mb[bank].len,				     f) <= 0) {					perror ("fread");					fprintf (stderr,						 "Failed to load '%s'\n",						 mb[bank].filename);					skyeye_exit (-1);				}				fclose (f);				p = (char *) mips_mem.rom[bank];				s = 0;				while (s < mips_mem.rom_size[bank]) {					if (mstate->bigendSig == 1)	/*big enddian? */						swap = ((UInt32) p[3]) |							(((UInt32) p[2]) <<							 8) | (((UInt32)								p[1]) << 16) |							(((UInt32) p[0]) <<							 24);					else						swap = ((UInt32) p[0]) |							(((UInt32) p[1]) <<							 8) | (((UInt32)								p[2]) << 16) |							(((UInt32) p[3]) <<							 24);					*(UInt32 *) p = swap;					p += 4;					s += 4;				}				/*ywc 2004-03-30 */				if (mb[bank].type == MEMTYPE_FLASH) {					printf ("Loaded FLASH %s\n",						mb[bank].filename);				}				else if (mb[bank].type == MEMTYPE_RAM) {					printf ("Loaded RAM   %s\n",						mb[bank].filename);				}				else if (mb[bank].type == MEMTYPE_ROM) {					printf ("Loaded ROM   %s\n",						mb[bank].filename);				}			}			else if (mb[bank].filename[0] != '\0') {				perror (mb[bank].filename);				fprintf (stderr,					 "bank %d, Couldn't open boot ROM %s - execution will "					 "commence with the debuger.\n", bank,					 mb[bank].filename);				skyeye_exit (-1);			}		}	}			/*end  for(i = 0;i < num; i++) */}// the address used here is the physical address  UInt32 mips_real_read_byte (UInt32 addr){	UInt32 data;	UInt32 offset;	// the data is stored in the rom place in bunk(mips_global_mbp - mips_mem_config->mem_banks),	data = mips_mem.rom[mips_global_mbp -			      mips_mem_config.mem_banks][(addr -			      mips_global_mbp->addr) >> 2];	offset = (((UInt32) mstate->bigendSig * 3) ^ (addr & 3)) << 3; //Shi yang 2006-08-18	return (data >> offset) & 0xffL;}UInt32 mips_real_read_halfword (UInt32 addr){	UInt32 data;	UInt32 offset;	// the data is stored  in the rom place in bunk(mips_global_mbp - mips_mem_config->mem_banks),	data = mips_mem.rom[mips_global_mbp -			      mips_mem_config.mem_banks][(addr -							   mips_global_mbp->							   addr) >> 2];	offset = (((UInt32) mstate->bigendSig * 2) ^ (addr & 2)) << 3; //Shi yang 2006-08-18		return ((data >> offset) & 0xffff);}UInt32mips_real_read_word (UInt32 addr){	UInt32 data;	UInt32 offset;	data = mips_mem.rom[(mips_global_mbp -			      mips_mem_config.mem_banks)][(addr -							   mips_global_mbp->							   addr) >> 2];//    fprintf(skyeye_logfd,"after real_read_word addr=0x%x,pc=0x%x, data=0x%x\n", addr, mstate->pc, mips_mem.rom[0][(0x3c5ed8 >> 2)]);	return data;}UInt64mips_real_read_doubleword (UInt32 addr){	UInt64 data;		data = mips_mem.rom[mips_global_mbp -			      mips_mem_config.mem_banks][(addr -							   mips_global_mbp->							   addr) >> 3];	return data ;}voidmips_real_write_byte (UInt32 addr, UInt32 data){	UInt32 *temp;	UInt32 offset;	temp = &(mips_mem.rom[mips_global_mbp -			       mips_mem_config.mem_banks][(addr -			    mips_global_mbp->addr) >> 2]);		offset = (((UInt32) mstate->bigendSig * 3) ^ (addr & 3)) << 3; //Shi yang 2006-08-18		*temp = (*temp & ~(0xffL << offset)) | ((data & 0xffL) << offset);}voidmips_real_write_halfword ( UInt32 addr, UInt32 data){	UInt32 *temp;	UInt32 offset;		temp = &(mips_mem.rom[mips_global_mbp -			       mips_mem_config.mem_banks][(addr -							    mips_global_mbp->							    addr) >> 2]);	offset = (((UInt32) mstate->bigendSig * 2) ^ (addr & 2)) << 3; //Shi yang 2006-08-18	*temp = (*temp & ~(0xffffL << offset)) | ((data & 0xffffL) << offset);}voidmips_real_write_word (UInt32 addr, UInt32 data){	UInt32 *temp;	//fprintf(skyeye_logfd,"before addr=0x%x,pc=0x%x,data=0x%x\n", addr, mstate->pc, mips_mem.rom[0][(0x3c5ed8 >> 2)]);		temp = &(mips_mem.rom[mips_global_mbp -			       mips_mem_config.mem_banks]				[(addr - mips_global_mbp->addr) >> 2]);	*temp = data;	//fprintf(skyeye_logfd,"after addr=0x%x,pc=0x%x, data=0x%x\n", addr, mstate->pc, mips_mem.rom[0][(0x3c5ed8 >> 2)]);}voidmips_real_write_doubleword ( UInt32 addr, UInt64 data){	 mips_mem.rom[mips_global_mbp -		       mips_mem_config.mem_banks][(addr -						    mips_global_mbp->addr) >> 3] =data;}//Flash address spaceUInt32mips_flash_read_byte (UInt32 addr){	return mips_real_read_byte(addr);}UInt32mips_flash_read_halfword (UInt32 addr){	return mips_real_read_halfword(addr);}UInt32mips_flash_read_word (UInt32 addr){	return mips_real_read_word(addr);}UInt64mips_flash_read_doubleword (UInt32 addr){	return mips_real_read_doubleword(addr);}voidmips_flash_write_byte (UInt32 addr, UInt32 data){	mips_real_write_byte(addr, data);}voidmips_flash_write_halfword (UInt32 addr, UInt32 data){	mips_real_write_halfword(addr, data);}voidmips_flash_write_word (UInt32 addr, UInt32 data){	mips_real_write_word(addr, data);}voidmips_flash_write_doubleword (UInt32 addr, UInt64 data){	mips_real_write_doubleword(addr, data);}//these fuctions are used for warningvoidmips_warn_write_byte (UInt32 addr, UInt32 data){	fprintf (stderr,		 "SKYEYE: WARNING: illegal write byte to 0x%x of 0x%x @ 0x%x\n",		 addr, data, mstate->pc);}voidmips_warn_write_halfword (UInt32 addr, UInt32 data){	fprintf (stderr,		 "SKYEYE: WARNING: illegal write halfword to 0x%x of 0x%x @ 0x%x\n",		 addr, data, mstate->pc);}voidmips_warn_write_word (UInt32 addr, UInt32 data){	fprintf (stderr,		 "SKYEYE: WARNING: illegal write word to 0x%x of 0x%x @ 0x%x\n",		 addr, data, mstate->pc);}mips_mem_bank_t*mips_bank_ptr (UInt32 addr){	// chy 2005-01-06 add teawater's codes for speed,but I tested it, can not find the big improve	// chy 2005-01-06 maybe some one  examines below. now I commit teatwater's codes	//mem_bank_t *mbp;	//---------teawater add for arm2ia32 2004.12.04-----------------	//mem_bank_t *mbp;	static mips_mem_bank_t *mbp = NULL;	if (mbp) {		if ((mbp->addr <= addr) && ((addr - mbp->addr) < mbp->len))			return (mbp);	}	//printf("mem_bank: 0x%08x\n",mips_mem_config.mem_banks);	//AJ2D----------------------------------------------------------	//search for the proper memory bank	for (mbp = mips_mem_config.mem_banks; mbp->len; mbp++)		if ((mbp->addr <= addr) && ((addr - mbp->addr) < mbp->len))			{			//printf("mbp addr: 0x%08x, mbp len: 0x%08x, addr: 0x%08x\n",mbp->addr, mbp->len, addr);			return (mbp);			}	return (NULL);}void mips_mem_write_byte (UInt32 phys_addr, UInt32 v){		//translate the  physical address to the 32 bits 	UInt32 addr = bits(phys_addr, 31, 0);	//get the memory bank of the address	mips_global_mbp = mips_bank_ptr (addr);		if (mips_global_mbp && mips_global_mbp->write_byte) {		mips_global_mbp->write_byte (addr, v);	} else {		fprintf(stderr,"mips memory write error in %s, addr=0x%x,pc=0x%x..\n",__FUNCTION__,addr, mstate->pc);		skyeye_exit(-1);	}}void mips_mem_write_halfword (UInt32 phys_addr, UInt32 v){	UInt32 addr = bits(phys_addr, 31, 0);		mips_global_mbp = mips_bank_ptr (addr);	if (mips_global_mbp && mips_global_mbp->write_halfword) {		/*ywc 2005-03-31 */		/*ywc 2005-04-22 move it to real_write_halfword */		/*		   if(!skyeye_config.no_dbct){		   //teawater add for arm2x86 2005.03.18----------------------------------		   tb_setdirty(state, addr, mbp);		   //AJ2D----------------------------------------------------------		   }		 */		//mbp->write_halfword(state, addr, data);		mips_global_mbp->write_halfword (addr, v);	} else {		fprintf(stderr,"mips memory write error in %s..\n",__FUNCTION__);		skyeye_exit(-1);	}}void mips_mem_write_word (UInt32 phys_addr, UInt32 v){	UInt32 addr = bits(phys_addr, 31, 0);		mips_global_mbp = mips_bank_ptr (addr);	//if (mbp && mbp->write_halfword){	if (mips_global_mbp && mips_global_mbp->write_word) {		/*ywc 2005-03-31 */		/*ywc 2005-04-22 move it to real_write_halfword */		/*		   if(!skyeye_config.no_dbct){		   //teawater add for arm2x86 2005.03.18----------------------------------		   tb_setdirty(state, addr, mbp);		   //AJ2D----------------------------------------------------------		   }		 */		//mbp->write_halfword(state, addr, data);		mips_global_mbp->write_word (addr, v);	} else {		fprintf(stderr,"mips memory write error in %s,addr=0x%x, pc=0x%x..\n", __FUNCTION__, addr, mstate->pc);		exit(-1);	}}void mips_mem_write_doubleword (UInt64 phys_addr, UInt64 v){	UInt32 addr = bits(phys_addr, 31, 0);		mips_global_mbp = mips_bank_ptr (addr);	if (mips_global_mbp && mips_global_mbp->write_doubleword) {		/*ywc 2005-03-31 */		/*ywc 2005-04-22 move it to real_write_halfword */		/*		   if(!skyeye_config.no_dbct){		   //teawater add for arm2x86 2005.03.18----------------------------------		   tb_setdirty(state, addr, mbp);		   //AJ2D----------------------------------------------------------		   }		 */		//mbp->write_halfword(state, addr, data);		mips_global_mbp->write_doubleword (addr, v);	} else {		fprintf(stderr,"mips memory write error in %s..\n",__FUNCTION__);		skyeye_exit(-1);	}}UInt32mips_mem_read_byte (UInt32 phys_addr){	UInt32 addr = bits(phys_addr, 31, 0);	mips_global_mbp = mips_bank_ptr (addr);	if (mips_global_mbp && mips_global_mbp->read_byte)		return mips_global_mbp->read_byte (addr);	else {		return 0;	}}UInt32mips_mem_read_halfword (UInt32 phys_addr){	UInt32 addr = bits(phys_addr,31,0);	mips_global_mbp = mips_bank_ptr (addr);	if (mips_global_mbp && mips_global_mbp->read_halfword)		return mips_global_mbp->read_halfword (addr);	else {		return 0;	}}UInt32mips_mem_read_word (UInt32 phys_addr){	UInt32 addr = bits(phys_addr, 31, 0);	mips_global_mbp = mips_bank_ptr (addr);	if (mips_global_mbp && mips_global_mbp->read_word)		return mips_global_mbp->read_word (addr);	else {		return 0;	}}UInt64mips_mem_read_doubleword (UInt64 phys_addr){	UInt32 addr = bits(phys_addr, 31, 0);	mips_global_mbp = mips_bank_ptr (addr);	if (mips_global_mbp && mips_global_mbp->read_doubleword)		return mips_global_mbp->read_doubleword (addr);	else {		return 0;	}}void mips_mmu_write_byte (MIPS_State* mstate, UInt32 vir_addr, UInt32 v){	//translate the virtual address  to phsical address	PA phys_addr = translate_vaddr(mstate, (VA)vir_addr, data_store);	mips_mem_write_byte ((UInt32)phys_addr, v);}void mipsMul_WriteByte (MIPS_State* mstate, UInt32 vir_addr, UInt32 v){	mips_mmu_write_byte (mstate, vir_addr, v);}

⌨️ 快捷键说明

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