Jan Beulich
2007-Jun-19 09:54 UTC
[Xen-devel] [PATCH] x86: eliminate x86_emulate''s private EFLAGS definitions
.. in favor of using one of the two (i.e. already redundant) ones found in the headers. Signed-off-by: Jan Beulich <jbeulich@novell.com> Index: 2007-06-18/xen/arch/x86/x86_emulate.c ==================================================================--- 2007-06-18.orig/xen/arch/x86/x86_emulate.c 2007-06-18 11:35:06.000000000 +0200 +++ 2007-06-18/xen/arch/x86/x86_emulate.c 2007-06-18 11:35:19.000000000 +0200 @@ -261,16 +261,6 @@ struct operand { }; }; -/* EFLAGS bit definitions. */ -#define EFLG_OF (1<<11) -#define EFLG_DF (1<<10) -#define EFLG_IF (1<<9) -#define EFLG_SF (1<<7) -#define EFLG_ZF (1<<6) -#define EFLG_AF (1<<4) -#define EFLG_PF (1<<2) -#define EFLG_CF (1<<0) - /* Exception definitions. */ #define EXC_DE 0 #define EXC_BR 5 @@ -296,7 +286,7 @@ struct operand { * These EFLAGS bits are restored from saved value during emulation, and * any changes are written back to the saved value after emulation. */ -#define EFLAGS_MASK (EFLG_OF|EFLG_SF|EFLG_ZF|EFLG_AF|EFLG_PF|EFLG_CF) +#define EFLAGS_MASK (EF_OF|EF_SF|EF_ZF|EF_AF|EF_PF|EF_CF) /* Before executing instruction: restore necessary bits in EFLAGS. */ #define _PRE_EFLAGS(_sav, _msk, _tmp) \ @@ -645,28 +635,28 @@ test_cc( switch ( (condition & 15) >> 1 ) { case 0: /* o */ - rc |= (flags & EFLG_OF); + rc |= (flags & EF_OF); break; case 1: /* b/c/nae */ - rc |= (flags & EFLG_CF); + rc |= (flags & EF_CF); break; case 2: /* z/e */ - rc |= (flags & EFLG_ZF); + rc |= (flags & EF_ZF); break; case 3: /* be/na */ - rc |= (flags & (EFLG_CF|EFLG_ZF)); + rc |= (flags & (EF_CF|EF_ZF)); break; case 4: /* s */ - rc |= (flags & EFLG_SF); + rc |= (flags & EF_SF); break; case 5: /* p/pe */ - rc |= (flags & EFLG_PF); + rc |= (flags & EF_PF); break; case 7: /* le/ng */ - rc |= (flags & EFLG_ZF); + rc |= (flags & EF_ZF); /* fall through */ case 6: /* l/nge */ - rc |= (!(flags & EFLG_SF) != !(flags & EFLG_OF)); + rc |= (!(flags & EF_SF) != !(flags & EF_OF)); break; } @@ -1196,9 +1186,9 @@ x86_emulate( /* arpl */ uint16_t src_val = dst.val; dst = src; - _regs.eflags &= ~EFLG_ZF; - _regs.eflags |= ((src_val & 3) > (dst.val & 3)) ? EFLG_ZF : 0; - if ( _regs.eflags & EFLG_ZF ) + _regs.eflags &= ~EF_ZF; + _regs.eflags |= ((src_val & 3) > (dst.val & 3)) ? EF_ZF : 0; + if ( _regs.eflags & EF_ZF ) dst.val = (dst.val & ~3) | (src_val & 3); else dst.type = OP_NONE; @@ -1208,27 +1198,27 @@ x86_emulate( case 0x69: /* imul imm16/32 */ case 0x6b: /* imul imm8 */ { unsigned long reg = *(long *)decode_register(modrm_reg, &_regs, 0); - _regs.eflags &= ~(EFLG_OF|EFLG_CF); + _regs.eflags &= ~(EF_OF|EF_CF); switch ( dst.bytes ) { case 2: dst.val = ((uint32_t)(int16_t)src.val * (uint32_t)(int16_t)reg); if ( (int16_t)dst.val != (uint32_t)dst.val ) - _regs.eflags |= EFLG_OF|EFLG_CF; + _regs.eflags |= EF_OF|EF_CF; break; #ifdef __x86_64__ case 4: dst.val = ((uint64_t)(int32_t)src.val * (uint64_t)(int32_t)reg); if ( (int32_t)dst.val != dst.val ) - _regs.eflags |= EFLG_OF|EFLG_CF; + _regs.eflags |= EF_OF|EF_CF; break; #endif default: { unsigned long m[2] = { src.val, reg }; if ( imul_dbl(m) ) - _regs.eflags |= EFLG_OF|EFLG_CF; + _regs.eflags |= EF_OF|EF_CF; dst.val = m[0]; break; } @@ -1372,32 +1362,32 @@ x86_emulate( dst.type = OP_REG; dst.reg = (unsigned long *)&_regs.eax; dst.val = *dst.reg; - _regs.eflags &= ~(EFLG_OF|EFLG_CF); + _regs.eflags &= ~(EF_OF|EF_CF); switch ( src.bytes ) { case 1: dst.val *= src.val; if ( (uint8_t)dst.val != (uint16_t)dst.val ) - _regs.eflags |= EFLG_OF|EFLG_CF; + _regs.eflags |= EF_OF|EF_CF; break; case 2: dst.val *= src.val; if ( (uint16_t)dst.val != (uint32_t)dst.val ) - _regs.eflags |= EFLG_OF|EFLG_CF; + _regs.eflags |= EF_OF|EF_CF; *(uint16_t *)&_regs.edx = dst.val >> 16; break; #ifdef __x86_64__ case 4: dst.val *= src.val; if ( (uint32_t)dst.val != dst.val ) - _regs.eflags |= EFLG_OF|EFLG_CF; + _regs.eflags |= EF_OF|EF_CF; _regs.edx = (uint32_t)(dst.val >> 32); break; #endif default: { unsigned long m[2] = { src.val, dst.val }; if ( mul_dbl(m) ) - _regs.eflags |= EFLG_OF|EFLG_CF; + _regs.eflags |= EF_OF|EF_CF; _regs.edx = m[1]; dst.val = m[0]; break; @@ -1409,20 +1399,20 @@ x86_emulate( dst.type = OP_REG; dst.reg = (unsigned long *)&_regs.eax; dst.val = *dst.reg; - _regs.eflags &= ~(EFLG_OF|EFLG_CF); + _regs.eflags &= ~(EF_OF|EF_CF); switch ( src.bytes ) { case 1: dst.val = ((uint16_t)(int8_t)src.val * (uint16_t)(int8_t)dst.val); if ( (int8_t)dst.val != (uint16_t)dst.val ) - _regs.eflags |= EFLG_OF|EFLG_CF; + _regs.eflags |= EF_OF|EF_CF; break; case 2: dst.val = ((uint32_t)(int16_t)src.val * (uint32_t)(int16_t)dst.val); if ( (int16_t)dst.val != (uint32_t)dst.val ) - _regs.eflags |= EFLG_OF|EFLG_CF; + _regs.eflags |= EF_OF|EF_CF; *(uint16_t *)&_regs.edx = dst.val >> 16; break; #ifdef __x86_64__ @@ -1430,14 +1420,14 @@ x86_emulate( dst.val = ((uint64_t)(int32_t)src.val * (uint64_t)(int32_t)dst.val); if ( (int32_t)dst.val != dst.val ) - _regs.eflags |= EFLG_OF|EFLG_CF; + _regs.eflags |= EF_OF|EF_CF; _regs.edx = (uint32_t)(dst.val >> 32); break; #endif default: { unsigned long m[2] = { src.val, dst.val }; if ( imul_dbl(m) ) - _regs.eflags |= EFLG_OF|EFLG_CF; + _regs.eflags |= EF_OF|EF_CF; _regs.edx = m[1]; dst.val = m[0]; break; @@ -1657,21 +1647,21 @@ x86_emulate( uint8_t al = _regs.eax; unsigned long eflags = _regs.eflags; generate_exception_if(mode_64bit(), EXC_UD); - _regs.eflags &= ~(EFLG_CF|EFLG_AF); - if ( ((al & 0x0f) > 9) || (eflags & EFLG_AF) ) + _regs.eflags &= ~(EF_CF|EF_AF); + if ( ((al & 0x0f) > 9) || (eflags & EF_AF) ) { *(uint8_t *)&_regs.eax += 6; - _regs.eflags |= EFLG_AF; + _regs.eflags |= EF_AF; } - if ( (al > 0x99) || (eflags & EFLG_CF) ) + if ( (al > 0x99) || (eflags & EF_CF) ) { *(uint8_t *)&_regs.eax += 0x60; - _regs.eflags |= EFLG_CF; + _regs.eflags |= EF_CF; } - _regs.eflags &= ~(EFLG_SF|EFLG_ZF|EFLG_PF); - _regs.eflags |= ((uint8_t)_regs.eax == 0) ? EFLG_ZF : 0; - _regs.eflags |= (( int8_t)_regs.eax < 0) ? EFLG_SF : 0; - _regs.eflags |= even_parity(_regs.eax) ? EFLG_PF : 0; + _regs.eflags &= ~(EF_SF|EF_ZF|EF_PF); + _regs.eflags |= ((uint8_t)_regs.eax == 0) ? EF_ZF : 0; + _regs.eflags |= (( int8_t)_regs.eax < 0) ? EF_SF : 0; + _regs.eflags |= even_parity(_regs.eax) ? EF_PF : 0; break; } @@ -1679,35 +1669,35 @@ x86_emulate( uint8_t al = _regs.eax; unsigned long eflags = _regs.eflags; generate_exception_if(mode_64bit(), EXC_UD); - _regs.eflags &= ~(EFLG_CF|EFLG_AF); - if ( ((al & 0x0f) > 9) || (eflags & EFLG_AF) ) + _regs.eflags &= ~(EF_CF|EF_AF); + if ( ((al & 0x0f) > 9) || (eflags & EF_AF) ) { - _regs.eflags |= EFLG_AF; - if ( (al < 6) || (eflags & EFLG_CF) ) - _regs.eflags |= EFLG_CF; + _regs.eflags |= EF_AF; + if ( (al < 6) || (eflags & EF_CF) ) + _regs.eflags |= EF_CF; *(uint8_t *)&_regs.eax -= 6; } - if ( (al > 0x99) || (eflags & EFLG_CF) ) + if ( (al > 0x99) || (eflags & EF_CF) ) { *(uint8_t *)&_regs.eax -= 0x60; - _regs.eflags |= EFLG_CF; + _regs.eflags |= EF_CF; } - _regs.eflags &= ~(EFLG_SF|EFLG_ZF|EFLG_PF); - _regs.eflags |= ((uint8_t)_regs.eax == 0) ? EFLG_ZF : 0; - _regs.eflags |= (( int8_t)_regs.eax < 0) ? EFLG_SF : 0; - _regs.eflags |= even_parity(_regs.eax) ? EFLG_PF : 0; + _regs.eflags &= ~(EF_SF|EF_ZF|EF_PF); + _regs.eflags |= ((uint8_t)_regs.eax == 0) ? EF_ZF : 0; + _regs.eflags |= (( int8_t)_regs.eax < 0) ? EF_SF : 0; + _regs.eflags |= even_parity(_regs.eax) ? EF_PF : 0; break; } case 0x37: /* aaa */ case 0x3f: /* aas */ generate_exception_if(mode_64bit(), EXC_UD); - _regs.eflags &= ~EFLG_CF; - if ( ((uint8_t)_regs.eax > 9) || (_regs.eflags & EFLG_AF) ) + _regs.eflags &= ~EF_CF; + if ( ((uint8_t)_regs.eax > 9) || (_regs.eflags & EF_AF) ) { ((uint8_t *)&_regs.eax)[0] += (b == 0x37) ? 6 : -6; ((uint8_t *)&_regs.eax)[1] += (b == 0x37) ? 1 : -1; - _regs.eflags |= EFLG_CF | EFLG_AF; + _regs.eflags |= EF_CF | EF_AF; } ((uint8_t *)&_regs.eax)[0] &= 0x0f; break; @@ -1799,7 +1789,7 @@ x86_emulate( &dst.val, ctxt)) != 0 ) goto done; register_address_increment( - _regs.edi, (_regs.eflags & EFLG_DF) ? -dst.bytes : dst.bytes); + _regs.edi, (_regs.eflags & EF_DF) ? -dst.bytes : dst.bytes); break; case 0x6e ... 0x6f: /* outs %esi,%dx */ @@ -1814,7 +1804,7 @@ x86_emulate( dst.val, ctxt)) != 0 ) goto done; register_address_increment( - _regs.esi, (_regs.eflags & EFLG_DF) ? -dst.bytes : dst.bytes); + _regs.esi, (_regs.eflags & EF_DF) ? -dst.bytes : dst.bytes); break; case 0x70 ... 0x7f: /* jcc (short) */ { @@ -1899,9 +1889,9 @@ x86_emulate( &dst.val, dst.bytes, ctxt)) != 0 ) goto done; register_address_increment( - _regs.esi, (_regs.eflags & EFLG_DF) ? -dst.bytes : dst.bytes); + _regs.esi, (_regs.eflags & EF_DF) ? -dst.bytes : dst.bytes); register_address_increment( - _regs.edi, (_regs.eflags & EFLG_DF) ? -dst.bytes : dst.bytes); + _regs.edi, (_regs.eflags & EF_DF) ? -dst.bytes : dst.bytes); break; case 0xaa ... 0xab: /* stos */ @@ -1912,7 +1902,7 @@ x86_emulate( dst.mem.off = truncate_ea(_regs.edi); dst.val = _regs.eax; register_address_increment( - _regs.edi, (_regs.eflags & EFLG_DF) ? -dst.bytes : dst.bytes); + _regs.edi, (_regs.eflags & EF_DF) ? -dst.bytes : dst.bytes); break; case 0xac ... 0xad: /* lods */ @@ -1924,7 +1914,7 @@ x86_emulate( &dst.val, dst.bytes, ctxt)) != 0 ) goto done; register_address_increment( - _regs.esi, (_regs.eflags & EFLG_DF) ? -dst.bytes : dst.bytes); + _regs.esi, (_regs.eflags & EF_DF) ? -dst.bytes : dst.bytes); break; case 0xc2: /* ret imm16 (near) */ @@ -1944,10 +1934,10 @@ x86_emulate( generate_exception_if(mode_64bit(), EXC_UD); generate_exception_if(base == 0, EXC_DE); *(uint16_t *)&_regs.eax = ((al / base) << 8) | (al % base); - _regs.eflags &= ~(EFLG_SF|EFLG_ZF|EFLG_PF); - _regs.eflags |= ((uint8_t)_regs.eax == 0) ? EFLG_ZF : 0; - _regs.eflags |= (( int8_t)_regs.eax < 0) ? EFLG_SF : 0; - _regs.eflags |= even_parity(_regs.eax) ? EFLG_PF : 0; + _regs.eflags &= ~(EF_SF|EF_ZF|EF_PF); + _regs.eflags |= ((uint8_t)_regs.eax == 0) ? EF_ZF : 0; + _regs.eflags |= (( int8_t)_regs.eax < 0) ? EF_SF : 0; + _regs.eflags |= even_parity(_regs.eax) ? EF_PF : 0; break; } @@ -1956,16 +1946,16 @@ x86_emulate( uint16_t ax = _regs.eax; generate_exception_if(mode_64bit(), EXC_UD); *(uint16_t *)&_regs.eax = (uint8_t)(ax + ((ax >> 8) * base)); - _regs.eflags &= ~(EFLG_SF|EFLG_ZF|EFLG_PF); - _regs.eflags |= ((uint8_t)_regs.eax == 0) ? EFLG_ZF : 0; - _regs.eflags |= (( int8_t)_regs.eax < 0) ? EFLG_SF : 0; - _regs.eflags |= even_parity(_regs.eax) ? EFLG_PF : 0; + _regs.eflags &= ~(EF_SF|EF_ZF|EF_PF); + _regs.eflags |= ((uint8_t)_regs.eax == 0) ? EF_ZF : 0; + _regs.eflags |= (( int8_t)_regs.eax < 0) ? EF_SF : 0; + _regs.eflags |= even_parity(_regs.eax) ? EF_PF : 0; break; } case 0xd6: /* salc */ generate_exception_if(mode_64bit(), EXC_UD); - *(uint8_t *)&_regs.eax = (_regs.eflags & EFLG_CF) ? 0xff : 0x00; + *(uint8_t *)&_regs.eax = (_regs.eflags & EF_CF) ? 0xff : 0x00; break; case 0xd7: /* xlat */ { @@ -1979,7 +1969,7 @@ x86_emulate( case 0xe0 ... 0xe2: /* loop{,z,nz} */ { int rel = insn_fetch_type(int8_t); - int do_jmp = !(_regs.eflags & EFLG_ZF); /* loopnz */ + int do_jmp = !(_regs.eflags & EF_ZF); /* loopnz */ if ( b == 0xe1 ) do_jmp = !do_jmp; /* loopz */ else if ( b == 0xe2 ) @@ -2067,37 +2057,37 @@ x86_emulate( break; case 0xf5: /* cmc */ - _regs.eflags ^= EFLG_CF; + _regs.eflags ^= EF_CF; break; case 0xf8: /* clc */ - _regs.eflags &= ~EFLG_CF; + _regs.eflags &= ~EF_CF; break; case 0xf9: /* stc */ - _regs.eflags |= EFLG_CF; + _regs.eflags |= EF_CF; break; case 0xfa: /* cli */ generate_exception_if(!mode_iopl(), EXC_GP); fail_if(ops->write_rflags == NULL); - if ( (rc = ops->write_rflags(_regs.eflags & ~EFLG_IF, ctxt)) != 0 ) + if ( (rc = ops->write_rflags(_regs.eflags & ~EF_IE, ctxt)) != 0 ) goto done; break; case 0xfb: /* sti */ generate_exception_if(!mode_iopl(), EXC_GP); fail_if(ops->write_rflags == NULL); - if ( (rc = ops->write_rflags(_regs.eflags | EFLG_IF, ctxt)) != 0 ) + if ( (rc = ops->write_rflags(_regs.eflags | EF_IE, ctxt)) != 0 ) goto done; break; case 0xfc: /* cld */ - _regs.eflags &= ~EFLG_DF; + _regs.eflags &= ~EF_DF; break; case 0xfd: /* std */ - _regs.eflags |= EFLG_DF; + _regs.eflags |= EF_DF; break; } goto writeback; @@ -2122,7 +2112,7 @@ x86_emulate( emulate_2op_SrcV("cmp", src, dst, _regs.eflags); /* Always write back. The question is: where to? */ d |= Mov; - if ( _regs.eflags & EFLG_ZF ) + if ( _regs.eflags & EF_ZF ) { /* Success: write back to memory. */ dst.val = src.orig_val; @@ -2148,27 +2138,27 @@ x86_emulate( break; case 0xaf: /* imul */ - _regs.eflags &= ~(EFLG_OF|EFLG_CF); + _regs.eflags &= ~(EF_OF|EF_CF); switch ( dst.bytes ) { case 2: dst.val = ((uint32_t)(int16_t)src.val * (uint32_t)(int16_t)dst.val); if ( (int16_t)dst.val != (uint32_t)dst.val ) - _regs.eflags |= EFLG_OF|EFLG_CF; + _regs.eflags |= EF_OF|EF_CF; break; #ifdef __x86_64__ case 4: dst.val = ((uint64_t)(int32_t)src.val * (uint64_t)(int32_t)dst.val); if ( (int32_t)dst.val != dst.val ) - _regs.eflags |= EFLG_OF|EFLG_CF; + _regs.eflags |= EF_OF|EF_CF; break; #endif default: { unsigned long m[2] = { src.val, dst.val }; if ( imul_dbl(m) ) - _regs.eflags |= EFLG_OF|EFLG_CF; + _regs.eflags |= EF_OF|EF_CF; dst.val = m[0]; break; } @@ -2187,8 +2177,8 @@ x86_emulate( asm ( "bsf %2,%0; setz %b1" : "=r" (dst.val), "=q" (zf) : "r" (src.val), "1" (0) ); - _regs.eflags &= ~EFLG_ZF; - _regs.eflags |= zf ? EFLG_ZF : 0; + _regs.eflags &= ~EF_ZF; + _regs.eflags |= zf ? EF_ZF : 0; break; } @@ -2197,8 +2187,8 @@ x86_emulate( asm ( "bsr %2,%0; setz %b1" : "=r" (dst.val), "=q" (zf) : "r" (src.val), "1" (0) ); - _regs.eflags &= ~EFLG_ZF; - _regs.eflags |= zf ? EFLG_ZF : 0; + _regs.eflags &= ~EF_ZF; + _regs.eflags |= zf ? EF_ZF : 0; break; } @@ -2349,7 +2339,7 @@ x86_emulate( { _regs.eax = old_lo; _regs.edx = old_hi; - _regs.eflags &= ~EFLG_ZF; + _regs.eflags &= ~EF_ZF; } else if ( ops->cmpxchg8b == NULL ) { @@ -2361,7 +2351,7 @@ x86_emulate( if ( (rc = ops->cmpxchg8b(ea.mem.seg, ea.mem.off, old_lo, old_hi, _regs.ebx, _regs.ecx, ctxt)) != 0 ) goto done; - _regs.eflags |= EFLG_ZF; + _regs.eflags |= EF_ZF; } break; } @@ -2376,7 +2366,7 @@ x86_emulate( { _regs.eax = (uint32_t)(old>>0); _regs.edx = (uint32_t)(old>>32); - _regs.eflags &= ~EFLG_ZF; + _regs.eflags &= ~EF_ZF; } else { @@ -2384,7 +2374,7 @@ x86_emulate( if ( (rc = ops->cmpxchg(ea.mem.seg, ea.mem.off, old, new, 8, ctxt)) != 0 ) goto done; - _regs.eflags |= EFLG_ZF; + _regs.eflags |= EF_ZF; } break; } _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Keir Fraser
2007-Jun-19 10:05 UTC
Re: [Xen-devel] [PATCH] x86: eliminate x86_emulate''s private EFLAGS definitions
On 19/6/07 10:54, "Jan Beulich" <jbeulich@novell.com> wrote:> .. in favor of using one of the two (i.e. already redundant) ones > found in the headers. > > Signed-off-by: Jan Beulich <jbeulich@novell.com>Currently x86_emulate is buildable ''out of tree'', e.g., in tools/tests. I want to keep that ability but it is the case that down the line we''ll be wanting more flags and structures to be sharable outside x86_emulate.c. I''m not sure yet what the right way of achieving that will be. -- Keir _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Jan Beulich
2007-Jun-19 10:21 UTC
Re: [Xen-devel] [PATCH] x86: eliminate x86_emulate''s private EFLAGS definitions
>>> Keir Fraser <Keir.Fraser@cl.cam.ac.uk> 19.06.07 12:05 >>> >On 19/6/07 10:54, "Jan Beulich" <jbeulich@novell.com> wrote: > >> .. in favor of using one of the two (i.e. already redundant) ones >> found in the headers. >> >> Signed-off-by: Jan Beulich <jbeulich@novell.com> > >Currently x86_emulate is buildable ''out of tree'', e.g., in tools/tests. I >want to keep that ability but it is the case that down the line we''ll be >wanting more flags and structures to be sharable outside x86_emulate.c. I''m >not sure yet what the right way of achieving that will be.Yes, I was afraid of something like that (I just didn''t know that I might be able to build the thing in tools/tests, I thought this was completely out of tree, and hence adding a local header would be possible). In that light, perhaps doing a little cleanup on the headers having the desired definitions, so that they can be included for the tool build, will do. I may find some time to look into this possibility. Jan _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel