herm1t LIVE!ng room - YAD [entries|archive|friends|userinfo]
herm1t

[ website | twilight corner in the herm1t's cave ]
[ userinfo | ljr userinfo ]
[ archive | journal archive ]

YAD [Aug. 18th, 2008|04:02 pm]
Previous Entry Add to Memories Tell A Friend Next Entry
#ifdef  CHECK_LOCK_PREFIX
                /* check lock prefix */
                if (diza->p_lock) {
                        if (mod == 3)
                                return 0;
                        /* two byte opcodes */
                        if (diza->opcode2) {
                                c = diza->opcode2;
                                if (c == 0xba && reg > 4)
                                        goto lock_ok;
                                if (c == 0xc7 && reg == 1)
                                        goto lock_ok;
                                /* ab c0 c1 b0 b1 b3 bb */
                                if (c == 0xab || ((c & 0xfc) == 0xb0 &&
                                c != 0xb2) || (c & 0xfe) == 0xc0 || c == 0xbb)
                                        goto lock_ok;
                                /* MOV Rd,CR8D / MOV CR8D,Rd */
                                if (c == 0x20 || c == 0x22)
                                        goto lock_ok;
                        } else {
                                c = diza->opcode & 0xfe;
                                /* 00 01 08 09 10 11 18 19 20 21 28 29 30 31 */
                                if ((c & 7) == 0 && (c >> 3) < 7)
                                        goto lock_ok;
                                /* 86 87 */
                                if (c == 0x86)
                                        goto lock_ok;
                                if (c == 0xf6 && (reg & 0xfe) == 2)
                                        goto lock_ok;
                                if (c == 0xfe && (reg & 0xfe) == 0)
                                        goto lock_ok;
                                /* group1 */
                                if ((diza->opcode & 0xfc) == 0x80 && reg != 7)
                                        goto lock_ok;
                        }
                        return 0;                       
                }
lock_ok:
#endif
..........................................
#ifdef  CHECK_ARGS
                        /* mod != 11, check oprands */
                        /* MOV Rd,Cd / MOV Rd,Dd / MOV Cd,Rd / MOV Dd,Rd */
                        if ((diza->opcode2 & 0xfc) == 0x20)
                                return 0;
                        /* FIXME: more checks here ... */
#endif
                } else {
#ifdef  CHECK_ARGS
                        /* mod == 11, check operands, the code was taken from HDE32 */
                        if (diza->opcode2) {
                                c = diza->opcode2;
                                if      /* group#7 0f 01 SGDT/SIDT/LGDT/LIDT Ms/../../../INVLPG M */
                                        (c == 0x01 && (reg < 4 || reg == 7)) ||
                                        /* group#9 0f c7 CMPXCHG Mq */
                                        (c == 0xc7 && reg == 1) ||
                                        /* 0f b2 LSS Gz,Mp */
                                        /* 0f b4 LFS Gz,Mp */
                                        /* 0f b5 LGS Gz,Mp */
                                        (c == 0xb2 || c == 0xb4 || c == 0xb5) ||
                                        /* group#16 0f ae FXSAVE M512 / FXRSTOR M512 / LDMXCSR Md / STMXCSR Md / XSAVE M */
                                        (c == 0xae && reg < 5)
                                        /* FIXME: more checks here, SSE... */
                                return 0;
                        } else {
                                c = diza->opcode;
                                if
                                        /* 62 BOUND Gv,Ma */
                                        /* 8d LEA Gv,M */
                                        /* c4 LES Gz,Mp */
                                        /* c5 LDS Gz,Mp */
                                        (c == 0x62 || c == 0x8d || (c & 0xfe) == 0xc4) ||
                                        /* group#5 CALL Mp, JMP Mp */
                                        (c == 0xff && reg == 3 || reg == 5)
                                return 0;
                        }
#endif
                }
А еще нужно забить reg-only команды и SSE mem-only. Но на сегодня пожалуй хватит. Ж-)
LinkLeave a comment