1 //! \file 2 /* 3 ** Copyright (C) - Triton 4 ** 5 ** This program is under the terms of the Apache License 2.0. 6 */ 7 8 #ifndef TRITON_ARM32SPECIFICATIONS_H 9 #define TRITON_ARM32SPECIFICATIONS_H 10 11 #include <unordered_map> 12 13 #include <triton/archEnums.hpp> 14 #include <triton/architecture.hpp> 15 #include <triton/dllexport.hpp> 16 #include <triton/register.hpp> 17 18 19 20 //! The Triton namespace 21 namespace triton { 22 /*! 23 * \addtogroup triton 24 * @{ 25 */ 26 27 //! The Architecture namespace 28 namespace arch { 29 /*! 30 * \ingroup triton 31 * \addtogroup arch 32 * @{ 33 */ 34 35 //! The ARM namespace 36 namespace arm { 37 /*! 38 * \ingroup arch 39 * \addtogroup arm 40 * @{ 41 */ 42 43 //! The arm32 namespace 44 namespace arm32 { 45 /*! 46 * \ingroup arm 47 * \addtogroup arm32 48 * @{ 49 */ 50 51 //! \class Arm32Specifications 52 /*! \brief The Arm32Specifications class defines specifications about the Arm32 CPU */ 53 class Arm32Specifications { 54 protected: 55 //! List of registers specification available for this architecture. 56 std::unordered_map<triton::arch::register_e, const triton::arch::Register> registers_; 57 58 public: 59 //! Constructor. 60 TRITON_EXPORT Arm32Specifications(triton::arch::architecture_e); 61 62 //! Converts a capstone's register id to a triton's register id. 63 TRITON_EXPORT triton::arch::register_e capstoneRegisterToTritonRegister(triton::uint32 id) const; 64 65 //! Converts a capstone's shift id to a triton's shift id. 66 TRITON_EXPORT triton::arch::arm::shift_e capstoneShiftToTritonShift(triton::uint32 id) const; 67 68 //! Converts a capstone's condition id to a triton's condition id. 69 TRITON_EXPORT triton::arch::arm::condition_e capstoneConditionToTritonCondition(triton::uint32 id) const; 70 71 //! Converts a capstone's instruction id to a triton's instruction id. 72 TRITON_EXPORT triton::uint32 capstoneInstructionToTritonInstruction(triton::uint32 id) const; 73 }; 74 75 //! The list of opcodes. 76 enum instruction_e { 77 ID_INS_INVALID = 0, //!< invalid 78 79 ID_INS_ADC, //!< adc 80 ID_INS_ADD, //!< add 81 ID_INS_ADR, //!< adr 82 ID_INS_AESD, //!< aesd 83 ID_INS_AESE, //!< aese 84 ID_INS_AESIMC, //!< aesimc 85 ID_INS_AESMC, //!< aesmc 86 ID_INS_AND, //!< and 87 ID_INS_BFC, //!< bfc 88 ID_INS_BFI, //!< bfi 89 ID_INS_BIC, //!< bic 90 ID_INS_BKPT, //!< bkpt 91 ID_INS_BL, //!< bl 92 ID_INS_BLX, //!< blx 93 ID_INS_BX, //!< bx 94 ID_INS_BXJ, //!< bxj 95 ID_INS_B, //!< b 96 ID_INS_CDP, //!< cdp 97 ID_INS_CDP2, //!< cdp2 98 ID_INS_CLREX, //!< clrex 99 ID_INS_CLZ, //!< clz 100 ID_INS_CMN, //!< cmn 101 ID_INS_CMP, //!< cmp 102 ID_INS_CPS, //!< cps 103 ID_INS_CRC32B, //!< crc32b 104 ID_INS_CRC32CB, //!< crc32cb 105 ID_INS_CRC32CH, //!< crc32ch 106 ID_INS_CRC32CW, //!< crc32cw 107 ID_INS_CRC32H, //!< crc32h 108 ID_INS_CRC32W, //!< crc32w 109 ID_INS_DBG, //!< dbg 110 ID_INS_DMB, //!< dmb 111 ID_INS_DSB, //!< dsb 112 ID_INS_EOR, //!< eor 113 ID_INS_ERET, //!< eret 114 ID_INS_VMOV, //!< vmov 115 ID_INS_FLDMDBX, //!< fldmdbx 116 ID_INS_FLDMIAX, //!< fldmiax 117 ID_INS_VMRS, //!< vmrs 118 ID_INS_FSTMDBX, //!< fstmdbx 119 ID_INS_FSTMIAX, //!< fstmiax 120 ID_INS_HINT, //!< hint 121 ID_INS_HLT, //!< hlt 122 ID_INS_HVC, //!< hvc 123 ID_INS_ISB, //!< isb 124 ID_INS_LDA, //!< lda 125 ID_INS_LDAB, //!< ldab 126 ID_INS_LDAEX, //!< ldaex 127 ID_INS_LDAEXB, //!< ldaexb 128 ID_INS_LDAEXD, //!< ldaexd 129 ID_INS_LDAEXH, //!< ldaexh 130 ID_INS_LDAH, //!< ldah 131 ID_INS_LDC2L, //!< ldc2l 132 ID_INS_LDC2, //!< ldc2 133 ID_INS_LDCL, //!< ldcl 134 ID_INS_LDC, //!< ldc 135 ID_INS_LDMDA, //!< ldmda 136 ID_INS_LDMDB, //!< ldmdb 137 ID_INS_LDM, //!< ldm 138 ID_INS_LDMIB, //!< ldmib 139 ID_INS_LDRBT, //!< ldrbt 140 ID_INS_LDRB, //!< ldrb 141 ID_INS_LDRD, //!< ldrd 142 ID_INS_LDREX, //!< ldrex 143 ID_INS_LDREXB, //!< ldrexb 144 ID_INS_LDREXD, //!< ldrexd 145 ID_INS_LDREXH, //!< ldrexh 146 ID_INS_LDRH, //!< ldrh 147 ID_INS_LDRHT, //!< ldrht 148 ID_INS_LDRSB, //!< ldrsb 149 ID_INS_LDRSBT, //!< ldrsbt 150 ID_INS_LDRSH, //!< ldrsh 151 ID_INS_LDRSHT, //!< ldrsht 152 ID_INS_LDRT, //!< ldrt 153 ID_INS_LDR, //!< ldr 154 ID_INS_MCR, //!< mcr 155 ID_INS_MCR2, //!< mcr2 156 ID_INS_MCRR, //!< mcrr 157 ID_INS_MCRR2, //!< mcrr2 158 ID_INS_MLA, //!< mla 159 ID_INS_MLS, //!< mls 160 ID_INS_MOV, //!< mov 161 ID_INS_MOVT, //!< movt 162 ID_INS_MOVW, //!< movw 163 ID_INS_MRC, //!< mrc 164 ID_INS_MRC2, //!< mrc2 165 ID_INS_MRRC, //!< mrrc 166 ID_INS_MRRC2, //!< mrrc2 167 ID_INS_MRS, //!< mrs 168 ID_INS_MSR, //!< msr 169 ID_INS_MUL, //!< mul 170 ID_INS_MVN, //!< mvn 171 ID_INS_ORR, //!< orr 172 ID_INS_PKHBT, //!< pkhbt 173 ID_INS_PKHTB, //!< pkhtb 174 ID_INS_PLDW, //!< pldw 175 ID_INS_PLD, //!< pld 176 ID_INS_PLI, //!< pli 177 ID_INS_QADD, //!< qadd 178 ID_INS_QADD16, //!< qadd16 179 ID_INS_QADD8, //!< qadd8 180 ID_INS_QASX, //!< qasx 181 ID_INS_QDADD, //!< qdadd 182 ID_INS_QDSUB, //!< qdsub 183 ID_INS_QSAX, //!< qsax 184 ID_INS_QSUB, //!< qsub 185 ID_INS_QSUB16, //!< qsub16 186 ID_INS_QSUB8, //!< qsub8 187 ID_INS_RBIT, //!< rbit 188 ID_INS_REV, //!< rev 189 ID_INS_REV16, //!< rev16 190 ID_INS_REVSH, //!< revsh 191 ID_INS_RFEDA, //!< rfeda 192 ID_INS_RFEDB, //!< rfedb 193 ID_INS_RFEIA, //!< rfeia 194 ID_INS_RFEIB, //!< rfeib 195 ID_INS_RSB, //!< rsb 196 ID_INS_RSC, //!< rsc 197 ID_INS_SADD16, //!< sadd16 198 ID_INS_SADD8, //!< sadd8 199 ID_INS_SASX, //!< sasx 200 ID_INS_SBC, //!< sbc 201 ID_INS_SBFX, //!< sbfx 202 ID_INS_SDIV, //!< sdiv 203 ID_INS_SEL, //!< sel 204 ID_INS_SETEND, //!< setend 205 ID_INS_SHA1C, //!< sha1c 206 ID_INS_SHA1H, //!< sha1h 207 ID_INS_SHA1M, //!< sha1m 208 ID_INS_SHA1P, //!< sha1p 209 ID_INS_SHA1SU0, //!< sha1su0 210 ID_INS_SHA1SU1, //!< sha1su1 211 ID_INS_SHA256H, //!< sha256h 212 ID_INS_SHA256H2, //!< sha256h2 213 ID_INS_SHA256SU0, //!< sha256su0 214 ID_INS_SHA256SU1, //!< sha256su1 215 ID_INS_SHADD16, //!< shadd16 216 ID_INS_SHADD8, //!< shadd8 217 ID_INS_SHASX, //!< shasx 218 ID_INS_SHSAX, //!< shsax 219 ID_INS_SHSUB16, //!< shsub16 220 ID_INS_SHSUB8, //!< shsub8 221 ID_INS_SMC, //!< smc 222 ID_INS_SMLABB, //!< smlabb 223 ID_INS_SMLABT, //!< smlabt 224 ID_INS_SMLAD, //!< smlad 225 ID_INS_SMLADX, //!< smladx 226 ID_INS_SMLAL, //!< smlal 227 ID_INS_SMLALBB, //!< smlalbb 228 ID_INS_SMLALBT, //!< smlalbt 229 ID_INS_SMLALD, //!< smlald 230 ID_INS_SMLALDX, //!< smlaldx 231 ID_INS_SMLALTB, //!< smlaltb 232 ID_INS_SMLALTT, //!< smlaltt 233 ID_INS_SMLATB, //!< smlatb 234 ID_INS_SMLATT, //!< smlatt 235 ID_INS_SMLAWB, //!< smlawb 236 ID_INS_SMLAWT, //!< smlawt 237 ID_INS_SMLSD, //!< smlsd 238 ID_INS_SMLSDX, //!< smlsdx 239 ID_INS_SMLSLD, //!< smlsld 240 ID_INS_SMLSLDX, //!< smlsldx 241 ID_INS_SMMLA, //!< smmla 242 ID_INS_SMMLAR, //!< smmlar 243 ID_INS_SMMLS, //!< smmls 244 ID_INS_SMMLSR, //!< smmlsr 245 ID_INS_SMMUL, //!< smmul 246 ID_INS_SMMULR, //!< smmulr 247 ID_INS_SMUAD, //!< smuad 248 ID_INS_SMUADX, //!< smuadx 249 ID_INS_SMULBB, //!< smulbb 250 ID_INS_SMULBT, //!< smulbt 251 ID_INS_SMULL, //!< smull 252 ID_INS_SMULTB, //!< smultb 253 ID_INS_SMULTT, //!< smultt 254 ID_INS_SMULWB, //!< smulwb 255 ID_INS_SMULWT, //!< smulwt 256 ID_INS_SMUSD, //!< smusd 257 ID_INS_SMUSDX, //!< smusdx 258 ID_INS_SRSDA, //!< srsda 259 ID_INS_SRSDB, //!< srsdb 260 ID_INS_SRSIA, //!< srsia 261 ID_INS_SRSIB, //!< srsib 262 ID_INS_SSAT, //!< ssat 263 ID_INS_SSAT16, //!< ssat16 264 ID_INS_SSAX, //!< ssax 265 ID_INS_SSUB16, //!< ssub16 266 ID_INS_SSUB8, //!< ssub8 267 ID_INS_STC2L, //!< stc2l 268 ID_INS_STC2, //!< stc2 269 ID_INS_STCL, //!< stcl 270 ID_INS_STC, //!< stc 271 ID_INS_STL, //!< stl 272 ID_INS_STLB, //!< stlb 273 ID_INS_STLEX, //!< stlex 274 ID_INS_STLEXB, //!< stlexb 275 ID_INS_STLEXD, //!< stlexd 276 ID_INS_STLEXH, //!< stlexh 277 ID_INS_STLH, //!< stlh 278 ID_INS_STMDA, //!< stmda 279 ID_INS_STMDB, //!< stmdb 280 ID_INS_STM, //!< stm 281 ID_INS_STMIB, //!< stmib 282 ID_INS_STRBT, //!< strbt 283 ID_INS_STRB, //!< strb 284 ID_INS_STRD, //!< strd 285 ID_INS_STREX, //!< strex 286 ID_INS_STREXB, //!< strexb 287 ID_INS_STREXD, //!< strexd 288 ID_INS_STREXH, //!< strexh 289 ID_INS_STRH, //!< strh 290 ID_INS_STRHT, //!< strht 291 ID_INS_STRT, //!< strt 292 ID_INS_STR, //!< str 293 ID_INS_SUB, //!< sub 294 ID_INS_SVC, //!< svc 295 ID_INS_SWP, //!< swp 296 ID_INS_SWPB, //!< swpb 297 ID_INS_SXTAB, //!< sxtab 298 ID_INS_SXTAB16, //!< sxtab16 299 ID_INS_SXTAH, //!< sxtah 300 ID_INS_SXTB, //!< sxtb 301 ID_INS_SXTB16, //!< sxtb16 302 ID_INS_SXTH, //!< sxth 303 ID_INS_TEQ, //!< teq 304 ID_INS_TRAP, //!< trap 305 ID_INS_TST, //!< tst 306 ID_INS_UADD16, //!< uadd16 307 ID_INS_UADD8, //!< uadd8 308 ID_INS_UASX, //!< uasx 309 ID_INS_UBFX, //!< ubfx 310 ID_INS_UDF, //!< udf 311 ID_INS_UDIV, //!< udiv 312 ID_INS_UHADD16, //!< uhadd16 313 ID_INS_UHADD8, //!< uhadd8 314 ID_INS_UHASX, //!< uhasx 315 ID_INS_UHSAX, //!< uhsax 316 ID_INS_UHSUB16, //!< uhsub16 317 ID_INS_UHSUB8, //!< uhsub8 318 ID_INS_UMAAL, //!< umaal 319 ID_INS_UMLAL, //!< umlal 320 ID_INS_UMULL, //!< umull 321 ID_INS_UQADD16, //!< uqadd16 322 ID_INS_UQADD8, //!< uqadd8 323 ID_INS_UQASX, //!< uqasx 324 ID_INS_UQSAX, //!< uqsax 325 ID_INS_UQSUB16, //!< uqsub16 326 ID_INS_UQSUB8, //!< uqsub8 327 ID_INS_USAD8, //!< usad8 328 ID_INS_USADA8, //!< usada8 329 ID_INS_USAT, //!< usat 330 ID_INS_USAT16, //!< usat16 331 ID_INS_USAX, //!< usax 332 ID_INS_USUB16, //!< usub16 333 ID_INS_USUB8, //!< usub8 334 ID_INS_UXTAB, //!< uxtab 335 ID_INS_UXTAB16, //!< uxtab16 336 ID_INS_UXTAH, //!< uxtah 337 ID_INS_UXTB, //!< uxtb 338 ID_INS_UXTB16, //!< uxtb16 339 ID_INS_UXTH, //!< uxth 340 ID_INS_VABAL, //!< vabal 341 ID_INS_VABA, //!< vaba 342 ID_INS_VABDL, //!< vabdl 343 ID_INS_VABD, //!< vabd 344 ID_INS_VABS, //!< vabs 345 ID_INS_VACGE, //!< vacge 346 ID_INS_VACGT, //!< vacgt 347 ID_INS_VADD, //!< vadd 348 ID_INS_VADDHN, //!< vaddhn 349 ID_INS_VADDL, //!< vaddl 350 ID_INS_VADDW, //!< vaddw 351 ID_INS_VAND, //!< vand 352 ID_INS_VBIC, //!< vbic 353 ID_INS_VBIF, //!< vbif 354 ID_INS_VBIT, //!< vbit 355 ID_INS_VBSL, //!< vbsl 356 ID_INS_VCEQ, //!< vceq 357 ID_INS_VCGE, //!< vcge 358 ID_INS_VCGT, //!< vcgt 359 ID_INS_VCLE, //!< vcle 360 ID_INS_VCLS, //!< vcls 361 ID_INS_VCLT, //!< vclt 362 ID_INS_VCLZ, //!< vclz 363 ID_INS_VCMP, //!< vcmp 364 ID_INS_VCMPE, //!< vcmpe 365 ID_INS_VCNT, //!< vcnt 366 ID_INS_VCVTA, //!< vcvta 367 ID_INS_VCVTB, //!< vcvtb 368 ID_INS_VCVT, //!< vcvt 369 ID_INS_VCVTM, //!< vcvtm 370 ID_INS_VCVTN, //!< vcvtn 371 ID_INS_VCVTP, //!< vcvtp 372 ID_INS_VCVTT, //!< vcvtt 373 ID_INS_VDIV, //!< vdiv 374 ID_INS_VDUP, //!< vdup 375 ID_INS_VEOR, //!< veor 376 ID_INS_VEXT, //!< vext 377 ID_INS_VFMA, //!< vfma 378 ID_INS_VFMS, //!< vfms 379 ID_INS_VFNMA, //!< vfnma 380 ID_INS_VFNMS, //!< vfnms 381 ID_INS_VHADD, //!< vhadd 382 ID_INS_VHSUB, //!< vhsub 383 ID_INS_VLD1, //!< vld1 384 ID_INS_VLD2, //!< vld2 385 ID_INS_VLD3, //!< vld3 386 ID_INS_VLD4, //!< vld4 387 ID_INS_VLDMDB, //!< vldmdb 388 ID_INS_VLDMIA, //!< vldmia 389 ID_INS_VLDR, //!< vldr 390 ID_INS_VMAXNM, //!< vmaxnm 391 ID_INS_VMAX, //!< vmax 392 ID_INS_VMINNM, //!< vminnm 393 ID_INS_VMIN, //!< vmin 394 ID_INS_VMLA, //!< vmla 395 ID_INS_VMLAL, //!< vmlal 396 ID_INS_VMLS, //!< vmls 397 ID_INS_VMLSL, //!< vmlsl 398 ID_INS_VMOVL, //!< vmovl 399 ID_INS_VMOVN, //!< vmovn 400 ID_INS_VMSR, //!< vmsr 401 ID_INS_VMUL, //!< vmul 402 ID_INS_VMULL, //!< vmull 403 ID_INS_VMVN, //!< vmvn 404 ID_INS_VNEG, //!< vneg 405 ID_INS_VNMLA, //!< vnmla 406 ID_INS_VNMLS, //!< vnmls 407 ID_INS_VNMUL, //!< vnmul 408 ID_INS_VORN, //!< vorn 409 ID_INS_VORR, //!< vorr 410 ID_INS_VPADAL, //!< vpadal 411 ID_INS_VPADDL, //!< vpaddl 412 ID_INS_VPADD, //!< vpadd 413 ID_INS_VPMAX, //!< vpmax 414 ID_INS_VPMIN, //!< vpmin 415 ID_INS_VQABS, //!< vqabs 416 ID_INS_VQADD, //!< vqadd 417 ID_INS_VQDMLAL, //!< vqdmlal 418 ID_INS_VQDMLSL, //!< vqdmlsl 419 ID_INS_VQDMULH, //!< vqdmulh 420 ID_INS_VQDMULL, //!< vqdmull 421 ID_INS_VQMOVUN, //!< vqmovun 422 ID_INS_VQMOVN, //!< vqmovn 423 ID_INS_VQNEG, //!< vqneg 424 ID_INS_VQRDMULH, //!< vqrdmulh 425 ID_INS_VQRSHL, //!< vqrshl 426 ID_INS_VQRSHRN, //!< vqrshrn 427 ID_INS_VQRSHRUN, //!< vqrshrun 428 ID_INS_VQSHL, //!< vqshl 429 ID_INS_VQSHLU, //!< vqshlu 430 ID_INS_VQSHRN, //!< vqshrn 431 ID_INS_VQSHRUN, //!< vqshrun 432 ID_INS_VQSUB, //!< vqsub 433 ID_INS_VRADDHN, //!< vraddhn 434 ID_INS_VRECPE, //!< vrecpe 435 ID_INS_VRECPS, //!< vrecps 436 ID_INS_VREV16, //!< vrev16 437 ID_INS_VREV32, //!< vrev32 438 ID_INS_VREV64, //!< vrev64 439 ID_INS_VRHADD, //!< vrhadd 440 ID_INS_VRINTA, //!< vrinta 441 ID_INS_VRINTM, //!< vrintm 442 ID_INS_VRINTN, //!< vrintn 443 ID_INS_VRINTP, //!< vrintp 444 ID_INS_VRINTR, //!< vrintr 445 ID_INS_VRINTX, //!< vrintx 446 ID_INS_VRINTZ, //!< vrintz 447 ID_INS_VRSHL, //!< vrshl 448 ID_INS_VRSHRN, //!< vrshrn 449 ID_INS_VRSHR, //!< vrshr 450 ID_INS_VRSQRTE, //!< vrsqrte 451 ID_INS_VRSQRTS, //!< vrsqrts 452 ID_INS_VRSRA, //!< vrsra 453 ID_INS_VRSUBHN, //!< vrsubhn 454 ID_INS_VSELEQ, //!< vseleq 455 ID_INS_VSELGE, //!< vselge 456 ID_INS_VSELGT, //!< vselgt 457 ID_INS_VSELVS, //!< vselvs 458 ID_INS_VSHLL, //!< vshll 459 ID_INS_VSHL, //!< vshl 460 ID_INS_VSHRN, //!< vshrn 461 ID_INS_VSHR, //!< vshr 462 ID_INS_VSLI, //!< vsli 463 ID_INS_VSQRT, //!< vsqrt 464 ID_INS_VSRA, //!< vsra 465 ID_INS_VSRI, //!< vsri 466 ID_INS_VST1, //!< vst1 467 ID_INS_VST2, //!< vst2 468 ID_INS_VST3, //!< vst3 469 ID_INS_VST4, //!< vst4 470 ID_INS_VSTMDB, //!< vstmdb 471 ID_INS_VSTMIA, //!< vstmia 472 ID_INS_VSTR, //!< vstr 473 ID_INS_VSUB, //!< vsub 474 ID_INS_VSUBHN, //!< vsubhn 475 ID_INS_VSUBL, //!< vsubl 476 ID_INS_VSUBW, //!< vsubw 477 ID_INS_VSWP, //!< vswp 478 ID_INS_VTBL, //!< vtbl 479 ID_INS_VTBX, //!< vtbx 480 ID_INS_VCVTR, //!< vcvtr 481 ID_INS_VTRN, //!< vtrn 482 ID_INS_VTST, //!< vtst 483 ID_INS_VUZP, //!< vuzp 484 ID_INS_VZIP, //!< vzip 485 ID_INS_ADDW, //!< addw 486 ID_INS_ASR, //!< asr 487 ID_INS_DCPS1, //!< dcps1 488 ID_INS_DCPS2, //!< dcps2 489 ID_INS_DCPS3, //!< dcps3 490 ID_INS_IT, //!< it 491 ID_INS_LSL, //!< lsl 492 ID_INS_LSR, //!< lsr 493 ID_INS_ORN, //!< orn 494 ID_INS_ROR, //!< ror 495 ID_INS_RRX, //!< rrx 496 ID_INS_SUBW, //!< subw 497 ID_INS_TBB, //!< tbb 498 ID_INS_TBH, //!< tbh 499 ID_INS_CBNZ, //!< cbnz 500 ID_INS_CBZ, //!< cbz 501 ID_INS_POP, //!< pop 502 ID_INS_PUSH, //!< push 503 504 // special instructions 505 ID_INS_NOP, //!< nop 506 ID_INS_YIELD, //!< yield 507 ID_INS_WFE, //!< wfe 508 ID_INS_WFI, //!< wfi 509 ID_INS_SEV, //!< sev 510 ID_INS_SEVL, //!< sevl 511 ID_INS_VPUSH, //!< vpush 512 ID_INS_VPOP, //!< vpop 513 514 /* Must be the last item */ 515 ID_INS_LAST_ITEM //!< must be the last item 516 }; 517 518 /*! @} End of arm32 namespace */ 519 }; 520 /*! @} End of arm namespace */ 521 }; 522 /*! @} End of arch namespace */ 523 }; 524 /*! @} End of triton namespace */ 525 }; 526 527 #endif /* TRITON_ARM32SPECIFICATIONS_H */ 528