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

📄 arm_arch_interface.c

📁 skyeye的开源代码
💻 C
字号:
#include "armdefs.h"#include "skyeye_types.h"#include "armemu.h"ARMul_State *state;static int verbosity;extern int big_endian;static int mem_size = (1 << 21);static mem_config_t arm_mem;static cpu_config_t *p_arm_cpu;extern ARMword skyeye_cachetype;//chy 2005-08-01, borrow from wlm's 2005-07-26's changeARMwordARMul_Debug (ARMul_State * state, ARMword pc, ARMword instr){}voidARMul_ConsolePrint (ARMul_State * state, const char *format, ...){}voidARMul_CallCheck (ARMul_State * state, ARMword cur_pc, ARMword to_pc,		 ARMword instr){}static voidbase_termios_exit (void){//koodailar remove it for mingw 2005.12.18--------------------------------------                  #ifndef __MINGW32__	//tcsetattr (STDIN_FILENO, TCSANOW, &(state->base_termios));#endif//end --------------------------------------------------------------------------}static voidarm_reset_state (){	//chy 2003-01-14 seems another ARMul_Reset, the first is in ARMul_NewState	//chy 2003-08-19 mach_init should call ARMul_SelectProcess	//skyeye_config.mach->mach_init (state, skyeye_config.mach);	//chy:2003-08-19, after mach_init, because ARMul_Reset should after ARMul_SelectProcess	ARMul_Reset (state);	state->NextInstr = 0;	state->Emulate = 3;	// add step disassemble code here :teawater	state->disassemble = skyeye_config.can_step_disassemble;	io_reset (state);	/*from ARMul_Reset. */}static voidarm_init_state (){	ARMul_EmulateInit ();	state = ARMul_NewState ();	state->cpu = p_arm_cpu;	state->mem_bank = &arm_mem;//chy 2005-08-01, borrow from wlm's 2005-07-26's change	/*	 * 2007-01-24 removed the term-io functions by Anthony Lee,	 * moved to "device/uart/skyeye_uart_stdio.c".	 */	//it will be set in  skyeye_config.mach->mach_init(state, skyeye_config.mach);	state->abort_model = 0;//chy 2005-08-01 ---------------------------------------------	state->bigendSig = (big_endian ? HIGH : LOW);	ARMul_MemoryInit (state, mem_size);	ARMul_OSInit (state);	state->verbose = verbosity;	/*some option should init before read config. e.g. uart option. *///chy 2005-08-01 ---------------------------------------------//      skyeye_option_init (&skyeye_config);	//    skyeye_read_config ();	//chy 2005-08-01 commit and disable ksh's energy estimantion, will be recover in the future	/*added by ksh for energy estimation,in 2004-11-26 */	state->energy.energy_prof = skyeye_config.energy.energy_prof;	/*mach init */	skyeye_config.mach->mach_init (state, skyeye_config.mach);}static voidarm_step_once (){	//ARMul_DoInstr(state);	state->NextInstr = RESUME;      /* treat as PC change */	state->Reg[15] = ARMul_DoProg(state);	FLUSHPIPE;}static voidarm_set_pc (WORD pc){	state->Reg[15] = pc;}static WORDarm_get_pc(){	return (WORD)state->Reg[15];}static intarm_ICE_write_byte (WORD addr, uint8_t v){	return (ARMul_ICE_WriteByte (state, (ARMword) addr, (ARMword) v));}static int arm_ICE_read_byte (WORD addr, uint8_t *pv){	ARMword data;	int ret;	ret = ARMul_ICE_ReadByte (state, (ARMword) addr, &data);	*pv = (uint8_t)data ;	return (ret);}extern void at91_mach_init ();extern void ep7312_mach_init ();extern void lh79520_mach_init ();extern void ep9312_mach_init ();extern void s3c4510b_mach_init ();extern void s3c44b0x_mach_init ();extern void s3c3410x_mach_init ();extern void sa1100_mach_init ();extern void pxa250_mach_init ();extern void pxa270_mach_init ();extern void cs89712_mach_init ();extern void at91rm92_mach_init ();extern void s3c2410x_mach_init ();extern void s3c2440_mach_init ();extern void shp_mach_init ();extern void lpc_mach_init ();extern void ns9750_mach_init ();extern void lpc2210_mach_init();extern void ps7500_mach_init();extern void imx_mach_init();extern void integrator_mach_init();//chy 2003-08-11: the cpu_id can be found in linux/arch/arm/boot/compressed/head.Scpu_config_t arm_cpus[] = {	{"armv3", "arm710", 0x41007100, 0xfff8ff00, DATACACHE},	{"armv3", "arm7tdmi", 0x41007700, 0xfff8ff00, NONCACHE},	{"armv4", "arm720t", 0x41807200, 0xffffff00, DATACACHE},	{"armv4", "sa1110", SA1110, 0xfffffff0, INSTCACHE},	{"armv4", "sa1100", SA1100, 0xffffffe0, INSTCACHE},	{"armv4", "arm920t", 0x41009200, 0xff00fff0, INSTCACHE},	{"armv5", "arm926ejs", 0x41069260, 0xff0ffff0, INSTCACHE},	{"xscale", "pxa25x", PXA250, 0xfffffff0, INSTCACHE},	{"xscale", "pxa27x", PXA270, 0xfffffff0, INSTCACHE},	{"armv6",  "arm11", NULL,0x0,NULL}};static intarm_parse_cpu (const char *params[]){	int i;	for (i = 0; i < (sizeof (arm_cpus) / sizeof (cpu_config_t)); i++) {		if (!strncmp		    (params[0], arm_cpus[i].cpu_name, MAX_PARAM_NAME)) {			p_arm_cpu = &arm_cpus[i];			SKYEYE_INFO ("cpu info: %s, %s, %x, %x, %x \n",				     p_arm_cpu->cpu_arch_name,				     p_arm_cpu->cpu_name,				     p_arm_cpu->cpu_val,				     p_arm_cpu->cpu_mask,				     p_arm_cpu->cachetype);			skyeye_cachetype = p_arm_cpu->cachetype;			return 0;		}	}	SKYEYE_ERR ("Error: Unkonw cpu name \"%s\"\n", params[0]);	return -1;}machine_config_t arm_machines[] = {	/* machine define for cpu without mmu */	{"at91", at91_mach_init, NULL, NULL, NULL},		/* ATMEL AT91X40 */	{"lpc", lpc_mach_init, NULL, NULL, NULL},		/* PHILIPS LPC2xxxx */	{"s3c4510b", s3c4510b_mach_init, NULL, NULL, NULL},	/* Samsung s3c4510b */	{"s3c44b0x", s3c44b0x_mach_init, NULL, NULL, NULL},	/* Samsung s3c44b0x */	{"s3c44b0", s3c44b0x_mach_init, NULL, NULL, NULL},	/* Samsung s3c44b0x */	{"s3c3410x", s3c3410x_mach_init, NULL, NULL, NULL},	/* Samsung s3c3410x */	/* machine define for cpu with mmu */	{"ep7312", ep7312_mach_init, NULL, NULL, NULL},		/* Cirrus Logic EP7312 */	{"lh79520", lh79520_mach_init, NULL, NULL, NULL},	/* sharp LH79520 */	{"ep9312", ep9312_mach_init, NULL, NULL, NULL},		/* Cirrus Logic EP9312 */	{"cs89712", cs89712_mach_init, NULL, NULL, NULL},	/* cs89712 */	{"sa1100", sa1100_mach_init, NULL, NULL, NULL},		/* sa1100 */	{"pxa_lubbock", pxa250_mach_init, NULL, NULL, NULL},	/* xscale pxa250 lubbock developboard */	{"pxa_mainstone", pxa270_mach_init, NULL, NULL, NULL},	/* xscale pxa270 mainstone developboard */	{"at91rm92", at91rm92_mach_init, NULL, NULL, NULL},	/* at91RM9200 */	{"s3c2410x", s3c2410x_mach_init, NULL, NULL, NULL},	/* s3c2410x */	{"s3c2440", s3c2440_mach_init, NULL, NULL, NULL},	/* s3c2440 */	{"sharp_lh7a400", shp_mach_init, NULL, NULL, NULL},	/* sharp lh7a400 developboard */	{"ns9750", ns9750_mach_init, NULL, NULL, NULL},		/* NetSilicon ns9750 */	{"lpc2210", lpc2210_mach_init, NULL, NULL, NULL},	/* Philips LPC2210 */	{"ps7500", ps7500_mach_init, NULL, NULL, NULL},		/* Cirrus Logic PS7500FE */	{"imx", imx_mach_init, NULL, NULL, NULL},         /* Freescale imx */	{"integrator", integrator_mach_init, NULL, NULL, NULL},	/* integrator */};static intarm_parse_mach (machine_config_t * mach, const char *params[]){	int i;	for (i = 0; i < (sizeof (arm_machines) / sizeof (machine_config_t));	     i++) {		if (!strncmp		    (params[0], arm_machines[i].machine_name,		     MAX_PARAM_NAME)) {			skyeye_config.mach = &arm_machines[i];			SKYEYE_INFO				("mach info: name %s, mach_init addr %p\n",				 skyeye_config.mach->machine_name,				 skyeye_config.mach->mach_init);			return 0;		}	}	SKYEYE_ERR ("Error: Unkonw mach name \"%s\"\n", params[0]);	return -1;}/*mem bank*/extern ARMword real_read_word (ARMul_State * state, ARMword addr);extern void real_write_word (ARMul_State * state, ARMword addr, ARMword data);extern ARMword io_read_word (ARMul_State * state, ARMword addr);extern void io_write_word (ARMul_State * state, ARMword addr, ARMword data);/*ywc 2005-03-30*/extern ARMword flash_read_byte (ARMul_State * state, ARMword addr);extern void flash_write_byte (ARMul_State * state, ARMword addr,			      ARMword data);extern ARMword flash_read_halfword (ARMul_State * state, ARMword addr);extern void flash_write_halfword (ARMul_State * state, ARMword addr,				  ARMword data);extern ARMword flash_read_word (ARMul_State * state, ARMword addr);extern void flash_write_word (ARMul_State * state, ARMword addr,			      ARMword data);static intarm_parse_mem (int num_params, const char *params[]){	char name[MAX_PARAM_NAME], value[MAX_PARAM_NAME];	int i, num;//chy 2003-09-12, now support more io bank//      static int io_bank_num=0;	//state->mem_bank = (mem_config_t *)malloc(sizeof(mem_config_t));	mem_config_t *mc = &arm_mem;	mem_bank_t *mb = mc->mem_banks;	mc->bank_num = mc->current_num++;	num = mc->current_num - 1;	/*mem_banks should begin from 0. */	mb[num].filename[0] = '\0';	for (i = 0; i < num_params; i++) {		if (split_param (params[i], name, value) < 0)			SKYEYE_ERR				("Error: mem_bank %d has wrong parameter \"%s\".\n",				 num, name);		if (!strncmp ("map", name, strlen (name))) {			if (!strncmp ("M", value, strlen (value))) {				mb[num].read_byte = real_read_byte;				mb[num].write_byte = real_write_byte;				mb[num].read_halfword = real_read_halfword;				mb[num].write_halfword = real_write_halfword;				mb[num].read_word = real_read_word;				mb[num].write_word = real_write_word;				mb[num].type = MEMTYPE_RAM;			}			else if (!strncmp ("I", value, strlen (value))) {				mb[num].read_byte = io_read_byte;				mb[num].write_byte = io_write_byte;				mb[num].read_halfword = io_read_halfword;				mb[num].write_halfword = io_write_halfword;				mb[num].read_word = io_read_word;				mb[num].write_word = io_write_word;				mb[num].type = MEMTYPE_IO;				/*ywc 2005-03-30 */			}			else if (!strncmp ("F", value, strlen (value))) {				mb[num].read_byte = flash_read_byte;				mb[num].write_byte = flash_write_byte;				mb[num].read_halfword = flash_read_halfword;				mb[num].write_halfword = flash_write_halfword;				mb[num].read_word = flash_read_word;				mb[num].write_word = flash_write_word;				mb[num].type = MEMTYPE_FLASH;			}			else {				SKYEYE_ERR					("Error: mem_bank %d \"%s\" parameter has wrong value \"%s\"\n",					 num, name, value);			}		}		else if (!strncmp ("type", name, strlen (name))) {			//chy 2003-09-21: process type			if (!strncmp ("R", value, strlen (value))) {				if (mb[num].type == MEMTYPE_RAM)					mb[num].type = MEMTYPE_ROM;				mb[num].write_byte = warn_write_byte;				mb[num].write_halfword = warn_write_halfword;				mb[num].write_word = warn_write_word;			}		}		else if (!strncmp ("addr", name, strlen (name))) {			if (value[0] == '0' && value[1] == 'x')				mb[num].addr = strtoul (value, NULL, 16);			else				mb[num].addr = strtoul (value, NULL, 10);		}		else if (!strncmp ("size", name, strlen (name))) {			if (value[0] == '0' && value[1] == 'x')				mb[num].len = strtoul (value, NULL, 16);			else				mb[num].len = strtoul (value, NULL, 10);		}		else if (!strncmp ("file", name, strlen (name))) {			strncpy (mb[num].filename, value, strlen (value) + 1);		}		else if (!strncmp ("boot", name, strlen (name))) {			/*this must be the last parameter. */			if (!strncmp ("yes", value, strlen (value)))				skyeye_config.start_address = mb[num].addr;		}		else {			SKYEYE_ERR				("Error: mem_bank %d has unknow parameter \"%s\".\n",				 num, name);		}	}	return 0;}voidinit_arm_arch (){	static arch_config_t arm_arch;	arm_arch.arch_name = "arm";	arm_arch.init = arm_init_state;	arm_arch.reset = arm_reset_state;	arm_arch.set_pc = arm_set_pc;	arm_arch.get_pc = arm_get_pc;	arm_arch.step_once = arm_step_once;	arm_arch.ICE_write_byte = arm_ICE_write_byte;	arm_arch.ICE_read_byte = arm_ICE_read_byte;	arm_arch.parse_cpu = arm_parse_cpu;	arm_arch.parse_mach = arm_parse_mach;	arm_arch.parse_mem = arm_parse_mem;	register_arch (&arm_arch);}

⌨️ 快捷键说明

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