Revision: linuxbios@linuxbios.org--devel/freebios--devel--2.0--patch-39
Creator: Li-Ta Lo <ollie@lanl.gov> TLA sucks again This is the third time I try to commit only the emulator changes. I hope this patch contains the emulator changes only. git-svn-id: svn://svn.coreboot.org/coreboot/trunk@1955 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
This commit is contained in:
parent
1c8cd59f3c
commit
34120d1b4f
|
@ -225,6 +225,7 @@ void X86EMU_dump_memory (u16 seg, u16 off, u32 amt)
|
||||||
|
|
||||||
void x86emu_single_step (void)
|
void x86emu_single_step (void)
|
||||||
{
|
{
|
||||||
|
#if 0
|
||||||
char s[1024];
|
char s[1024];
|
||||||
int ps[10];
|
int ps[10];
|
||||||
int ntok;
|
int ntok;
|
||||||
|
@ -313,6 +314,7 @@ void x86emu_single_step (void)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int X86EMU_trace_on(void)
|
int X86EMU_trace_on(void)
|
||||||
|
@ -327,6 +329,7 @@ int X86EMU_trace_off(void)
|
||||||
|
|
||||||
static int parse_line (char *s, int *ps, int *n)
|
static int parse_line (char *s, int *ps, int *n)
|
||||||
{
|
{
|
||||||
|
#if 0
|
||||||
int cmd;
|
int cmd;
|
||||||
|
|
||||||
*n = 0;
|
*n = 0;
|
||||||
|
@ -352,6 +355,7 @@ static int parse_line (char *s, int *ps, int *n)
|
||||||
sscanf(s,"%x",&ps[*n]);
|
sscanf(s,"%x",&ps[*n]);
|
||||||
*n += 1;
|
*n += 1;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* DEBUG */
|
#endif /* DEBUG */
|
||||||
|
|
|
@ -77,6 +77,8 @@ next instruction.
|
||||||
void x86emu_intr_raise(
|
void x86emu_intr_raise(
|
||||||
u8 intrnum)
|
u8 intrnum)
|
||||||
{
|
{
|
||||||
|
printk("%s, rasing execption %x\n", __func__, intrnum);
|
||||||
|
x86emu_dump_regs();
|
||||||
M.x86.intno = intrnum;
|
M.x86.intno = intrnum;
|
||||||
M.x86.intr |= INTR_SYNCH;
|
M.x86.intr |= INTR_SYNCH;
|
||||||
}
|
}
|
||||||
|
|
|
@ -70,7 +70,7 @@
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#include "x86emui.h"
|
#include "x86emu/x86emui.h"
|
||||||
|
|
||||||
/*----------------------------- Implementation ----------------------------*/
|
/*----------------------------- Implementation ----------------------------*/
|
||||||
|
|
||||||
|
@ -219,7 +219,8 @@ void x86emuOp_genop_byte_RM_R(u8 op1)
|
||||||
DECODE_PRINTF("\n");
|
DECODE_PRINTF("\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
destval = genop_byte_operation[op1](destval, *srcreg);
|
destval = genop_byte_operation[op1](destval, *srcreg);
|
||||||
store_data_byte(destoffset, destval);
|
if (op1 != 7)
|
||||||
|
store_data_byte(destoffset, destval);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ /* register to register */
|
{ /* register to register */
|
||||||
|
@ -262,7 +263,8 @@ void x86emuOp_genop_word_RM_R(u8 op1)
|
||||||
DECODE_PRINTF("\n");
|
DECODE_PRINTF("\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
destval = genop_long_operation[op1](destval, *srcreg);
|
destval = genop_long_operation[op1](destval, *srcreg);
|
||||||
store_data_long(destoffset, destval);
|
if (op1 != 7)
|
||||||
|
store_data_long(destoffset, destval);
|
||||||
} else {
|
} else {
|
||||||
u16 destval;
|
u16 destval;
|
||||||
u16 *srcreg;
|
u16 *srcreg;
|
||||||
|
@ -273,11 +275,12 @@ void x86emuOp_genop_word_RM_R(u8 op1)
|
||||||
DECODE_PRINTF("\n");
|
DECODE_PRINTF("\n");
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
destval = genop_word_operation[op1](destval, *srcreg);
|
destval = genop_word_operation[op1](destval, *srcreg);
|
||||||
store_data_word(destoffset, destval);
|
if (op1 != 7)
|
||||||
|
store_data_word(destoffset, destval);
|
||||||
}
|
}
|
||||||
} else { /* register to register */
|
} else { /* register to register */
|
||||||
if (M.x86.mode & SYSMODE_PREFIX_DATA) {
|
if (M.x86.mode & SYSMODE_PREFIX_DATA) {
|
||||||
u32 *destreg,*srcreg;
|
u32 *destreg, *srcreg;
|
||||||
|
|
||||||
destreg = DECODE_RM_LONG_REGISTER(rl);
|
destreg = DECODE_RM_LONG_REGISTER(rl);
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
|
@ -286,7 +289,7 @@ void x86emuOp_genop_word_RM_R(u8 op1)
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
*destreg = genop_long_operation[op1](*destreg, *srcreg);
|
*destreg = genop_long_operation[op1](*destreg, *srcreg);
|
||||||
} else {
|
} else {
|
||||||
u16 *destreg,*srcreg;
|
u16 *destreg, *srcreg;
|
||||||
|
|
||||||
destreg = DECODE_RM_WORD_REGISTER(rl);
|
destreg = DECODE_RM_WORD_REGISTER(rl);
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
|
@ -1332,9 +1335,7 @@ void x86emuOp_opc80_byte_RM_IMM(u8 X86EMU_UNUSED(op1))
|
||||||
imm = fetch_byte_imm();
|
imm = fetch_byte_imm();
|
||||||
DECODE_PRINTF2("%x\n", imm);
|
DECODE_PRINTF2("%x\n", imm);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
destval = (*genop_byte_operation[rh]) (*destreg, imm);
|
*destreg = (*genop_byte_operation[rh]) (*destreg, imm);
|
||||||
if (rh != 7)
|
|
||||||
*destreg = destval;
|
|
||||||
}
|
}
|
||||||
DECODE_CLEAR_SEGOVR();
|
DECODE_CLEAR_SEGOVR();
|
||||||
END_OF_INSTR();
|
END_OF_INSTR();
|
||||||
|
@ -1423,29 +1424,23 @@ void x86emuOp_opc81_word_RM_IMM(u8 X86EMU_UNUSED(op1))
|
||||||
}
|
}
|
||||||
} else { /* register to register */
|
} else { /* register to register */
|
||||||
if (M.x86.mode & SYSMODE_PREFIX_DATA) {
|
if (M.x86.mode & SYSMODE_PREFIX_DATA) {
|
||||||
u32 *destreg;
|
u32 *destreg, imm;
|
||||||
u32 destval,imm;
|
|
||||||
|
|
||||||
destreg = DECODE_RM_LONG_REGISTER(rl);
|
destreg = DECODE_RM_LONG_REGISTER(rl);
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
imm = fetch_long_imm();
|
imm = fetch_long_imm();
|
||||||
DECODE_PRINTF2("%x\n", imm);
|
DECODE_PRINTF2("%x\n", imm);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
destval = (*genop_long_operation[rh]) (*destreg, imm);
|
*destreg = (*genop_long_operation[rh]) (*destreg, imm);
|
||||||
if (rh != 7)
|
|
||||||
*destreg = destval;
|
|
||||||
} else {
|
} else {
|
||||||
u16 *destreg;
|
u16 *destreg, imm;
|
||||||
u16 destval,imm;
|
|
||||||
|
|
||||||
destreg = DECODE_RM_WORD_REGISTER(rl);
|
destreg = DECODE_RM_WORD_REGISTER(rl);
|
||||||
DECODE_PRINTF(",");
|
DECODE_PRINTF(",");
|
||||||
imm = fetch_word_imm();
|
imm = fetch_word_imm();
|
||||||
DECODE_PRINTF2("%x\n", imm);
|
DECODE_PRINTF2("%x\n", imm);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
destval = (*genop_word_operation[rh]) (*destreg, imm);
|
*destreg = (*genop_word_operation[rh]) (*destreg, imm);
|
||||||
if (rh != 7)
|
|
||||||
*destreg = destval;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
DECODE_CLEAR_SEGOVR();
|
DECODE_CLEAR_SEGOVR();
|
||||||
|
@ -1523,9 +1518,7 @@ void x86emuOp_opc82_byte_RM_IMM(u8 X86EMU_UNUSED(op1))
|
||||||
imm = fetch_byte_imm();
|
imm = fetch_byte_imm();
|
||||||
DECODE_PRINTF2(",%x\n", imm);
|
DECODE_PRINTF2(",%x\n", imm);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
destval = (*genop_byte_operation[rh]) (*destreg, imm);
|
*destreg = (*genop_byte_operation[rh]) (*destreg, imm);
|
||||||
if (rh != 7)
|
|
||||||
*destreg = destval;
|
|
||||||
}
|
}
|
||||||
DECODE_CLEAR_SEGOVR();
|
DECODE_CLEAR_SEGOVR();
|
||||||
END_OF_INSTR();
|
END_OF_INSTR();
|
||||||
|
@ -1611,27 +1604,21 @@ void x86emuOp_opc83_word_RM_IMM(u8 X86EMU_UNUSED(op1))
|
||||||
}
|
}
|
||||||
} else { /* register to register */
|
} else { /* register to register */
|
||||||
if (M.x86.mode & SYSMODE_PREFIX_DATA) {
|
if (M.x86.mode & SYSMODE_PREFIX_DATA) {
|
||||||
u32 *destreg;
|
u32 *destreg, imm;
|
||||||
u32 destval,imm;
|
|
||||||
|
|
||||||
destreg = DECODE_RM_LONG_REGISTER(rl);
|
destreg = DECODE_RM_LONG_REGISTER(rl);
|
||||||
imm = (s8) fetch_byte_imm();
|
imm = (s8) fetch_byte_imm();
|
||||||
DECODE_PRINTF2(",%x\n", imm);
|
DECODE_PRINTF2(",%x\n", imm);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
destval = (*genop_long_operation[rh]) (*destreg, imm);
|
*destreg = (*genop_long_operation[rh]) (*destreg, imm);
|
||||||
if (rh != 7)
|
|
||||||
*destreg = destval;
|
|
||||||
} else {
|
} else {
|
||||||
u16 *destreg;
|
u16 *destreg, imm;
|
||||||
u16 destval,imm;
|
|
||||||
|
|
||||||
destreg = DECODE_RM_WORD_REGISTER(rl);
|
destreg = DECODE_RM_WORD_REGISTER(rl);
|
||||||
imm = (s8) fetch_byte_imm();
|
imm = (s8) fetch_byte_imm();
|
||||||
DECODE_PRINTF2(",%x\n", imm);
|
DECODE_PRINTF2(",%x\n", imm);
|
||||||
TRACE_AND_STEP();
|
TRACE_AND_STEP();
|
||||||
destval = (*genop_word_operation[rh]) (*destreg, imm);
|
*destreg = (*genop_word_operation[rh]) (*destreg, imm);
|
||||||
if (rh != 7)
|
|
||||||
*destreg = destval;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
DECODE_CLEAR_SEGOVR();
|
DECODE_CLEAR_SEGOVR();
|
||||||
|
|
|
@ -61,7 +61,7 @@ void x86emuOp2_illegal_op(
|
||||||
END_OF_INSTR();
|
END_OF_INSTR();
|
||||||
}
|
}
|
||||||
|
|
||||||
#define xorl(a,b) ((a) && !(b)) || (!(a) && (b))
|
#define xorl(a,b) (((a) && !(b)) || (!(a) && (b)))
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
REMARKS:
|
REMARKS:
|
||||||
|
|
|
@ -1921,7 +1921,7 @@ Implements the IMUL instruction and side effects.
|
||||||
void imul_long_direct(u32 *res_lo, u32* res_hi,u32 d, u32 s)
|
void imul_long_direct(u32 *res_lo, u32* res_hi,u32 d, u32 s)
|
||||||
{
|
{
|
||||||
#ifdef __HAS_LONG_LONG__
|
#ifdef __HAS_LONG_LONG__
|
||||||
s64 res = (s32)d * (s32)s;
|
s64 res = (s64)d * (s64)s;
|
||||||
|
|
||||||
*res_lo = (u32)res;
|
*res_lo = (u32)res;
|
||||||
*res_hi = (u32)(res >> 32);
|
*res_hi = (u32)(res >> 32);
|
||||||
|
|
Loading…
Reference in New Issue