1 MODE_ARM = 0
2 MODE_THUMB = 1
3 MODE_JAZELLE = 2
4
5
6 IF_PSR_S = 1<<8
7 IF_B = 1<<9
8 IF_H = 1<<11
9 IF_S = 1<<12
10 IF_D = 1<<13
11 IF_L = 1<<14
12 IF_T = 1<<15
13 IF_W = 1<<16
14 IF_UM = 1<<17
15 IF_DAIB_MASK = 0x3800000
16 IF_DAIB_SHFT = 23
17 IF_DA = 0x0800000
18 IF_IA = 0x1800000
19 IF_DB = 0x2800000
20 IF_IB = 0x3800000
21 IF_DAIB_B = 0x2800000
22 IF_DAIB_I = 0x1800000
23
24
25 OF_W = 1<<8
26 OF_UM = 1<<9
27
28
29 OSZFMT_BYTE = "B"
30 OSZFMT_HWORD = "<H"
31 OSZFMT_WORD = "<L"
32 OSZ_BYTE = 1
33 OSZ_HWORD = 2
34 OSZ_WORD = 4
35
36 fmts = [None, OSZ_BYTE, OSZ_HWORD, None, OSZ_WORD]
37
38 COND_EQ = 0x0
39 COND_NE = 0x1
40 COND_CS = 0x2
41 COND_CC = 0x3
42 COND_MI = 0x4
43 COND_PL = 0x5
44 COND_VS = 0x6
45 COND_VC = 0x7
46 COND_HI = 0x8
47 COND_LO = 0x9
48 COND_GE = 0xA
49 COND_LT = 0xB
50 COND_GT = 0xC
51 COND_LE = 0xD
52 COND_AL = 0xE
53 COND_EXTENDED = 0xF
54
55 cond_codes = {
56 COND_EQ:"eq",
57 COND_NE:"ne",
58 COND_CS:"cs",
59 COND_CC:"cc",
60 COND_MI:"mi",
61 COND_PL:"pl",
62 COND_VS:"vs",
63 COND_VC:"vc",
64 COND_HI:"hi",
65 COND_LO:"lo",
66 COND_GE:"ge",
67 COND_LT:"lt",
68 COND_GT:"gt",
69 COND_LE:"le",
70 COND_AL:"",
71 COND_EXTENDED:"2",
72 }
73
74 PM_usr = 0b10000
75 PM_fiq = 0b10001
76 PM_irq = 0b10010
77 PM_svc = 0b10011
78 PM_abt = 0b10111
79 PM_und = 0b11011
80 PM_sys = 0b11111
81
82
83 REG_OFFSET_USR = 17 * (PM_usr&0xf)
84 REG_OFFSET_FIQ = 17 * (PM_fiq&0xf)
85 REG_OFFSET_IRQ = 17 * (PM_irq&0xf)
86 REG_OFFSET_SVC = 17 * (PM_svc&0xf)
87 REG_OFFSET_ABT = 17 * (PM_abt&0xf)
88 REG_OFFSET_UND = 17 * (PM_und&0xf)
89 REG_OFFSET_SYS = 17 * (PM_sys&0xf)
90
91 REG_OFFSET_CPSR = 16
92
93 REG_SPSR_usr = REG_OFFSET_USR + 16
94 REG_SPSR_fiq = REG_OFFSET_FIQ + 16
95 REG_SPSR_irq = REG_OFFSET_IRQ + 16
96 REG_SPSR_svc = REG_OFFSET_SVC + 16
97 REG_SPSR_abt = REG_OFFSET_ABT + 16
98 REG_SPSR_und = REG_OFFSET_UND + 16
99 REG_SPSR_sys = REG_OFFSET_SYS + 16
100
101 REG_PC = 0xf
102 REG_SP = 0xd
103 REG_BP = None
104 REG_CPSR = REG_OFFSET_CPSR
105 REG_FLAGS = REG_OFFSET_CPSR
106
107 proc_modes = {
108 PM_usr: ("User Processor Mode", "usr", "Normal program execution mode", REG_OFFSET_USR, 15, REG_SPSR_usr),
109 PM_fiq: ("FIQ Processor Mode", "fiq", "Supports a high-speed data transfer or channel process", REG_OFFSET_FIQ, 8, REG_SPSR_fiq),
110 PM_irq: ("IRQ Processor Mode", "irq", "Used for general-purpose interrupt handling", REG_OFFSET_IRQ, 13, REG_SPSR_irq),
111 PM_svc: ("Supervisor Processor Mode", "svc", "A protected mode for the operating system", REG_OFFSET_SVC, 13, REG_SPSR_svc),
112 PM_abt: ("Abort Processor Mode", "abt", "Implements virtual memory and/or memory protection", REG_OFFSET_ABT, 13, REG_SPSR_abt),
113 PM_und: ("Undefined Processor Mode", "und", "Supports software emulation of hardware coprocessor", REG_OFFSET_UND, 13, REG_SPSR_und),
114 PM_sys: ("System Processor Mode", "sys", "Runs privileged operating system tasks (ARMv4 and above)", REG_OFFSET_SYS, 15, REG_SPSR_sys),
115 }
116
117 INST_ENC_DP_IMM = 0
118 INST_ENC_MISC = 1
119
120
121 IENC_DP_IMM_SHIFT = 0
122 IENC_MISC = 1
123 IENC_MISC1 = 2
124 IENC_DP_REG_SHIFT = 3
125 IENC_MULT = 4
126 IENC_UNDEF = 5
127 IENC_MOV_IMM_STAT = 6
128 IENC_DP_IMM = 7
129 IENC_LOAD_IMM_OFF = 8
130 IENC_LOAD_REG_OFF = 9
131 IENC_ARCH_UNDEF = 10
132 IENC_MEDIA = 11
133 IENC_LOAD_MULT = 12
134 IENC_BRANCH = 13
135 IENC_COPROC_RREG_XFER = 14
136 IENC_COPROC_LOAD = 15
137 IENC_COPROC_DP = 16
138 IENC_COPROC_REG_XFER = 17
139 IENC_SWINT = 18
140 IENC_UNCOND = 19
141 IENC_EXTRA_LOAD = 20
142
143
144 IENC_MEDIA_PARALLEL = ((IENC_MEDIA << 8) + 1) << 8
145 IENC_MEDIA_SAT = ((IENC_MEDIA << 8) + 2) << 8
146 IENC_MEDIA_REV = ((IENC_MEDIA << 8) + 3) << 8
147 IENC_MEDIA_SEL = ((IENC_MEDIA << 8) + 4) << 8
148 IENC_MEDIA_USAD8 = ((IENC_MEDIA << 8) + 5) << 8
149 IENC_MEDIA_USADA8 = ((IENC_MEDIA << 8) + 6) << 8
150 IENC_MEDIA_EXTEND = ((IENC_MEDIA << 8) + 7) << 8
151 IENC_UNCOND_CPS = ((IENC_UNCOND << 8) + 1) << 8
152 IENC_UNCOND_SETEND = ((IENC_UNCOND << 8) + 2) << 8
153 IENC_UNCOND_PLD = ((IENC_UNCOND << 8) + 3) << 8
154 IENC_UNCOND_BLX = ((IENC_UNCOND << 8) + 4) << 8
155
156
157
158 S_LSL = 0
159 S_LSR = 1
160 S_ASR = 2
161 S_ROR = 3
162 S_RRX = 4
163
164 shift_names = ("lsl", "lsr", "asr", "ror", "rrx")
165
166 SOT_REG = 0
167 SOT_IMM = 1
168
169 daib = ("da","ia","db","ib")
170