armdefs.h 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807
  1. /* armdefs.h -- ARMulator common definitions: ARM6 Instruction Emulator.
  2. Copyright (C) 1994 Advanced RISC Machines Ltd.
  3. This program is free software; you can redistribute it and/or modify
  4. it under the terms of the GNU General Public License as published by
  5. the Free Software Foundation; either version 2 of the License, or
  6. (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with this program; if not, write to the Free Software
  13. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
  14. #ifndef _ARMDEFS_H_
  15. #define _ARMDEFS_H_
  16. #include <cerrno>
  17. #include <csignal>
  18. #include <cstdio>
  19. #include <cstdlib>
  20. #include <cstring>
  21. #include <fcntl.h>
  22. #include <sys/stat.h>
  23. #include <sys/types.h>
  24. #include "arm_regformat.h"
  25. #include "common/common_types.h"
  26. #include "common/platform.h"
  27. #include "core/arm/skyeye_common/armmmu.h"
  28. #include "core/arm/skyeye_common/skyeye_defs.h"
  29. #if EMU_PLATFORM == PLATFORM_LINUX
  30. #include <sys/time.h>
  31. #include <unistd.h>
  32. #endif
  33. #if 0
  34. #if 0
  35. #define DIFF_STATE 1
  36. #define __FOLLOW_MODE__ 0
  37. #else
  38. #define DIFF_STATE 0
  39. #define __FOLLOW_MODE__ 1
  40. #endif
  41. #endif
  42. #ifndef FALSE
  43. #define FALSE 0
  44. #define TRUE 1
  45. #endif
  46. #define LOW 0
  47. #define HIGH 1
  48. #define LOWHIGH 1
  49. #define HIGHLOW 2
  50. //#define DBCT_TEST_SPEED
  51. #define DBCT_TEST_SPEED_SEC 10
  52. #define ARM_BYTE_TYPE 0
  53. #define ARM_HALFWORD_TYPE 1
  54. #define ARM_WORD_TYPE 2
  55. //the define of cachetype
  56. #define NONCACHE 0
  57. #define DATACACHE 1
  58. #define INSTCACHE 2
  59. #ifndef __STDC__
  60. typedef char *VoidStar;
  61. #endif
  62. typedef u64 ARMdword; // must be 64 bits wide
  63. typedef u32 ARMword; // must be 32 bits wide
  64. typedef u16 ARMhword; // must be 16 bits wide
  65. typedef u8 ARMbyte; // must be 8 bits wide
  66. typedef struct ARMul_State ARMul_State;
  67. typedef struct ARMul_io ARMul_io;
  68. typedef struct ARMul_Energy ARMul_Energy;
  69. typedef unsigned ARMul_CPInits(ARMul_State* state);
  70. typedef unsigned ARMul_CPExits(ARMul_State* state);
  71. typedef unsigned ARMul_LDCs(ARMul_State* state, unsigned type, ARMword instr, ARMword value);
  72. typedef unsigned ARMul_STCs(ARMul_State* state, unsigned type, ARMword instr, ARMword* value);
  73. typedef unsigned ARMul_MRCs(ARMul_State* state, unsigned type, ARMword instr, ARMword* value);
  74. typedef unsigned ARMul_MCRs(ARMul_State* state, unsigned type, ARMword instr, ARMword value);
  75. typedef unsigned ARMul_MRRCs(ARMul_State* state, unsigned type, ARMword instr, ARMword* value1, ARMword* value2);
  76. typedef unsigned ARMul_MCRRs(ARMul_State* state, unsigned type, ARMword instr, ARMword value1, ARMword value2);
  77. typedef unsigned ARMul_CDPs(ARMul_State* state, unsigned type, ARMword instr);
  78. typedef unsigned ARMul_CPReads(ARMul_State* state, unsigned reg, ARMword* value);
  79. typedef unsigned ARMul_CPWrites(ARMul_State* state, unsigned reg, ARMword value);
  80. //added by ksh,2004-3-5
  81. struct ARMul_io
  82. {
  83. ARMword *instr; // to display the current interrupt state
  84. ARMword *net_flag; // to judge if network is enabled
  85. ARMword *net_int; // netcard interrupt
  86. //ywc,2004-04-01
  87. ARMword *ts_int;
  88. ARMword *ts_is_enable;
  89. ARMword *ts_addr_begin;
  90. ARMword *ts_addr_end;
  91. ARMword *ts_buffer;
  92. };
  93. /* added by ksh,2004-11-26,some energy profiling */
  94. struct ARMul_Energy
  95. {
  96. int energy_prof; /* <tktan> BUG200103282109 : for energy profiling */
  97. int enable_func_energy; /* <tktan> BUG200105181702 */
  98. char *func_energy;
  99. int func_display; /* <tktan> BUG200103311509 : for function call display */
  100. int func_disp_start; /* <tktan> BUG200104191428 : to start func profiling */
  101. char *start_func; /* <tktan> BUG200104191428 */
  102. FILE *outfile; /* <tktan> BUG200105201531 : direct console to file */
  103. long long tcycle, pcycle;
  104. float t_energy;
  105. void *cur_task; /* <tktan> BUG200103291737 */
  106. long long t_mem_cycle, t_idle_cycle, t_uart_cycle;
  107. long long p_mem_cycle, p_idle_cycle, p_uart_cycle;
  108. long long p_io_update_tcycle;
  109. /*record CCCR,to get current core frequency */
  110. ARMword cccr;
  111. };
  112. #if 0
  113. #define MAX_BANK 8
  114. #define MAX_STR 1024
  115. typedef struct mem_bank
  116. {
  117. ARMword (*read_byte) (ARMul_State* state, ARMword addr);
  118. void (*write_byte) (ARMul_State* state, ARMword addr, ARMword data);
  119. ARMword (*read_halfword) (ARMul_State* state, ARMword addr);
  120. void (*write_halfword) (ARMul_State* state, ARMword addr, ARMword data);
  121. ARMword (*read_word) (ARMul_State* state, ARMword addr);
  122. void (*write_word) (ARMul_State* state, ARMword addr, ARMword data);
  123. unsigned int addr, len;
  124. char filename[MAX_STR];
  125. unsigned type; //chy 2003-09-21: maybe io,ram,rom
  126. } mem_bank_t;
  127. typedef struct
  128. {
  129. int bank_num;
  130. int current_num; /*current num of bank */
  131. mem_bank_t mem_banks[MAX_BANK];
  132. } mem_config_t;
  133. #endif
  134. #define VFP_REG_NUM 64
  135. struct ARMul_State
  136. {
  137. ARMword Emulate; /* to start and stop emulation */
  138. unsigned EndCondition; /* reason for stopping */
  139. unsigned ErrorCode; /* type of illegal instruction */
  140. /* Order of the following register should not be modified */
  141. ARMword Reg[16]; /* the current register file */
  142. ARMword Cpsr; /* the current psr */
  143. ARMword Spsr_copy;
  144. ARMword phys_pc;
  145. ARMword Reg_usr[2];
  146. ARMword Reg_svc[2]; /* R13_SVC R14_SVC */
  147. ARMword Reg_abort[2]; /* R13_ABORT R14_ABORT */
  148. ARMword Reg_undef[2]; /* R13 UNDEF R14 UNDEF */
  149. ARMword Reg_irq[2]; /* R13_IRQ R14_IRQ */
  150. ARMword Reg_firq[7]; /* R8---R14 FIRQ */
  151. ARMword Spsr[7]; /* the exception psr's */
  152. ARMword Mode; /* the current mode */
  153. ARMword Bank; /* the current register bank */
  154. ARMword exclusive_tag;
  155. ARMword exclusive_state;
  156. ARMword exclusive_result;
  157. ARMword CP15[VFP_BASE - CP15_BASE];
  158. ARMword VFP[3]; /* FPSID, FPSCR, and FPEXC */
  159. /* VFPv2 and VFPv3-D16 has 16 doubleword registers (D0-D16 or S0-S31).
  160. VFPv3-D32/ASIMD may have up to 32 doubleword registers (D0-D31),
  161. and only 32 singleword registers are accessible (S0-S31). */
  162. ARMword ExtReg[VFP_REG_NUM];
  163. /* ---- End of the ordered registers ---- */
  164. ARMword RegBank[7][16]; /* all the registers */
  165. //chy:2003-08-19, used in arm xscale
  166. /* 40 bit accumulator. We always keep this 64 bits wide,
  167. and move only 40 bits out of it in an MRA insn. */
  168. ARMdword Accumulator;
  169. ARMword NFlag, ZFlag, CFlag, VFlag, IFFlags; /* dummy flags for speed */
  170. unsigned long long int icounter, debug_icounter, kernel_icounter;
  171. unsigned int shifter_carry_out;
  172. //ARMword translate_pc;
  173. /* add armv6 flags dyf:2010-08-09 */
  174. ARMword GEFlag, EFlag, AFlag, QFlag;
  175. //chy:2003-08-19, used in arm v5e|xscale
  176. ARMword SFlag;
  177. #ifdef MODET
  178. ARMword TFlag; /* Thumb state */
  179. #endif
  180. ARMword instr, pc, temp; /* saved register state */
  181. ARMword loaded, decoded; /* saved pipeline state */
  182. //chy 2006-04-12 for ICE breakpoint
  183. ARMword loaded_addr, decoded_addr; /* saved pipeline state addr*/
  184. unsigned int NumScycles, NumNcycles, NumIcycles, NumCcycles, NumFcycles; /* emulated cycles used */
  185. unsigned long long NumInstrs; /* the number of instructions executed */
  186. unsigned NumInstrsToExecute;
  187. ARMword currentexaddr;
  188. ARMword currentexval;
  189. ARMword currentexvald;
  190. ARMword servaddr;
  191. unsigned NextInstr;
  192. unsigned VectorCatch; /* caught exception mask */
  193. unsigned CallDebug; /* set to call the debugger */
  194. unsigned CanWatch; /* set by memory interface if its willing to suffer the
  195. overhead of checking for watchpoints on each memory
  196. access */
  197. unsigned int StopHandle;
  198. char *CommandLine; /* Command Line from ARMsd */
  199. ARMul_CPInits *CPInit[16]; /* coprocessor initialisers */
  200. ARMul_CPExits *CPExit[16]; /* coprocessor finalisers */
  201. ARMul_LDCs *LDC[16]; /* LDC instruction */
  202. ARMul_STCs *STC[16]; /* STC instruction */
  203. ARMul_MRCs *MRC[16]; /* MRC instruction */
  204. ARMul_MCRs *MCR[16]; /* MCR instruction */
  205. ARMul_MRRCs *MRRC[16]; /* MRRC instruction */
  206. ARMul_MCRRs *MCRR[16]; /* MCRR instruction */
  207. ARMul_CDPs *CDP[16]; /* CDP instruction */
  208. ARMul_CPReads *CPRead[16]; /* Read CP register */
  209. ARMul_CPWrites *CPWrite[16]; /* Write CP register */
  210. unsigned char *CPData[16]; /* Coprocessor data */
  211. unsigned char const *CPRegWords[16]; /* map of coprocessor register sizes */
  212. unsigned EventSet; /* the number of events in the queue */
  213. unsigned int Now; /* time to the nearest cycle */
  214. struct EventNode **EventPtr; /* the event list */
  215. unsigned Debug; /* show instructions as they are executed */
  216. unsigned NresetSig; /* reset the processor */
  217. unsigned NfiqSig;
  218. unsigned NirqSig;
  219. unsigned abortSig;
  220. unsigned NtransSig;
  221. unsigned bigendSig;
  222. unsigned prog32Sig;
  223. unsigned data32Sig;
  224. unsigned syscallSig;
  225. /* 2004-05-09 chy
  226. ----------------------------------------------------------
  227. read ARM Architecture Reference Manual
  228. 2.6.5 Data Abort
  229. There are three Abort Model in ARM arch.
  230. Early Abort Model: used in some ARMv3 and earlier implementations. In this
  231. model, base register wirteback occurred for LDC,LDM,STC,STM instructions, and
  232. the base register was unchanged for all other instructions. (oldest)
  233. Base Restored Abort Model: If a Data Abort occurs in an instruction which
  234. specifies base register writeback, the value in the base register is
  235. unchanged. (strongarm, xscale)
  236. Base Updated Abort Model: If a Data Abort occurs in an instruction which
  237. specifies base register writeback, the base register writeback still occurs.
  238. (arm720T)
  239. read PART B
  240. chap2 The System Control Coprocessor CP15
  241. 2.4 Register1:control register
  242. L(bit 6): in some ARMv3 and earlier implementations, the abort model of the
  243. processor could be configured:
  244. 0=early Abort Model Selected(now obsolete)
  245. 1=Late Abort Model selceted(same as Base Updated Abort Model)
  246. on later processors, this bit reads as 1 and ignores writes.
  247. -------------------------------------------------------------
  248. So, if lateabtSig=1, then it means Late Abort Model(Base Updated Abort Model)
  249. if lateabtSig=0, then it means Base Restored Abort Model
  250. */
  251. unsigned lateabtSig;
  252. ARMword Vector; /* synthesize aborts in cycle modes */
  253. ARMword Aborted; /* sticky flag for aborts */
  254. ARMword Reseted; /* sticky flag for Reset */
  255. ARMword Inted, LastInted; /* sticky flags for interrupts */
  256. ARMword Base; /* extra hand for base writeback */
  257. ARMword AbortAddr; /* to keep track of Prefetch aborts */
  258. const struct Dbg_HostosInterface *hostif;
  259. int verbose; /* non-zero means print various messages like the banner */
  260. int mmu_inited;
  261. //mem_state_t mem;
  262. /*remove io_state to skyeye_mach_*.c files */
  263. //io_state_t io;
  264. /* point to a interrupt pending register. now for skyeye-ne2k.c
  265. * later should move somewhere. e.g machine_config_t*/
  266. //chy: 2003-08-11, for different arm core type
  267. unsigned is_v4; /* Are we emulating a v4 architecture (or higher) ? */
  268. unsigned is_v5; /* Are we emulating a v5 architecture ? */
  269. unsigned is_v5e; /* Are we emulating a v5e architecture ? */
  270. unsigned is_v6; /* Are we emulating a v6 architecture ? */
  271. unsigned is_v7; /* Are we emulating a v7 architecture ? */
  272. unsigned is_XScale; /* Are we emulating an XScale architecture ? */
  273. unsigned is_iWMMXt; /* Are we emulating an iWMMXt co-processor ? */
  274. unsigned is_ep9312; /* Are we emulating a Cirrus Maverick co-processor ? */
  275. //chy 2005-09-19
  276. unsigned is_pxa27x; /* Are we emulating a Intel PXA27x co-processor ? */
  277. //chy: seems only used in xscale's CP14
  278. unsigned int LastTime; /* Value of last call to ARMul_Time() */
  279. ARMword CP14R0_CCD; /* used to count 64 clock cycles with CP14 R0 bit 3 set */
  280. //added by ksh:for handle different machs io 2004-3-5
  281. ARMul_io mach_io;
  282. /*added by ksh,2004-11-26,some energy profiling*/
  283. ARMul_Energy energy;
  284. //teawater add for next_dis 2004.10.27-----------------------
  285. int disassemble;
  286. //teawater add for arm2x86 2005.02.15-------------------------------------------
  287. u32 trap;
  288. u32 tea_break_addr;
  289. u32 tea_break_ok;
  290. int tea_pc;
  291. //teawater add for arm2x86 2005.07.05-------------------------------------------
  292. //arm_arm A2-18
  293. int abort_model; //0 Base Restored Abort Model, 1 the Early Abort Model, 2 Base Updated Abort Model
  294. //teawater change for return if running tb dirty 2005.07.09---------------------
  295. void *tb_now;
  296. //teawater add for record reg value to ./reg.txt 2005.07.10---------------------
  297. FILE *tea_reg_fd;
  298. /*added by ksh in 2005-10-1*/
  299. cpu_config_t *cpu;
  300. //mem_config_t *mem_bank;
  301. /* added LPC remap function */
  302. int vector_remap_flag;
  303. u32 vector_remap_addr;
  304. u32 vector_remap_size;
  305. u32 step;
  306. u32 cycle;
  307. int stop_simulator;
  308. conf_object_t *dyncom_cpu;
  309. //teawater add DBCT_TEST_SPEED 2005.10.04---------------------------------------
  310. #ifdef DBCT_TEST_SPEED
  311. uint64_t instr_count;
  312. #endif //DBCT_TEST_SPEED
  313. // FILE * state_log;
  314. //diff log
  315. //#if DIFF_STATE
  316. FILE * state_log;
  317. //#endif
  318. /* monitored memory for exclusice access */
  319. ARMword exclusive_tag_array[128];
  320. /* 1 means exclusive access and 0 means open access */
  321. ARMword exclusive_access_state;
  322. memory_space_intf space;
  323. u32 CurrInstr;
  324. u32 last_pc; /* the last pc executed */
  325. u32 last_instr; /* the last inst executed */
  326. u32 WriteAddr[17];
  327. u32 WriteData[17];
  328. u32 WritePc[17];
  329. u32 CurrWrite;
  330. };
  331. #define DIFF_WRITE 0
  332. typedef ARMul_State arm_core_t;
  333. #define ResetPin NresetSig
  334. #define FIQPin NfiqSig
  335. #define IRQPin NirqSig
  336. #define AbortPin abortSig
  337. #define TransPin NtransSig
  338. #define BigEndPin bigendSig
  339. #define Prog32Pin prog32Sig
  340. #define Data32Pin data32Sig
  341. #define LateAbortPin lateabtSig
  342. /***************************************************************************\
  343. * Types of ARM we know about *
  344. \***************************************************************************/
  345. /* The bitflags */
  346. #define ARM_Fix26_Prop 0x01
  347. #define ARM_Nexec_Prop 0x02
  348. #define ARM_Debug_Prop 0x10
  349. #define ARM_Isync_Prop ARM_Debug_Prop
  350. #define ARM_Lock_Prop 0x20
  351. #define ARM_v4_Prop 0x40
  352. #define ARM_v5_Prop 0x80
  353. #define ARM_v6_Prop 0xc0
  354. #define ARM_v5e_Prop 0x100
  355. #define ARM_XScale_Prop 0x200
  356. #define ARM_ep9312_Prop 0x400
  357. #define ARM_iWMMXt_Prop 0x800
  358. #define ARM_PXA27X_Prop 0x1000
  359. #define ARM_v7_Prop 0x2000
  360. /* ARM2 family */
  361. #define ARM2 (ARM_Fix26_Prop)
  362. #define ARM2as ARM2
  363. #define ARM61 ARM2
  364. #define ARM3 ARM2
  365. #ifdef ARM60 /* previous definition in armopts.h */
  366. #undef ARM60
  367. #endif
  368. /* ARM6 family */
  369. #define ARM6 (ARM_Lock_Prop)
  370. #define ARM60 ARM6
  371. #define ARM600 ARM6
  372. #define ARM610 ARM6
  373. #define ARM620 ARM6
  374. /***************************************************************************\
  375. * Macros to extract instruction fields *
  376. \***************************************************************************/
  377. #define BIT(n) ( (ARMword)(instr>>(n))&1) /* bit n of instruction */
  378. #define BITS(m,n) ( (ARMword)(instr<<(31-(n))) >> ((31-(n))+(m)) ) /* bits m to n of instr */
  379. #define TOPBITS(n) (instr >> (n)) /* bits 31 to n of instr */
  380. /***************************************************************************\
  381. * The hardware vector addresses *
  382. \***************************************************************************/
  383. #define ARMResetV 0L
  384. #define ARMUndefinedInstrV 4L
  385. #define ARMSWIV 8L
  386. #define ARMPrefetchAbortV 12L
  387. #define ARMDataAbortV 16L
  388. #define ARMAddrExceptnV 20L
  389. #define ARMIRQV 24L
  390. #define ARMFIQV 28L
  391. #define ARMErrorV 32L /* This is an offset, not an address ! */
  392. #define ARMul_ResetV ARMResetV
  393. #define ARMul_UndefinedInstrV ARMUndefinedInstrV
  394. #define ARMul_SWIV ARMSWIV
  395. #define ARMul_PrefetchAbortV ARMPrefetchAbortV
  396. #define ARMul_DataAbortV ARMDataAbortV
  397. #define ARMul_AddrExceptnV ARMAddrExceptnV
  398. #define ARMul_IRQV ARMIRQV
  399. #define ARMul_FIQV ARMFIQV
  400. /***************************************************************************\
  401. * Mode and Bank Constants *
  402. \***************************************************************************/
  403. #define USER26MODE 0L
  404. #define FIQ26MODE 1L
  405. #define IRQ26MODE 2L
  406. #define SVC26MODE 3L
  407. #define USER32MODE 16L
  408. #define FIQ32MODE 17L
  409. #define IRQ32MODE 18L
  410. #define SVC32MODE 19L
  411. #define ABORT32MODE 23L
  412. #define UNDEF32MODE 27L
  413. //chy 2006-02-15 add system32 mode
  414. #define SYSTEM32MODE 31L
  415. #define ARM32BITMODE (state->Mode > 3)
  416. #define ARM26BITMODE (state->Mode <= 3)
  417. #define ARMMODE (state->Mode)
  418. #define ARMul_MODEBITS 0x1fL
  419. #define ARMul_MODE32BIT ARM32BITMODE
  420. #define ARMul_MODE26BIT ARM26BITMODE
  421. #define USERBANK 0
  422. #define FIQBANK 1
  423. #define IRQBANK 2
  424. #define SVCBANK 3
  425. #define ABORTBANK 4
  426. #define UNDEFBANK 5
  427. #define DUMMYBANK 6
  428. #define SYSTEMBANK USERBANK
  429. #define BANK_CAN_ACCESS_SPSR(bank) \
  430. ((bank) != USERBANK && (bank) != SYSTEMBANK && (bank) != DUMMYBANK)
  431. /***************************************************************************\
  432. * Definitons of things in the emulator *
  433. \***************************************************************************/
  434. #ifdef __cplusplus
  435. extern "C" {
  436. #endif
  437. extern void ARMul_EmulateInit();
  438. extern void ARMul_Reset(ARMul_State* state);
  439. #ifdef __cplusplus
  440. }
  441. #endif
  442. extern ARMul_State *ARMul_NewState(ARMul_State* state);
  443. extern ARMword ARMul_DoProg(ARMul_State* state);
  444. extern ARMword ARMul_DoInstr(ARMul_State* state);
  445. /***************************************************************************\
  446. * Definitons of things for event handling *
  447. \***************************************************************************/
  448. extern void ARMul_ScheduleEvent(ARMul_State* state, unsigned int delay, unsigned(*func) ());
  449. extern void ARMul_EnvokeEvent(ARMul_State* state);
  450. extern unsigned int ARMul_Time(ARMul_State* state);
  451. /***************************************************************************\
  452. * Useful support routines *
  453. \***************************************************************************/
  454. extern ARMword ARMul_GetReg (ARMul_State* state, unsigned mode, unsigned reg);
  455. extern void ARMul_SetReg (ARMul_State* state, unsigned mode, unsigned reg, ARMword value);
  456. extern ARMword ARMul_GetPC(ARMul_State* state);
  457. extern ARMword ARMul_GetNextPC(ARMul_State* state);
  458. extern void ARMul_SetPC(ARMul_State* state, ARMword value);
  459. extern ARMword ARMul_GetR15(ARMul_State* state);
  460. extern void ARMul_SetR15(ARMul_State* state, ARMword value);
  461. extern ARMword ARMul_GetCPSR(ARMul_State* state);
  462. extern void ARMul_SetCPSR(ARMul_State* state, ARMword value);
  463. extern ARMword ARMul_GetSPSR(ARMul_State* state, ARMword mode);
  464. extern void ARMul_SetSPSR(ARMul_State* state, ARMword mode, ARMword value);
  465. /***************************************************************************\
  466. * Definitons of things to handle aborts *
  467. \***************************************************************************/
  468. extern void ARMul_Abort(ARMul_State* state, ARMword address);
  469. #ifdef MODET
  470. #define ARMul_ABORTWORD (state->TFlag ? 0xefffdfff : 0xefffffff) /* SWI -1 */
  471. #define ARMul_PREFETCHABORT(address) if (state->AbortAddr == 1) \
  472. state->AbortAddr = (address & (state->TFlag ? ~1L : ~3L))
  473. #else
  474. #define ARMul_ABORTWORD 0xefffffff /* SWI -1 */
  475. #define ARMul_PREFETCHABORT(address) if (state->AbortAddr == 1) \
  476. state->AbortAddr = (address & ~3L)
  477. #endif
  478. #define ARMul_DATAABORT(address) state->abortSig = HIGH ; \
  479. state->Aborted = ARMul_DataAbortV ;
  480. #define ARMul_CLEARABORT state->abortSig = LOW
  481. /***************************************************************************\
  482. * Definitons of things in the memory interface *
  483. \***************************************************************************/
  484. extern unsigned ARMul_MemoryInit(ARMul_State* state, unsigned int initmemsize);
  485. extern void ARMul_MemoryExit(ARMul_State* state);
  486. extern ARMword ARMul_LoadInstrS(ARMul_State* state, ARMword address, ARMword isize);
  487. extern ARMword ARMul_LoadInstrN(ARMul_State* state, ARMword address, ARMword isize);
  488. #ifdef __cplusplus
  489. extern "C" {
  490. #endif
  491. extern ARMword ARMul_ReLoadInstr(ARMul_State* state, ARMword address, ARMword isize);
  492. #ifdef __cplusplus
  493. }
  494. #endif
  495. extern ARMword ARMul_LoadWordS(ARMul_State* state, ARMword address);
  496. extern ARMword ARMul_LoadWordN(ARMul_State* state, ARMword address);
  497. extern ARMword ARMul_LoadHalfWord(ARMul_State* state, ARMword address);
  498. extern ARMword ARMul_LoadByte(ARMul_State* state, ARMword address);
  499. extern void ARMul_StoreWordS(ARMul_State* state, ARMword address, ARMword data);
  500. extern void ARMul_StoreWordN(ARMul_State* state, ARMword address, ARMword data);
  501. extern void ARMul_StoreHalfWord(ARMul_State* state, ARMword address, ARMword data);
  502. extern void ARMul_StoreByte(ARMul_State* state, ARMword address, ARMword data);
  503. extern ARMword ARMul_SwapWord(ARMul_State* state, ARMword address, ARMword data);
  504. extern ARMword ARMul_SwapByte(ARMul_State* state, ARMword address, ARMword data);
  505. extern void ARMul_Icycles(ARMul_State* state, unsigned number, ARMword address);
  506. extern void ARMul_Ccycles(ARMul_State* state, unsigned number, ARMword address);
  507. extern ARMword ARMul_ReadWord(ARMul_State* state, ARMword address);
  508. extern ARMword ARMul_ReadByte(ARMul_State* state, ARMword address);
  509. extern void ARMul_WriteWord(ARMul_State* state, ARMword address, ARMword data);
  510. extern void ARMul_WriteByte(ARMul_State* state, ARMword address, ARMword data);
  511. extern ARMword ARMul_MemAccess(ARMul_State* state, ARMword, ARMword,
  512. ARMword, ARMword, ARMword, ARMword, ARMword,
  513. ARMword, ARMword, ARMword);
  514. /***************************************************************************\
  515. * Definitons of things in the co-processor interface *
  516. \***************************************************************************/
  517. #define ARMul_FIRST 0
  518. #define ARMul_TRANSFER 1
  519. #define ARMul_BUSY 2
  520. #define ARMul_DATA 3
  521. #define ARMul_INTERRUPT 4
  522. #define ARMul_DONE 0
  523. #define ARMul_CANT 1
  524. #define ARMul_INC 3
  525. #define ARMul_CP13_R0_FIQ 0x1
  526. #define ARMul_CP13_R0_IRQ 0x2
  527. #define ARMul_CP13_R8_PMUS 0x1
  528. #define ARMul_CP14_R0_ENABLE 0x0001
  529. #define ARMul_CP14_R0_CLKRST 0x0004
  530. #define ARMul_CP14_R0_CCD 0x0008
  531. #define ARMul_CP14_R0_INTEN0 0x0010
  532. #define ARMul_CP14_R0_INTEN1 0x0020
  533. #define ARMul_CP14_R0_INTEN2 0x0040
  534. #define ARMul_CP14_R0_FLAG0 0x0100
  535. #define ARMul_CP14_R0_FLAG1 0x0200
  536. #define ARMul_CP14_R0_FLAG2 0x0400
  537. #define ARMul_CP14_R10_MOE_IB 0x0004
  538. #define ARMul_CP14_R10_MOE_DB 0x0008
  539. #define ARMul_CP14_R10_MOE_BT 0x000c
  540. #define ARMul_CP15_R1_ENDIAN 0x0080
  541. #define ARMul_CP15_R1_ALIGN 0x0002
  542. #define ARMul_CP15_R5_X 0x0400
  543. #define ARMul_CP15_R5_ST_ALIGN 0x0001
  544. #define ARMul_CP15_R5_IMPRE 0x0406
  545. #define ARMul_CP15_R5_MMU_EXCPT 0x0400
  546. #define ARMul_CP15_DBCON_M 0x0100
  547. #define ARMul_CP15_DBCON_E1 0x000c
  548. #define ARMul_CP15_DBCON_E0 0x0003
  549. extern unsigned ARMul_CoProInit(ARMul_State* state);
  550. extern void ARMul_CoProExit(ARMul_State* state);
  551. extern void ARMul_CoProAttach (ARMul_State* state, unsigned number,
  552. ARMul_CPInits* init, ARMul_CPExits* exit,
  553. ARMul_LDCs* ldc, ARMul_STCs* stc,
  554. ARMul_MRCs* mrc, ARMul_MCRs* mcr,
  555. ARMul_MRRCs* mrrc, ARMul_MCRRs* mcrr,
  556. ARMul_CDPs* cdp,
  557. ARMul_CPReads* read, ARMul_CPWrites* write);
  558. extern void ARMul_CoProDetach(ARMul_State* state, unsigned number);
  559. /***************************************************************************\
  560. * Definitons of things in the host environment *
  561. \***************************************************************************/
  562. extern unsigned ARMul_OSInit(ARMul_State* state);
  563. extern void ARMul_OSExit(ARMul_State* state);
  564. #ifdef __cplusplus
  565. extern "C" {
  566. #endif
  567. extern unsigned ARMul_OSHandleSWI(ARMul_State* state, ARMword number);
  568. #ifdef __cplusplus
  569. }
  570. #endif
  571. extern ARMword ARMul_OSLastErrorP(ARMul_State* state);
  572. extern ARMword ARMul_Debug(ARMul_State* state, ARMword pc, ARMword instr);
  573. extern unsigned ARMul_OSException(ARMul_State* state, ARMword vector, ARMword pc);
  574. extern int rdi_log;
  575. enum ConditionCode {
  576. EQ = 0,
  577. NE = 1,
  578. CS = 2,
  579. CC = 3,
  580. MI = 4,
  581. PL = 5,
  582. VS = 6,
  583. VC = 7,
  584. HI = 8,
  585. LS = 9,
  586. GE = 10,
  587. LT = 11,
  588. GT = 12,
  589. LE = 13,
  590. AL = 14,
  591. NV = 15,
  592. };
  593. #ifndef NFLAG
  594. #define NFLAG state->NFlag
  595. #endif //NFLAG
  596. #ifndef ZFLAG
  597. #define ZFLAG state->ZFlag
  598. #endif //ZFLAG
  599. #ifndef CFLAG
  600. #define CFLAG state->CFlag
  601. #endif //CFLAG
  602. #ifndef VFLAG
  603. #define VFLAG state->VFlag
  604. #endif //VFLAG
  605. #ifndef IFLAG
  606. #define IFLAG (state->IFFlags >> 1)
  607. #endif //IFLAG
  608. #ifndef FFLAG
  609. #define FFLAG (state->IFFlags & 1)
  610. #endif //FFLAG
  611. #ifndef IFFLAGS
  612. #define IFFLAGS state->IFFlags
  613. #endif //VFLAG
  614. #define FLAG_MASK 0xf0000000
  615. #define NBIT_SHIFT 31
  616. #define ZBIT_SHIFT 30
  617. #define CBIT_SHIFT 29
  618. #define VBIT_SHIFT 28
  619. #define SKYEYE_OUTREGS(fd) { fprintf ((fd), "R %x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,C %x,S %x,%x,%x,%x,%x,%x,%x,M %x,B %x,E %x,I %x,P %x,T %x,L %x,D %x,",\
  620. state->Reg[0],state->Reg[1],state->Reg[2],state->Reg[3], \
  621. state->Reg[4],state->Reg[5],state->Reg[6],state->Reg[7], \
  622. state->Reg[8],state->Reg[9],state->Reg[10],state->Reg[11], \
  623. state->Reg[12],state->Reg[13],state->Reg[14],state->Reg[15], \
  624. state->Cpsr, state->Spsr[0], state->Spsr[1], state->Spsr[2],\
  625. state->Spsr[3],state->Spsr[4], state->Spsr[5], state->Spsr[6],\
  626. state->Mode,state->Bank,state->ErrorCode,state->instr,state->pc,\
  627. state->temp,state->loaded,state->decoded);}
  628. #define SKYEYE_OUTMOREREGS(fd) { fprintf ((fd),"\
  629. RUs %x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,\
  630. RF %x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,\
  631. RI %x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,\
  632. RS %x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,\
  633. RA %x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,\
  634. RUn %x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x\n",\
  635. state->RegBank[0][0],state->RegBank[0][1],state->RegBank[0][2],state->RegBank[0][3], \
  636. state->RegBank[0][4],state->RegBank[0][5],state->RegBank[0][6],state->RegBank[0][7], \
  637. state->RegBank[0][8],state->RegBank[0][9],state->RegBank[0][10],state->RegBank[0][11], \
  638. state->RegBank[0][12],state->RegBank[0][13],state->RegBank[0][14],state->RegBank[0][15], \
  639. state->RegBank[1][0],state->RegBank[1][1],state->RegBank[1][2],state->RegBank[1][3], \
  640. state->RegBank[1][4],state->RegBank[1][5],state->RegBank[1][6],state->RegBank[1][7], \
  641. state->RegBank[1][8],state->RegBank[1][9],state->RegBank[1][10],state->RegBank[1][11], \
  642. state->RegBank[1][12],state->RegBank[1][13],state->RegBank[1][14],state->RegBank[1][15], \
  643. state->RegBank[2][0],state->RegBank[2][1],state->RegBank[2][2],state->RegBank[2][3], \
  644. state->RegBank[2][4],state->RegBank[2][5],state->RegBank[2][6],state->RegBank[2][7], \
  645. state->RegBank[2][8],state->RegBank[2][9],state->RegBank[2][10],state->RegBank[2][11], \
  646. state->RegBank[2][12],state->RegBank[2][13],state->RegBank[2][14],state->RegBank[2][15], \
  647. state->RegBank[3][0],state->RegBank[3][1],state->RegBank[3][2],state->RegBank[3][3], \
  648. state->RegBank[3][4],state->RegBank[3][5],state->RegBank[3][6],state->RegBank[3][7], \
  649. state->RegBank[3][8],state->RegBank[3][9],state->RegBank[3][10],state->RegBank[3][11], \
  650. state->RegBank[3][12],state->RegBank[3][13],state->RegBank[3][14],state->RegBank[3][15], \
  651. state->RegBank[4][0],state->RegBank[4][1],state->RegBank[4][2],state->RegBank[4][3], \
  652. state->RegBank[4][4],state->RegBank[4][5],state->RegBank[4][6],state->RegBank[4][7], \
  653. state->RegBank[4][8],state->RegBank[4][9],state->RegBank[4][10],state->RegBank[4][11], \
  654. state->RegBank[4][12],state->RegBank[4][13],state->RegBank[4][14],state->RegBank[4][15], \
  655. state->RegBank[5][0],state->RegBank[5][1],state->RegBank[5][2],state->RegBank[5][3], \
  656. state->RegBank[5][4],state->RegBank[5][5],state->RegBank[5][6],state->RegBank[5][7], \
  657. state->RegBank[5][8],state->RegBank[5][9],state->RegBank[5][10],state->RegBank[5][11], \
  658. state->RegBank[5][12],state->RegBank[5][13],state->RegBank[5][14],state->RegBank[5][15] \
  659. );}
  660. #define SA1110 0x6901b110
  661. #define SA1100 0x4401a100
  662. #define PXA250 0x69052100
  663. #define PXA270 0x69054110
  664. //#define PXA250 0x69052903
  665. // 0x69052903; //PXA250 B1 from intel 278522-001.pdf
  666. extern void ARMul_UndefInstr(ARMul_State*, ARMword);
  667. extern void ARMul_FixCPSR(ARMul_State*, ARMword, ARMword);
  668. extern void ARMul_FixSPSR(ARMul_State*, ARMword, ARMword);
  669. extern void ARMul_ConsolePrint(ARMul_State*, const char*, ...);
  670. extern void ARMul_SelectProcessor(ARMul_State*, unsigned);
  671. extern u8 ARMul_SignedSaturatedAdd8(u8, u8);
  672. extern u8 ARMul_SignedSaturatedSub8(u8, u8);
  673. extern u16 ARMul_SignedSaturatedAdd16(u16, u16);
  674. extern u16 ARMul_SignedSaturatedSub16(u16, u16);
  675. extern u8 ARMul_UnsignedSaturatedAdd8(u8, u8);
  676. extern u16 ARMul_UnsignedSaturatedAdd16(u16, u16);
  677. extern u8 ARMul_UnsignedSaturatedSub8(u8, u8);
  678. extern u16 ARMul_UnsignedSaturatedSub16(u16, u16);
  679. extern u8 ARMul_UnsignedAbsoluteDifference(u8, u8);
  680. #define DIFF_LOG 0
  681. #define SAVE_LOG 0
  682. #endif /* _ARMDEFS_H_ */