armdefs.h 31 KB

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