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

📄 arm2x86_mem.c

📁 SkyEye是一个可以运行嵌入式操作系统的硬件仿真工具
💻 C
📖 第 1 页 / 共 2 页
字号:
/* This program is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation; either version 2, or (at your option)any later version.This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See theGNU General Public License for more details.You should have received a copy of the GNU General Public License alongwith this program; if not, write to the Free Software Foundation, Inc.,59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  *//* * author teawater <c7code-uc@yahoo.com.cn> <teawater@gmail.com> */#include "armdefs.h"#include "arm2x86_self.h"uint32_ttea_ldm (ARMul_State * state, ARMword address, ARMword reg_map){	int i;	ARMword data;	for (i = 0; i < 16; i++) {		arm2x86_tmp_reg[i] = state->Reg[i];		if (reg_map & (1 << i)) {			data = ARMul_ReadWord (state, address);			if (state->abortSig != LOW) {				state->trap = TRAP_DATA_ABORT;				//if (state->is_XScale) {				if (!state->abort_model) {					return (0);				}				else {					break;				}			}			if (i == 15) {				arm2x86_tmp_reg[i] = (data & (~3)) + 4;			}			else {				arm2x86_tmp_reg[i] = data;			}			address += 4;		}	}	if (state->trap != TRAP_DATA_ABORT) {		for (i = 0; i < 16; i++) {			state->Reg[i] = arm2x86_tmp_reg[i];		}		address -= 4;	}	return (address);}uint32_ttea_ldm_user (ARMul_State * state, ARMword address, ARMword reg_map){	int i;	ARMword data;	for (i = 0; i < 15; i++) {		if (((state->Mode == FIQ26MODE || state->Mode == FIQ32MODE)		     && (i >= 8)) || (i >= 13)) {			arm2x86_tmp_reg[i] = state->RegBank[USERBANK][i];		}		else {			arm2x86_tmp_reg[i] = state->Reg[i];		}		arm2x86_tmp_reg[i] = state->Reg[i];		if (reg_map & (1 << i)) {			data = ARMul_ReadWord (state, address);			if (state->abortSig != LOW) {				state->trap = TRAP_DATA_ABORT;				//if (state->is_XScale) {				if (!state->abort_model) {					return (0);				}				else {					break;				}			}			/*if (((state->Mode == FIQ26MODE || state->Mode == FIQ32MODE) && (i >= 8)) || (i >= 13)) {			   state->RegBank[USERBANK][i] = data;			   }			   else {			   state->Reg[i] = data;			   } */			arm2x86_tmp_reg[i] = data;			address += 4;		}	}	if (state->trap != TRAP_DATA_ABORT) {		for (i = 0; i < 15; i++) {			if (((state->Mode == FIQ26MODE			      || state->Mode == FIQ32MODE) && (i >= 8))			    || (i >= 13)) {				state->RegBank[USERBANK][i] =					arm2x86_tmp_reg[i];			}			else {				state->Reg[i] = arm2x86_tmp_reg[i];			}		}		address -= 4;	}	return (address);}uint32_ttea_stm (ARMul_State * state, ARMword address, ARMword reg_map){	int i;	for (i = 0; i < 16; i++) {		if (reg_map & (1 << i)) {			if (i == 15) {				ARMul_WriteWord (state, address,						 state->Reg[i] + 4);			}			else {				ARMul_WriteWord (state, address,						 state->Reg[i]);			}			if (state->abortSig != LOW) {				state->trap = TRAP_DATA_ABORT;				//if (state->is_XScale) {				if (!state->abort_model) {					return (0);				}				else {					break;				}			}			address += 4;		}	}	if (state->trap != TRAP_DATA_ABORT) {		address -= 4;	}	return (address);}uint32_ttea_stm_user (ARMul_State * state, ARMword address, ARMword reg_map){	int i;	for (i = 0; i < 16; i++) {		if (reg_map & (1 << i)) {			if (i == 15) {				ARMul_WriteWord (state, address,						 state->Reg[i] + 4);			}			else {				if (((state->Mode == FIQ26MODE				      || state->Mode == FIQ32MODE)				     && (i >= 8)) || (i >= 13)) {					ARMul_WriteWord (state, address,							 state->							 RegBank[USERBANK]							 [i]);				}				else {					ARMul_WriteWord (state, address,							 state->Reg[i]);				}			}			if (state->abortSig != LOW) {				state->trap = TRAP_DATA_ABORT;				//if (state->is_XScale) {				if (!state->abort_model) {					return (0);				}				else {					break;				}			}			address += 4;		}	}	if (state->trap != TRAP_DATA_ABORT) {		address -= 4;	}	return (address);}//--------------------------------------------------------------------------------------------------uint8_t *get_op_ldr_T0_T1 (int *len){	unsigned int begin = 0, end = 0;	OP_BEGIN ("get_op_ldr_T0_T1");	//T0 = ARMul_ReadWord(st, T1);	__asm__ __volatile__ ("subl	$0x8, %esp");	__asm__ __volatile__ ("push	%" AREG_T1);	__asm__ __volatile__ ("push	%" AREG_st);//chy 2005-05-11#if !(defined(__CYGWIN__) || defined(__MINGW32__) || defined(__APPLE__))	arm2x86_pfun = (uint32_t) ARMul_ReadWord;	__asm__ __volatile__ ("call	*arm2x86_pfun");#else	arm2x86_pfun = (volatile void(*))ARMul_ReadWord;	wmb ();	(*arm2x86_pfun) ();#endif	__asm__ __volatile__ ("addl	$0x10, %esp");	__asm__ __volatile__ ("movl	%eax, %" AREG_T0);	if (st->abortSig != LOW) {		st->trap = TRAP_DATA_ABORT;		//if (st->is_XScale) {		if (st->abort_model < 2) {			__asm__ __volatile__ ("ret");		}	}	if (T1 & 3) {		T0 = LOADWORD_ALIGN (T1, T0);	}	OP_END ("get_op_ldr_T0_T1");	*len = end - begin;	return ((uint8_t *) begin);}uint8_t *get_op_ldr_T2_T1 (int *len){	unsigned int begin = 0, end = 0;	OP_BEGIN ("get_op_ldr_T2_T1");	//T2 = ARMul_ReadWord(st, T1);	__asm__ __volatile__ ("subl	$0x8, %esp");	__asm__ __volatile__ ("push	%" AREG_T1);	__asm__ __volatile__ ("push	%" AREG_st);//chy 2005-05-11#if !(defined(__CYGWIN__) || defined(__MINGW32__) || defined(__APPLE__))	arm2x86_pfun = (uint32_t) ARMul_ReadWord;	__asm__ __volatile__ ("call	*arm2x86_pfun");#else	arm2x86_pfun = (volatile void(*))ARMul_ReadWord;	wmb ();	(*arm2x86_pfun) ();#endif	__asm__ __volatile__ ("addl	$0x10, %esp");	__asm__ __volatile__ ("movl	%eax, %" AREG_T2);	if (st->abortSig != LOW) {		st->trap = TRAP_DATA_ABORT;		//if (st->is_XScale) {		if (st->abort_model < 2) {			__asm__ __volatile__ ("ret");		}	}	if (T1 & 3) {		T2 = LOADWORD_ALIGN (T1, T2);	}	OP_END ("get_op_ldr_T2_T1");	*len = end - begin;	return ((uint8_t *) begin);}uint8_t *get_op_ldrh_T0_T1 (int *len){	unsigned int begin = 0, end = 0;	OP_BEGIN ("get_op_ldrh_T0_T1");	//T0 = ARMul_LoadHalfWord(st, T1);	__asm__ __volatile__ ("subl	$0x8, %esp");	__asm__ __volatile__ ("push	%" AREG_T1);	__asm__ __volatile__ ("push	%" AREG_st);//chy 2005-05-11#if !(defined(__CYGWIN__) || defined(__MINGW32__) || defined(__APPLE__))	arm2x86_pfun = (uint32_t) ARMul_LoadHalfWord;	__asm__ __volatile__ ("call	*arm2x86_pfun");#else	arm2x86_pfun = (volatile void(*))ARMul_LoadHalfWord;	wmb ();	(*arm2x86_pfun) ();#endif	__asm__ __volatile__ ("addl	$0x10, %esp");	__asm__ __volatile__ ("movl	%eax, %" AREG_T0);	if (st->abortSig != LOW) {		st->trap = TRAP_DATA_ABORT;		//if (st->is_XScale) {		if (st->abort_model < 2) {			__asm__ __volatile__ ("ret");		}	}	OP_END ("get_op_ldrh_T0_T1");	*len = end - begin;	return ((uint8_t *) begin);}uint8_t *get_op_ldrb_T0_T1 (int *len){	unsigned int begin = 0, end = 0;	OP_BEGIN ("get_op_ldrb_T0_T1");	//T0 = ARMul_ReadByte(st, T1);	__asm__ __volatile__ ("subl	$0x8, %esp");	__asm__ __volatile__ ("push	%" AREG_T1);	__asm__ __volatile__ ("push	%" AREG_st);//chy 2005-05-11#if !(defined(__CYGWIN__) || defined(__MINGW32__) || defined(__APPLE__))	arm2x86_pfun = (uint32_t) ARMul_ReadByte;	__asm__ __volatile__ ("call	*arm2x86_pfun");#else	arm2x86_pfun = (volatile void(*))ARMul_ReadByte;	wmb ();	(*arm2x86_pfun) ();#endif	__asm__ __volatile__ ("addl	$0x10, %esp");	__asm__ __volatile__ ("movl	%eax, %" AREG_T0);	if (st->abortSig != LOW) {		st->trap = TRAP_DATA_ABORT;		//if (st->is_XScale) {		if (st->abort_model < 2) {			__asm__ __volatile__ ("ret");		}	}	OP_END ("get_op_ldrb_T0_T1");	*len = end - begin;	return ((uint8_t *) begin);}uint8_t *get_op_ldrb_T2_T1 (int *len){	unsigned int begin = 0, end = 0;	OP_BEGIN ("get_op_ldrb_T2_T1");	//T2 = ARMul_ReadByte(st, T1);	__asm__ __volatile__ ("subl	$0x8, %esp");	__asm__ __volatile__ ("push	%" AREG_T1);	__asm__ __volatile__ ("push	%" AREG_st);//chy 2005-05-11#if !(defined(__CYGWIN__) || defined(__MINGW32__) || defined(__APPLE__))	arm2x86_pfun = (uint32_t) ARMul_ReadByte;	__asm__ __volatile__ ("call	*arm2x86_pfun");#else	arm2x86_pfun = (volatile void(*))ARMul_ReadByte;	wmb ();	(*arm2x86_pfun) ();#endif	__asm__ __volatile__ ("addl	$0x10, %esp");	__asm__ __volatile__ ("movl	%eax, %" AREG_T2);	if (st->abortSig != LOW) {		st->trap = TRAP_DATA_ABORT;		//if (st->is_XScale) {		if (st->abort_model < 2) {			__asm__ __volatile__ ("ret");		}	}	OP_END ("get_op_ldrb_T2_T1");	*len = end - begin;	return ((uint8_t *) begin);}uint8_t *get_op_str_T0_T1 (int *len){	unsigned int begin = 0, end = 0;	OP_BEGIN ("get_op_str_T0_T1");	//ARMul_WriteWord(st, T1, T0);	__asm__ __volatile__ ("subl	$0x4, %esp");	__asm__ __volatile__ ("push	%" AREG_T0);	__asm__ __volatile__ ("push	%" AREG_T1);	__asm__ __volatile__ ("push	%" AREG_st);//chy 2005-05-11#if !(defined(__CYGWIN__) || defined(__MINGW32__) || defined(__APPLE__))	arm2x86_pfun = (uint32_t) ARMul_WriteWord;	__asm__ __volatile__ ("call	*arm2x86_pfun");#else	arm2x86_pfun = (volatile void(*))ARMul_WriteWord;	wmb ();	(*arm2x86_pfun) ();#endif	__asm__ __volatile__ ("addl	$0x10, %esp");	if (st->abortSig != LOW) {		st->trap = TRAP_DATA_ABORT;		//if (st->is_XScale) {		if (st->abort_model < 2) {			__asm__ __volatile__ ("ret");		}	}	OP_END ("get_op_str_T0_T1");	*len = end - begin;	return ((uint8_t *) begin);}uint8_t *get_op_strh_T0_T1 (int *len){	unsigned int begin = 0, end = 0;	OP_BEGIN ("get_op_strh_T0_T1");	//ARMul_StoreHalfWord(st, T1, T0);	__asm__ __volatile__ ("subl	$0x4, %esp");	__asm__ __volatile__ ("push	%" AREG_T0);	__asm__ __volatile__ ("push	%" AREG_T1);	__asm__ __volatile__ ("push	%" AREG_st);//chy 2005-05-11#if !(defined(__CYGWIN__) || defined(__MINGW32__) || defined(__APPLE__))	arm2x86_pfun = (uint32_t) ARMul_StoreHalfWord;	__asm__ __volatile__ ("call	*arm2x86_pfun");#else	arm2x86_pfun = (volatile void(*))ARMul_StoreHalfWord;	wmb ();	(*arm2x86_pfun) ();#endif	__asm__ __volatile__ ("addl	$0x10, %esp");	if (st->abortSig != LOW) {		st->trap = TRAP_DATA_ABORT;		if (st->abort_model < 2) {			//if (st->is_XScale) {			__asm__ __volatile__ ("ret");		}	}	OP_END ("get_op_strh_T0_T1");	*len = end - begin;	return ((uint8_t *) begin);}uint8_t *get_op_strb_T0_T1 (int *len){	unsigned int begin = 0, end = 0;	OP_BEGIN ("get_op_strb_T0_T1");	//ARMul_WriteByte(st, T1, T0);	__asm__ __volatile__ ("subl	$0x4, %esp");	__asm__ __volatile__ ("push	%" AREG_T0);	__asm__ __volatile__ ("push	%" AREG_T1);	__asm__ __volatile__ ("push	%" AREG_st);//chy 2005-05-11#if !(defined(__CYGWIN__) || defined(__MINGW32__) || defined(__APPLE__))

⌨️ 快捷键说明

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