()
| 155 | # return Keystone arch & mode (with endianess included) |
| 156 | @staticmethod |
| 157 | def get_hardware_mode(): |
| 158 | (arch, mode) = (None, None) |
| 159 | |
| 160 | # heuristically detect hardware setup |
| 161 | info = idaapi.get_inf_structure() |
| 162 | cpuname = info.procName.lower() |
| 163 | if cpuname == "metapc": |
| 164 | arch = KS_ARCH_X86 |
| 165 | if info.is_64bit(): |
| 166 | mode = KS_MODE_64 |
| 167 | elif info.is_32bit(): |
| 168 | mode = KS_MODE_32 |
| 169 | else: |
| 170 | mode = KS_MODE_16 |
| 171 | elif cpuname.startswith("arm"): |
| 172 | # ARM or ARM64 |
| 173 | if info.is_64bit(): |
| 174 | arch = KS_ARCH_ARM64 |
| 175 | mode = KS_MODE_LITTLE_ENDIAN |
| 176 | else: |
| 177 | arch = KS_ARCH_ARM |
| 178 | # either big-endian or little-endian |
| 179 | if cpuname == "arm": |
| 180 | mode = KS_MODE_ARM | KS_MODE_LITTLE_ENDIAN |
| 181 | else: |
| 182 | mode = KS_MODE_ARM | KS_MODE_BIG_ENDIAN |
| 183 | elif cpuname.startswith("sparc"): |
| 184 | arch = KS_ARCH_SPARC |
| 185 | if info.is_64bit(): |
| 186 | mode = KS_MODE_SPARC64 |
| 187 | else: |
| 188 | mode = KS_MODE_SPARC32 |
| 189 | if cpuname == "sparcb": |
| 190 | mode += KS_MODE_BIG_ENDIAN |
| 191 | else: |
| 192 | mode += KS_MODE_LITTLE_ENDIAN |
| 193 | elif cpuname.startswith("ppc"): |
| 194 | arch = KS_ARCH_PPC |
| 195 | if info.is_64bit(): |
| 196 | mode = KS_MODE_PPC64 |
| 197 | else: |
| 198 | mode = KS_MODE_PPC32 |
| 199 | if cpuname == "ppc": |
| 200 | # do not support Little Endian mode for PPC |
| 201 | mode += KS_MODE_BIG_ENDIAN |
| 202 | elif cpuname.startswith("mips"): |
| 203 | arch = KS_ARCH_MIPS |
| 204 | if info.is_64bit(): |
| 205 | mode = KS_MODE_MIPS64 |
| 206 | else: |
| 207 | mode = KS_MODE_MIPS32 |
| 208 | if cpuname == "mipsl": |
| 209 | mode += KS_MODE_LITTLE_ENDIAN |
| 210 | else: |
| 211 | mode += KS_MODE_BIG_ENDIAN |
| 212 | elif cpuname.startswith("systemz") or cpuname.startswith("s390x"): |
| 213 | arch = KS_ARCH_SYSTEMZ |
| 214 | mode = KS_MODE_BIG_ENDIAN |
no outgoing calls
no test coverage detected