x86emu: Respect the LEA 67h address size prefix.
Signed-off-by: Christian Zander <chzander@nvidia.com> Signed-off-by: Aaron Plattner <aplattner@nvidia.com> Tested-by: Tiago Vignatti <tiago.vignatti@nokia.com> Signed-off-by: Keith Packard <keithp@keithp.com>
This commit is contained in:
		
							parent
							
								
									2984c18eb9
								
							
						
					
					
						commit
						f57bc0ede8
					
				| 
						 | 
					@ -6567,42 +6567,62 @@ Handles opcode 0x8d
 | 
				
			||||||
static void x86emuOp_lea_word_R_M(u8 X86EMU_UNUSED(op1))
 | 
					static void x86emuOp_lea_word_R_M(u8 X86EMU_UNUSED(op1))
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int mod, rl, rh;
 | 
					    int mod, rl, rh;
 | 
				
			||||||
    u16 *srcreg;
 | 
					 | 
				
			||||||
    uint destoffset;
 | 
					    uint destoffset;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * TODO: Need to handle address size prefix!
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * lea  eax,[eax+ebx*2] ??
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    START_OF_INSTR();
 | 
					    START_OF_INSTR();
 | 
				
			||||||
    DECODE_PRINTF("LEA\t");
 | 
					    DECODE_PRINTF("LEA\t");
 | 
				
			||||||
    FETCH_DECODE_MODRM(mod, rh, rl);
 | 
					    FETCH_DECODE_MODRM(mod, rh, rl);
 | 
				
			||||||
    switch (mod) {
 | 
					    switch (mod) {
 | 
				
			||||||
    case 0:
 | 
					    case 0:
 | 
				
			||||||
        srcreg = DECODE_RM_WORD_REGISTER(rh);
 | 
					        if (M.x86.mode & SYSMODE_PREFIX_ADDR) {
 | 
				
			||||||
        DECODE_PRINTF(",");
 | 
					            u32 *srcreg = DECODE_RM_LONG_REGISTER(rh);
 | 
				
			||||||
        destoffset = decode_rm00_address(rl);
 | 
					            DECODE_PRINTF(",");
 | 
				
			||||||
        DECODE_PRINTF("\n");
 | 
					            destoffset = decode_rm00_address(rl);
 | 
				
			||||||
        TRACE_AND_STEP();
 | 
					            DECODE_PRINTF("\n");
 | 
				
			||||||
        *srcreg = (u16)destoffset;
 | 
					            TRACE_AND_STEP();
 | 
				
			||||||
 | 
					            *srcreg = (u32)destoffset;
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            u16 *srcreg = DECODE_RM_WORD_REGISTER(rh);
 | 
				
			||||||
 | 
					            DECODE_PRINTF(",");
 | 
				
			||||||
 | 
					            destoffset = decode_rm00_address(rl);
 | 
				
			||||||
 | 
					            DECODE_PRINTF("\n");
 | 
				
			||||||
 | 
					            TRACE_AND_STEP();
 | 
				
			||||||
 | 
					            *srcreg = (u16)destoffset;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    case 1:
 | 
					    case 1:
 | 
				
			||||||
        srcreg = DECODE_RM_WORD_REGISTER(rh);
 | 
					        if (M.x86.mode & SYSMODE_PREFIX_ADDR) {
 | 
				
			||||||
        DECODE_PRINTF(",");
 | 
					            u32 *srcreg = DECODE_RM_LONG_REGISTER(rh);
 | 
				
			||||||
        destoffset = decode_rm01_address(rl);
 | 
					            DECODE_PRINTF(",");
 | 
				
			||||||
        DECODE_PRINTF("\n");
 | 
					            destoffset = decode_rm01_address(rl);
 | 
				
			||||||
        TRACE_AND_STEP();
 | 
					            DECODE_PRINTF("\n");
 | 
				
			||||||
        *srcreg = (u16)destoffset;
 | 
					            TRACE_AND_STEP();
 | 
				
			||||||
 | 
					            *srcreg = (u32)destoffset;
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            u16 *srcreg = DECODE_RM_WORD_REGISTER(rh);
 | 
				
			||||||
 | 
					            DECODE_PRINTF(",");
 | 
				
			||||||
 | 
					            destoffset = decode_rm01_address(rl);
 | 
				
			||||||
 | 
					            DECODE_PRINTF("\n");
 | 
				
			||||||
 | 
					            TRACE_AND_STEP();
 | 
				
			||||||
 | 
					            *srcreg = (u16)destoffset;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    case 2:
 | 
					    case 2:
 | 
				
			||||||
        srcreg = DECODE_RM_WORD_REGISTER(rh);
 | 
					        if (M.x86.mode & SYSMODE_PREFIX_ADDR) {
 | 
				
			||||||
        DECODE_PRINTF(",");
 | 
					            u32 *srcreg = DECODE_RM_LONG_REGISTER(rh);
 | 
				
			||||||
        destoffset = decode_rm10_address(rl);
 | 
					            DECODE_PRINTF(",");
 | 
				
			||||||
        DECODE_PRINTF("\n");
 | 
					            destoffset = decode_rm10_address(rl);
 | 
				
			||||||
        TRACE_AND_STEP();
 | 
					            DECODE_PRINTF("\n");
 | 
				
			||||||
        *srcreg = (u16)destoffset;
 | 
					            TRACE_AND_STEP();
 | 
				
			||||||
 | 
					            *srcreg = (u32)destoffset;
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            u16 *srcreg = DECODE_RM_WORD_REGISTER(rh);
 | 
				
			||||||
 | 
					            DECODE_PRINTF(",");
 | 
				
			||||||
 | 
					            destoffset = decode_rm10_address(rl);
 | 
				
			||||||
 | 
					            DECODE_PRINTF("\n");
 | 
				
			||||||
 | 
					            TRACE_AND_STEP();
 | 
				
			||||||
 | 
					            *srcreg = (u16)destoffset;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    case 3:                     /* register to register */
 | 
					    case 3:                     /* register to register */
 | 
				
			||||||
        /* undefined.  Do nothing. */
 | 
					        /* undefined.  Do nothing. */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue