diff options
Diffstat (limited to 'roms/SLOF/other-licence/x86emu')
| -rw-r--r-- | roms/SLOF/other-licence/x86emu/Makefile | 48 | ||||
| -rw-r--r-- | roms/SLOF/other-licence/x86emu/x86emu_changes.diff | 877 | ||||
| -rwxr-xr-x | roms/SLOF/other-licence/x86emu/x86emu_download.sh | 61 | 
3 files changed, 986 insertions, 0 deletions
diff --git a/roms/SLOF/other-licence/x86emu/Makefile b/roms/SLOF/other-licence/x86emu/Makefile new file mode 100644 index 00000000..c25bc15a --- /dev/null +++ b/roms/SLOF/other-licence/x86emu/Makefile @@ -0,0 +1,48 @@ +# ***************************************************************************** +# * Copyright (c) 2004, 2008 IBM Corporation +# * All rights reserved. +# * This program and the accompanying materials +# * are made available under the terms of the BSD License +# * which accompanies this distribution, and is available at +# * http://www.opensource.org/licenses/bsd-license.php +# * +# * Contributors: +# *     IBM Corporation - initial implementation +# ****************************************************************************/ + +ifndef TOP +  TOP = $(shell while ! test -e make.rules; do cd ..  ; done; pwd) +  export TOP +endif +include $(TOP)/make.rules + +ROOTDIR ?= ../.. + +LDFLAGS		= +ASFLAGS		= -I./include -Wa,-mregnames + +#NOTE: -DDEBUG only needed for debugging/tracing... +CFLAGS		= -UDEBUG -m64 -I. -I./include -I./include/x86emu \ +		  -I$(TOP)/clients/net-snk/include -I$(ROOTDIR)/include \ +		  -I$(ROOTDIR)/lib/libc/include -O3 -nostdinc -fno-builtin \ +		  -ffreestanding -Wall -Wno-unused + +X86EMU_OBJS	= debug.o decode.o fpu.o ops2.o ops.o prim_ops.o sys.o + +%.o: %.S +		$(CC) $(ASFLAGS) -c -o $@  $^ + +%.o: %.c +		$(CC) $(CFLAGS) -c -o $@ $^ + +all: libx86emu.a + +libx86emu.a: $(X86EMU_OBJS) +	$(AR) -rc $@ $^ +	$(RANLIB) $@ + +clean: +	$(RM) *.o *.i *.s libx86emu.a  + +distclean: clean + diff --git a/roms/SLOF/other-licence/x86emu/x86emu_changes.diff b/roms/SLOF/other-licence/x86emu/x86emu_changes.diff new file mode 100644 index 00000000..52b971a7 --- /dev/null +++ b/roms/SLOF/other-licence/x86emu/x86emu_changes.diff @@ -0,0 +1,877 @@ +Index: debug.c +=================================================================== +RCS file: /cvs/osdf/cvs/host/other-licence/x86emu/debug.c,v +retrieving revision 1.1 +retrieving revision 1.3 +diff -u -u -r1.1 -r1.3 +--- debug.c	7 Sep 2007 10:01:21 -0000	1.1 ++++ debug.c	15 Jan 2008 13:49:25 -0000	1.3 +@@ -52,7 +52,11 @@ + void X86EMU_trace_regs (void) + { +     if (DEBUG_TRACE()) { +-        x86emu_dump_regs(); ++	if (M.x86.mode & (SYSMODE_PREFIX_DATA | SYSMODE_PREFIX_ADDR)) { ++	        x86emu_dump_xregs(); ++	} else { ++	        x86emu_dump_regs(); ++	} +     } +     if (DEBUG_DECODE() && ! DEBUG_DECODE_NOPRINT()) { +         printk("%04x:%04x ",M.x86.saved_cs, M.x86.saved_ip); +@@ -185,7 +189,7 @@ +     for (i=0; i< M.x86.enc_pos; i++) { +         sprintf(buf1+2*i,"%02x", fetch_data_byte_abs(s,o+i)); +     } +-    printk("%-20s",buf1); ++    printk("%-20s ",buf1); + } +  + static void print_decoded_instruction (void) +Index: ops2.c +=================================================================== +RCS file: /cvs/osdf/cvs/host/other-licence/x86emu/ops2.c,v +retrieving revision 1.1 +retrieving revision 1.3 +diff -u -u -r1.1 -r1.3 +--- ops2.c	7 Sep 2007 10:01:21 -0000	1.1 ++++ ops2.c	20 Mar 2008 15:48:34 -0000	1.3 +@@ -149,8 +149,69 @@ +     target += (s16) M.x86.R_IP; +     DECODE_PRINTF2("%04x\n", target); +     TRACE_AND_STEP(); +-    if (cond) ++    if (cond) { +         M.x86.R_IP = (u16)target; ++	JMP_TRACE(M.x86.saved_cs, M.x86.saved_ip, M.x86.R_CS, M.x86.R_IP, " LONG COND "); ++    } ++    DECODE_CLEAR_SEGOVR(); ++    END_OF_INSTR(); ++} ++ ++/**************************************************************************** ++REMARKS: ++Handles opcode 0x0f,0xC8-0xCF ++****************************************************************************/ ++s32 x86emu_bswap(s32 reg) ++{ ++   // perform the byte swap ++   s32 temp = reg; ++   reg = (temp & 0xFF000000) >> 24; ++   reg |= (temp & 0xFF0000) >> 8; ++   reg |= (temp & 0xFF00) << 8; ++   reg |= (temp & 0xFF) << 24; ++   return reg; ++} ++ ++void x86emuOp2_bswap(u8 op2) ++{ ++    /* byte swap 32 bit register */ ++    START_OF_INSTR(); ++    DECODE_PRINTF("BSWAP\t"); ++    switch (op2) { ++      case 0xc8: ++        DECODE_PRINTF("EAX\n"); ++        M.x86.R_EAX = x86emu_bswap(M.x86.R_EAX); ++        break; ++      case 0xc9: ++        DECODE_PRINTF("ECX\n"); ++        M.x86.R_ECX = x86emu_bswap(M.x86.R_ECX); ++        break; ++      case 0xca: ++        DECODE_PRINTF("EDX\n"); ++        M.x86.R_EDX = x86emu_bswap(M.x86.R_EDX); ++        break; ++      case 0xcb: ++        DECODE_PRINTF("EBX\n"); ++        M.x86.R_EBX = x86emu_bswap(M.x86.R_EBX); ++        break; ++      case 0xcc: ++        DECODE_PRINTF("ESP\n"); ++        M.x86.R_ESP = x86emu_bswap(M.x86.R_ESP); ++        break; ++      case 0xcd: ++        DECODE_PRINTF("EBP\n"); ++        M.x86.R_EBP = x86emu_bswap(M.x86.R_EBP); ++        break; ++      case 0xce: ++        DECODE_PRINTF("ESI\n"); ++        M.x86.R_ESI = x86emu_bswap(M.x86.R_ESI); ++        break; ++      case 0xcf: ++        DECODE_PRINTF("EDI\n"); ++        M.x86.R_EDI = x86emu_bswap(M.x86.R_EDI); ++        break; ++    } ++    TRACE_AND_STEP(); +     DECODE_CLEAR_SEGOVR(); +     END_OF_INSTR(); + } +@@ -1702,14 +1763,14 @@ + /*  0xc5 */ x86emuOp2_illegal_op, + /*  0xc6 */ x86emuOp2_illegal_op, + /*  0xc7 */ x86emuOp2_illegal_op, +-/*  0xc8 */ x86emuOp2_illegal_op,  /* TODO: bswap */ +-/*  0xc9 */ x86emuOp2_illegal_op,  /* TODO: bswap */ +-/*  0xca */ x86emuOp2_illegal_op,  /* TODO: bswap */ +-/*  0xcb */ x86emuOp2_illegal_op,  /* TODO: bswap */ +-/*  0xcc */ x86emuOp2_illegal_op,  /* TODO: bswap */ +-/*  0xcd */ x86emuOp2_illegal_op,  /* TODO: bswap */ +-/*  0xce */ x86emuOp2_illegal_op,  /* TODO: bswap */ +-/*  0xcf */ x86emuOp2_illegal_op,  /* TODO: bswap */ ++/*  0xc8 */ x86emuOp2_bswap, ++/*  0xc9 */ x86emuOp2_bswap, ++/*  0xca */ x86emuOp2_bswap, ++/*  0xcb */ x86emuOp2_bswap, ++/*  0xcc */ x86emuOp2_bswap, ++/*  0xcd */ x86emuOp2_bswap, ++/*  0xce */ x86emuOp2_bswap, ++/*  0xcf */ x86emuOp2_bswap, +  + /*  0xd0 */ x86emuOp2_illegal_op, + /*  0xd1 */ x86emuOp2_illegal_op, +Index: ops.c +=================================================================== +RCS file: /cvs/osdf/cvs/host/other-licence/x86emu/ops.c,v +retrieving revision 1.1 +diff -u -u -r1.1 ops.c +--- ops.c	7 Sep 2007 10:01:21 -0000	1.1 ++++ ops.c	20 Mar 2008 16:52:00 -0000 +@@ -1061,7 +1061,11 @@ +     imm = (s8)fetch_byte_imm(); +     DECODE_PRINTF2("PUSH\t%d\n", imm); +     TRACE_AND_STEP(); +-    push_word(imm); ++    if (M.x86.mode & SYSMODE_PREFIX_DATA) { ++        push_long(imm); ++    } else { ++        push_word(imm); ++    } +     DECODE_CLEAR_SEGOVR(); +     END_OF_INSTR(); + } +@@ -1256,8 +1260,10 @@ +     target = (u16)(M.x86.R_IP + (s16)offset); +     DECODE_PRINTF2("%x\n", target); +     TRACE_AND_STEP(); +-    if (cond) ++    if (cond) { +         M.x86.R_IP = target; ++	JMP_TRACE(M.x86.saved_cs, M.x86.saved_ip, M.x86.R_CS, M.x86.R_IP, " NEAR COND "); ++    } +     DECODE_CLEAR_SEGOVR(); +     END_OF_INSTR(); + } +@@ -2516,9 +2522,11 @@ +     count = 1; +     if (M.x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) { +         /* dont care whether REPE or REPNE */ +-        /* move them until CX is ZERO. */ +-        count = M.x86.R_CX; ++        /* move them until (E)CX is ZERO. */ ++        count = (M.x86.mode & SYSMODE_32BIT_REP) ? M.x86.R_ECX : M.x86.R_CX; +         M.x86.R_CX = 0; ++	if (M.x86.mode & SYSMODE_32BIT_REP) ++            M.x86.R_ECX = 0; +         M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE); +     } +     while (count--) { +@@ -2526,6 +2534,8 @@ +         store_data_byte_abs(M.x86.R_ES, M.x86.R_DI, val); +         M.x86.R_SI += inc; +         M.x86.R_DI += inc; ++        if (M.x86.intr & INTR_HALTED) ++            break; +     } +     DECODE_CLEAR_SEGOVR(); +     END_OF_INSTR(); +@@ -2559,9 +2569,11 @@ +     count = 1; +     if (M.x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) { +         /* dont care whether REPE or REPNE */ +-        /* move them until CX is ZERO. */ +-        count = M.x86.R_CX; ++        /* move them until (E)CX is ZERO. */ ++        count = (M.x86.mode & SYSMODE_32BIT_REP) ? M.x86.R_ECX : M.x86.R_CX; +         M.x86.R_CX = 0; ++	if (M.x86.mode & SYSMODE_32BIT_REP) ++            M.x86.R_ECX = 0; +         M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE); +     } +     while (count--) { +@@ -2574,6 +2586,8 @@ +         } +         M.x86.R_SI += inc; +         M.x86.R_DI += inc; ++        if (M.x86.intr & INTR_HALTED) ++            break; +     } +     DECODE_CLEAR_SEGOVR(); +     END_OF_INSTR(); +@@ -2598,16 +2612,21 @@ +  +     if (M.x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) { +         /* REPE  */ +-        /* move them until CX is ZERO. */ +-        while (M.x86.R_CX != 0) { ++        /* move them until (E)CX is ZERO. */ ++        while (((M.x86.mode & SYSMODE_32BIT_REP) ? M.x86.R_ECX : M.x86.R_CX) != 0) { +             val1 = fetch_data_byte(M.x86.R_SI); +             val2 = fetch_data_byte_abs(M.x86.R_ES, M.x86.R_DI); +                      cmp_byte(val1, val2); +-            M.x86.R_CX -= 1; ++            if (M.x86.mode & SYSMODE_32BIT_REP) ++                M.x86.R_ECX -= 1; ++            else ++                M.x86.R_CX -= 1; +             M.x86.R_SI += inc; +             M.x86.R_DI += inc; +             if ( (M.x86.mode & SYSMODE_PREFIX_REPE) && (ACCESS_FLAG(F_ZF) == 0) ) break; +             if ( (M.x86.mode & SYSMODE_PREFIX_REPNE) && ACCESS_FLAG(F_ZF) ) break; ++            if (M.x86.intr & INTR_HALTED) ++                break; +         } +         M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE); +     } else { +@@ -2644,8 +2663,8 @@ +     TRACE_AND_STEP(); +     if (M.x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) { +         /* REPE  */ +-        /* move them until CX is ZERO. */ +-        while (M.x86.R_CX != 0) { ++        /* move them until (E)CX is ZERO. */ ++        while (((M.x86.mode & SYSMODE_32BIT_REP) ? M.x86.R_ECX : M.x86.R_CX) != 0) { +             if (M.x86.mode & SYSMODE_PREFIX_DATA) { +                 val1 = fetch_data_long(M.x86.R_SI); +                 val2 = fetch_data_long_abs(M.x86.R_ES, M.x86.R_DI); +@@ -2655,11 +2674,16 @@ +                 val2 = fetch_data_word_abs(M.x86.R_ES, M.x86.R_DI); +                 cmp_word((u16)val1, (u16)val2); +             } +-            M.x86.R_CX -= 1; ++            if (M.x86.mode & SYSMODE_32BIT_REP) ++                M.x86.R_ECX -= 1; ++            else ++                M.x86.R_CX -= 1; +             M.x86.R_SI += inc; +             M.x86.R_DI += inc; +             if ( (M.x86.mode & SYSMODE_PREFIX_REPE) && ACCESS_FLAG(F_ZF) == 0 ) break; +             if ( (M.x86.mode & SYSMODE_PREFIX_REPNE) && ACCESS_FLAG(F_ZF) ) break; ++            if (M.x86.intr & INTR_HALTED) ++                break; +         } +         M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE); +     } else { +@@ -2741,11 +2765,16 @@ +     TRACE_AND_STEP(); +     if (M.x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) { +         /* dont care whether REPE or REPNE */ +-        /* move them until CX is ZERO. */ +-        while (M.x86.R_CX != 0) { ++        /* move them until (E)CX is ZERO. */ ++        while (((M.x86.mode & SYSMODE_32BIT_REP) ? M.x86.R_ECX : M.x86.R_CX) != 0) { +             store_data_byte_abs(M.x86.R_ES, M.x86.R_DI, M.x86.R_AL); +-            M.x86.R_CX -= 1; ++            if (M.x86.mode & SYSMODE_32BIT_REP) ++                M.x86.R_ECX -= 1; ++            else ++                M.x86.R_CX -= 1; +             M.x86.R_DI += inc; ++            if (M.x86.intr & INTR_HALTED) ++                break; +         } +         M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE); +     } else { +@@ -2783,9 +2812,11 @@ +     count = 1; +     if (M.x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) { +         /* dont care whether REPE or REPNE */ +-        /* move them until CX is ZERO. */ +-        count = M.x86.R_CX; ++        /* move them until (E)CX is ZERO. */ ++        count = (M.x86.mode & SYSMODE_32BIT_REP) ? M.x86.R_ECX : M.x86.R_CX; +         M.x86.R_CX = 0; ++	if (M.x86.mode & SYSMODE_32BIT_REP) ++            M.x86.R_ECX = 0; +         M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE); +     } +     while (count--) { +@@ -2795,6 +2826,8 @@ +             store_data_word_abs(M.x86.R_ES, M.x86.R_DI, M.x86.R_AX); +         } +         M.x86.R_DI += inc; ++        if (M.x86.intr & INTR_HALTED) ++            break; +     } +     DECODE_CLEAR_SEGOVR(); +     END_OF_INSTR(); +@@ -2817,11 +2850,16 @@ +         inc = 1; +     if (M.x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) { +         /* dont care whether REPE or REPNE */ +-        /* move them until CX is ZERO. */ +-        while (M.x86.R_CX != 0) { ++        /* move them until (E)CX is ZERO. */ ++        while (((M.x86.mode & SYSMODE_32BIT_REP) ? M.x86.R_ECX : M.x86.R_CX) != 0) { +             M.x86.R_AL = fetch_data_byte(M.x86.R_SI); +-            M.x86.R_CX -= 1; ++            if (M.x86.mode & SYSMODE_32BIT_REP) ++                M.x86.R_ECX -= 1; ++            else ++                M.x86.R_CX -= 1; +             M.x86.R_SI += inc; ++            if (M.x86.intr & INTR_HALTED) ++                break; +         } +         M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE); +     } else { +@@ -2859,9 +2897,11 @@ +     count = 1; +     if (M.x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) { +         /* dont care whether REPE or REPNE */ +-        /* move them until CX is ZERO. */ +-        count = M.x86.R_CX; ++        /* move them until (E)CX is ZERO. */ ++        count = (M.x86.mode & SYSMODE_32BIT_REP) ? M.x86.R_ECX : M.x86.R_CX; +         M.x86.R_CX = 0; ++	if (M.x86.mode & SYSMODE_32BIT_REP) ++            M.x86.R_ECX = 0; +         M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE); +     } +     while (count--) { +@@ -2871,6 +2911,8 @@ +             M.x86.R_AX = fetch_data_word(M.x86.R_SI); +         } +         M.x86.R_SI += inc; ++        if (M.x86.intr & INTR_HALTED) ++            break; +     } +     DECODE_CLEAR_SEGOVR(); +     END_OF_INSTR(); +@@ -2894,26 +2936,36 @@ +         inc = 1; +     if (M.x86.mode & SYSMODE_PREFIX_REPE) { +         /* REPE  */ +-        /* move them until CX is ZERO. */ +-        while (M.x86.R_CX != 0) { ++        /* move them until (E)CX is ZERO. */ ++        while (((M.x86.mode & SYSMODE_32BIT_REP) ? M.x86.R_ECX : M.x86.R_CX) != 0) { +             val2 = fetch_data_byte_abs(M.x86.R_ES, M.x86.R_DI); +             cmp_byte(M.x86.R_AL, val2); +-            M.x86.R_CX -= 1; ++            if (M.x86.mode & SYSMODE_32BIT_REP) ++                M.x86.R_ECX -= 1; ++            else ++                M.x86.R_CX -= 1; +             M.x86.R_DI += inc; +             if (ACCESS_FLAG(F_ZF) == 0) +                 break; ++            if (M.x86.intr & INTR_HALTED) ++                break; +         } +         M.x86.mode &= ~SYSMODE_PREFIX_REPE; +     } else if (M.x86.mode & SYSMODE_PREFIX_REPNE) { +         /* REPNE  */ +-        /* move them until CX is ZERO. */ +-        while (M.x86.R_CX != 0) { ++        /* move them until (E)CX is ZERO. */ ++        while (((M.x86.mode & SYSMODE_32BIT_REP) ? M.x86.R_ECX : M.x86.R_CX) != 0) { +             val2 = fetch_data_byte_abs(M.x86.R_ES, M.x86.R_DI); +             cmp_byte(M.x86.R_AL, val2); +-            M.x86.R_CX -= 1; ++            if (M.x86.mode & SYSMODE_32BIT_REP) ++                M.x86.R_ECX -= 1; ++            else ++                M.x86.R_CX -= 1; +             M.x86.R_DI += inc; +             if (ACCESS_FLAG(F_ZF)) +                 break;          /* zero flag set means equal */ ++            if (M.x86.intr & INTR_HALTED) ++                break; +         } +         M.x86.mode &= ~SYSMODE_PREFIX_REPNE; +     } else { +@@ -2951,8 +3003,8 @@ +     TRACE_AND_STEP(); +     if (M.x86.mode & SYSMODE_PREFIX_REPE) { +         /* REPE  */ +-        /* move them until CX is ZERO. */ +-        while (M.x86.R_CX != 0) { ++        /* move them until (E)CX is ZERO. */ ++        while (((M.x86.mode & SYSMODE_32BIT_REP) ? M.x86.R_ECX : M.x86.R_CX) != 0) { +             if (M.x86.mode & SYSMODE_PREFIX_DATA) { +                 val = fetch_data_long_abs(M.x86.R_ES, M.x86.R_DI); +                 cmp_long(M.x86.R_EAX, val); +@@ -2960,16 +3012,21 @@ +                 val = fetch_data_word_abs(M.x86.R_ES, M.x86.R_DI); +                 cmp_word(M.x86.R_AX, (u16)val); +             } +-            M.x86.R_CX -= 1; ++            if (M.x86.mode & SYSMODE_32BIT_REP) ++                M.x86.R_ECX -= 1; ++            else ++                M.x86.R_CX -= 1; +             M.x86.R_DI += inc; +             if (ACCESS_FLAG(F_ZF) == 0) +                 break; ++            if (M.x86.intr & INTR_HALTED) ++                break; +         } +         M.x86.mode &= ~SYSMODE_PREFIX_REPE; +     } else if (M.x86.mode & SYSMODE_PREFIX_REPNE) { +         /* REPNE  */ +-        /* move them until CX is ZERO. */ +-        while (M.x86.R_CX != 0) { ++        /* move them until (E)CX is ZERO. */ ++        while (((M.x86.mode & SYSMODE_32BIT_REP) ? M.x86.R_ECX : M.x86.R_CX) != 0) { +             if (M.x86.mode & SYSMODE_PREFIX_DATA) { +                 val = fetch_data_long_abs(M.x86.R_ES, M.x86.R_DI); +                 cmp_long(M.x86.R_EAX, val); +@@ -2977,10 +3034,15 @@ +                 val = fetch_data_word_abs(M.x86.R_ES, M.x86.R_DI); +                 cmp_word(M.x86.R_AX, (u16)val); +             } +-            M.x86.R_CX -= 1; ++            if (M.x86.mode & SYSMODE_32BIT_REP) ++                M.x86.R_ECX -= 1; ++            else ++                M.x86.R_CX -= 1; +             M.x86.R_DI += inc; +             if (ACCESS_FLAG(F_ZF)) +                 break;          /* zero flag set means equal */ ++            if (M.x86.intr & INTR_HALTED) ++                break; +         } +         M.x86.mode &= ~SYSMODE_PREFIX_REPNE; +     } else { +@@ -3238,9 +3300,9 @@ +     DECODE_PRINTF("RET\t"); +     imm = fetch_word_imm(); +     DECODE_PRINTF2("%x\n", imm); +-	RETURN_TRACE("RET",M.x86.saved_cs,M.x86.saved_ip); + 	TRACE_AND_STEP(); +     M.x86.R_IP = pop_word(); ++	RETURN_TRACE(M.x86.saved_cs,M.x86.saved_ip, M.x86.R_CS, M.x86.R_IP, "NEAR"); +     M.x86.R_SP += imm; +     DECODE_CLEAR_SEGOVR(); +     END_OF_INSTR(); +@@ -3254,9 +3316,9 @@ + { +     START_OF_INSTR(); +     DECODE_PRINTF("RET\n"); +-	RETURN_TRACE("RET",M.x86.saved_cs,M.x86.saved_ip); + 	TRACE_AND_STEP(); +     M.x86.R_IP = pop_word(); ++	RETURN_TRACE(M.x86.saved_cs,M.x86.saved_ip, M.x86.R_CS, M.x86.R_IP, "NEAR"); +     DECODE_CLEAR_SEGOVR(); +     END_OF_INSTR(); + } +@@ -3471,10 +3533,10 @@ +     DECODE_PRINTF("RETF\t"); +     imm = fetch_word_imm(); +     DECODE_PRINTF2("%x\n", imm); +-	RETURN_TRACE("RETF",M.x86.saved_cs,M.x86.saved_ip); + 	TRACE_AND_STEP(); +     M.x86.R_IP = pop_word(); +     M.x86.R_CS = pop_word(); ++	RETURN_TRACE(M.x86.saved_cs,M.x86.saved_ip, M.x86.R_CS, M.x86.R_IP, "FAR"); +     M.x86.R_SP += imm; +     DECODE_CLEAR_SEGOVR(); +     END_OF_INSTR(); +@@ -3488,10 +3550,10 @@ + { +     START_OF_INSTR(); +     DECODE_PRINTF("RETF\n"); +-	RETURN_TRACE("RETF",M.x86.saved_cs,M.x86.saved_ip); + 	TRACE_AND_STEP(); +     M.x86.R_IP = pop_word(); +     M.x86.R_CS = pop_word(); ++	RETURN_TRACE(M.x86.saved_cs,M.x86.saved_ip, M.x86.R_CS, M.x86.R_IP, "FAR"); +     DECODE_CLEAR_SEGOVR(); +     END_OF_INSTR(); + } +@@ -4020,8 +4082,11 @@ +     ip += (s16) M.x86.R_IP; +     DECODE_PRINTF2("%04x\n", ip); +     TRACE_AND_STEP(); +-    M.x86.R_CX -= 1; +-    if (M.x86.R_CX != 0 && !ACCESS_FLAG(F_ZF))      /* CX != 0 and !ZF */ ++    if (M.x86.mode & SYSMODE_PREFIX_ADDR) ++        M.x86.R_ECX -= 1; ++    else ++        M.x86.R_CX -= 1; ++    if (((M.x86.mode & SYSMODE_PREFIX_ADDR) ? M.x86.R_ECX : M.x86.R_CX) != 0 && !ACCESS_FLAG(F_ZF))      /* (E)CX != 0 and !ZF */ +         M.x86.R_IP = ip; +     DECODE_CLEAR_SEGOVR(); +     END_OF_INSTR(); +@@ -4041,8 +4106,11 @@ +     ip += (s16) M.x86.R_IP; +     DECODE_PRINTF2("%04x\n", ip); +     TRACE_AND_STEP(); +-    M.x86.R_CX -= 1; +-    if (M.x86.R_CX != 0 && ACCESS_FLAG(F_ZF))       /* CX != 0 and ZF */ ++    if (M.x86.mode & SYSMODE_PREFIX_ADDR) ++        M.x86.R_ECX -= 1; ++    else ++        M.x86.R_CX -= 1; ++    if (((M.x86.mode & SYSMODE_PREFIX_ADDR) ? M.x86.R_ECX : M.x86.R_CX) != 0 && ACCESS_FLAG(F_ZF))      /* (E)CX != 0 and ZF */ +         M.x86.R_IP = ip; +     DECODE_CLEAR_SEGOVR(); +     END_OF_INSTR(); +@@ -4062,8 +4130,11 @@ +     ip += (s16) M.x86.R_IP; +     DECODE_PRINTF2("%04x\n", ip); +     TRACE_AND_STEP(); +-    M.x86.R_CX -= 1; +-    if (M.x86.R_CX != 0) ++    if (M.x86.mode & SYSMODE_PREFIX_ADDR) ++        M.x86.R_ECX -= 1; ++    else ++        M.x86.R_CX -= 1; ++    if (((M.x86.mode & SYSMODE_PREFIX_ADDR) ? M.x86.R_ECX : M.x86.R_CX) != 0)      /* (E)CX != 0 */ +         M.x86.R_IP = ip; +     DECODE_CLEAR_SEGOVR(); +     END_OF_INSTR(); +@@ -4085,8 +4156,10 @@ +     target = (u16)(M.x86.R_IP + offset); +     DECODE_PRINTF2("%x\n", target); +     TRACE_AND_STEP(); +-    if (M.x86.R_CX == 0) ++    if (M.x86.R_CX == 0) { +         M.x86.R_IP = target; ++	JMP_TRACE(M.x86.saved_cs, M.x86.saved_ip, M.x86.R_CS, M.x86.R_IP, " CXZ "); ++    } +     DECODE_CLEAR_SEGOVR(); +     END_OF_INSTR(); + } +@@ -4213,6 +4286,7 @@ +     ip = (s16)fetch_word_imm(); +     ip += (s16)M.x86.R_IP; +     DECODE_PRINTF2("%04x\n", ip); ++    JMP_TRACE(M.x86.saved_cs, M.x86.saved_ip, M.x86.R_CS, ip, " NEAR "); +     TRACE_AND_STEP(); +     M.x86.R_IP = (u16)ip; +     DECODE_CLEAR_SEGOVR(); +@@ -4233,6 +4307,7 @@ +     cs = fetch_word_imm(); +     DECODE_PRINTF2("%04x:", cs); +     DECODE_PRINTF2("%04x\n", ip); ++    JMP_TRACE(M.x86.saved_cs, M.x86.saved_ip, cs, ip, " FAR "); +     TRACE_AND_STEP(); +     M.x86.R_IP = ip; +     M.x86.R_CS = cs; +@@ -4254,6 +4329,7 @@ +     offset = (s8)fetch_byte_imm(); +     target = (u16)(M.x86.R_IP + offset); +     DECODE_PRINTF2("%x\n", target); ++    JMP_TRACE(M.x86.saved_cs, M.x86.saved_ip, M.x86.R_CS, target, " BYTE "); +     TRACE_AND_STEP(); +     M.x86.R_IP = target; +     DECODE_CLEAR_SEGOVR(); +@@ -4357,6 +4433,8 @@ +     DECODE_PRINTF("REPNE\n"); +     TRACE_AND_STEP(); +     M.x86.mode |= SYSMODE_PREFIX_REPNE; ++    if (M.x86.mode & SYSMODE_PREFIX_ADDR) ++        M.x86.mode |= SYSMODE_32BIT_REP; +     DECODE_CLEAR_SEGOVR(); +     END_OF_INSTR(); + } +@@ -4371,6 +4449,8 @@ +     DECODE_PRINTF("REPE\n"); +     TRACE_AND_STEP(); +     M.x86.mode |= SYSMODE_PREFIX_REPE; ++    if (M.x86.mode & SYSMODE_PREFIX_ADDR) ++        M.x86.mode |= SYSMODE_32BIT_REP; +     DECODE_CLEAR_SEGOVR(); +     END_OF_INSTR(); + } +@@ -5013,12 +5093,14 @@ +             break; +         case 4:         /* jmp word ptr ... */ +             destval = fetch_data_word(destoffset); ++            JMP_TRACE(M.x86.saved_cs, M.x86.saved_ip, M.x86.R_CS, destval, " WORD "); +             TRACE_AND_STEP(); +             M.x86.R_IP = destval; +             break; +         case 5:         /* jmp far ptr ... */ +             destval = fetch_data_word(destoffset); +             destval2 = fetch_data_word(destoffset + 2); ++            JMP_TRACE(M.x86.saved_cs, M.x86.saved_ip, destval2, destval, " FAR "); +             TRACE_AND_STEP(); +             M.x86.R_IP = destval; +             M.x86.R_CS = destval2; +Index: prim_ops.c +=================================================================== +RCS file: /cvs/osdf/cvs/host/other-licence/x86emu/prim_ops.c,v +retrieving revision 1.1 +retrieving revision 1.3 +diff -u -u -r1.1 -r1.3 +--- prim_ops.c	7 Sep 2007 10:01:21 -0000	1.1 ++++ prim_ops.c	16 Jan 2008 14:18:15 -0000	1.3 +@@ -1921,7 +1921,7 @@ + void imul_long_direct(u32 *res_lo, u32* res_hi,u32 d, u32 s) + { + #ifdef  __HAS_LONG_LONG__ +-    s64 res = (s64)d * (s64)s; ++    s64 res = (s64)(s32)d * (s64)(s32)s; +  +     *res_lo = (u32)res; +     *res_hi = (u32)(res >> 32); +@@ -2013,7 +2013,7 @@ + void mul_long(u32 s) + { + #ifdef  __HAS_LONG_LONG__ +-    u64 res = (u32)M.x86.R_EAX * (u32)s; ++    u64 res = (u64)M.x86.R_EAX * s; +  +     M.x86.R_EAX = (u32)res; +     M.x86.R_EDX = (u32)(res >> 32); +@@ -2312,16 +2312,15 @@ +     } +     if (M.x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) { +         /* dont care whether REPE or REPNE */ +-        /* in until CX is ZERO. */ +-        u32 count = ((M.x86.mode & SYSMODE_PREFIX_DATA) ? ++        /* in until (E)CX is ZERO. */ ++        u32 count = ((M.x86.mode & SYSMODE_32BIT_REP) ? +                      M.x86.R_ECX : M.x86.R_CX); +- +         while (count--) { +           single_in(size); +           M.x86.R_DI += inc; +           } +         M.x86.R_CX = 0; +-        if (M.x86.mode & SYSMODE_PREFIX_DATA) { ++        if (M.x86.mode & SYSMODE_32BIT_REP) { +             M.x86.R_ECX = 0; +         } +         M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE); +@@ -2355,15 +2354,15 @@ +     } +     if (M.x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) { +         /* dont care whether REPE or REPNE */ +-        /* out until CX is ZERO. */ +-        u32 count = ((M.x86.mode & SYSMODE_PREFIX_DATA) ? ++        /* out until (E)CX is ZERO. */ ++        u32 count = ((M.x86.mode & SYSMODE_32BIT_REP) ? +                      M.x86.R_ECX : M.x86.R_CX); +         while (count--) { +           single_out(size); +           M.x86.R_SI += inc; +           } +         M.x86.R_CX = 0; +-        if (M.x86.mode & SYSMODE_PREFIX_DATA) { ++        if (M.x86.mode & SYSMODE_32BIT_REP) { +             M.x86.R_ECX = 0; +         } +         M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE); +Index: sys.c +=================================================================== +RCS file: /cvs/osdf/cvs/host/other-licence/x86emu/sys.c,v +retrieving revision 1.1 +retrieving revision 1.2 +diff -u -u -r1.1 -r1.2 +--- sys.c	7 Sep 2007 10:01:21 -0000	1.1 ++++ sys.c	7 Sep 2007 10:03:13 -0000	1.2 +@@ -45,11 +45,6 @@ + #include <x86emu/regs.h> + #include "debug.h" + #include "prim_ops.h" +-#ifdef LINUXBIOS_VERSION +-#include "io.h" +-#else +-#include <sys/io.h> +-#endif +  + #ifdef IN_MODULE + #include "xf86_ansic.h" +@@ -220,7 +215,7 @@ + { + 	DB(if (DEBUG_IO_TRACE()) + 		printk("inb %#04x \n", addr);) +-	return inb(addr); ++	return 0; + } +  + /**************************************************************************** +@@ -235,7 +230,7 @@ + { + 	DB(if (DEBUG_IO_TRACE()) + 		printk("inw %#04x \n", addr);) +-	return inw(addr); ++	return 0; + } +  + /**************************************************************************** +@@ -250,7 +245,7 @@ + { + 	DB(if (DEBUG_IO_TRACE()) + 		printk("inl %#04x \n", addr);) +-	return inl(addr); ++	return 0; + } +  + /**************************************************************************** +@@ -264,7 +259,6 @@ + { + 	DB(if (DEBUG_IO_TRACE()) + 		printk("outb %#02x -> %#04x \n", val, addr);) +-	outb(val, addr); + 	return; + } +  +@@ -279,7 +273,6 @@ + { + 	DB(if (DEBUG_IO_TRACE()) + 		printk("outw %#04x -> %#04x \n", val, addr);) +-	outw(val, addr); + 	return; + } +  +@@ -295,7 +288,6 @@ + 	DB(if (DEBUG_IO_TRACE()) + 	       printk("outl %#08x -> %#04x \n", val, addr);) +  +-	outl(val, addr); + 	return; + } +  +@@ -405,6 +397,6 @@ +  + void X86EMU_setMemBase(void *base, size_t size) + { +-	M.mem_base = (int) base; ++	M.mem_base = (unsigned long) base; + 	M.mem_size = size; + } +Index: include/x86emu/debug.h +=================================================================== +RCS file: /cvs/osdf/cvs/host/other-licence/x86emu/include/x86emu/debug.h,v +retrieving revision 1.1 +retrieving revision 1.4 +diff -u -u -r1.1 -r1.4 +--- include/x86emu/debug.h	7 Sep 2007 10:01:21 -0000	1.1 ++++ include/x86emu/debug.h	20 Mar 2008 15:25:27 -0000	1.4 +@@ -40,8 +40,6 @@ + #ifndef __X86EMU_DEBUG_H + #define __X86EMU_DEBUG_H +  +-//#define DEBUG 0 +-#undef DEBUG + /*---------------------- Macros and type definitions ----------------------*/ +  + /* checks to be enabled for "runtime" */ +@@ -78,6 +76,8 @@ + # define DEBUG_SYSINT()        	(M.x86.debug & DEBUG_SYSINT_F) + # define DEBUG_TRACECALL()     	(M.x86.debug & DEBUG_TRACECALL_F) + # define DEBUG_TRACECALLREGS() 	(M.x86.debug & DEBUG_TRACECALL_REGS_F) ++# define DEBUG_TRACEJMP()       (M.x86.debug & DEBUG_TRACEJMP_F) ++# define DEBUG_TRACEJMPREGS()   (M.x86.debug & DEBUG_TRACEJMP_REGS_F) + # define DEBUG_SYS()           	(M.x86.debug & DEBUG_SYS_F) + # define DEBUG_MEM_TRACE()     	(M.x86.debug & DEBUG_MEM_TRACE_F) + # define DEBUG_IO_TRACE()      	(M.x86.debug & DEBUG_IO_TRACE_F) +@@ -96,6 +96,8 @@ + # define DEBUG_SYSINT()        	0 + # define DEBUG_TRACECALL()     	0 + # define DEBUG_TRACECALLREGS() 	0 ++# define DEBUG_TRACEJMP()       0 ++# define DEBUG_TRACEJMPREGS()   0 + # define DEBUG_SYS()           	0 + # define DEBUG_MEM_TRACE()     	0 + # define DEBUG_IO_TRACE()      	0 +@@ -169,14 +171,20 @@ + 		x86emu_dump_regs();                                     \ + 	if (DEBUG_TRACECALL())                                     	\ + 		printk("%04x:%04x: CALL %s%04x:%04x\n", u , v, s, w, x); +-# define RETURN_TRACE(n,u,v)                                    \ ++# define RETURN_TRACE(u,v,w,x,s)                                    \ + 	if (DEBUG_TRACECALLREGS())									\ + 		x86emu_dump_regs();                                     \ + 	if (DEBUG_TRACECALL())                                     	\ +-		printk("%04x:%04x: %s\n",u,v,n); ++		printk("%04x:%04x: RET %s %04x:%04x\n",u,v,s,w,x); ++# define  JMP_TRACE(u,v,w,x,s)                                 \ ++   if (DEBUG_TRACEJMPREGS()) \ ++      x86emu_dump_regs(); \ ++   if (DEBUG_TRACEJMP()) \ ++      printk("%04x:%04x: JMP %s%04x:%04x\n", u , v, s, w, x); + #else + # define CALL_TRACE(u,v,w,x,s) +-# define RETURN_TRACE(n,u,v) ++# define RETURN_TRACE(u,v,w,x,s) ++# define  JMP_TRACE(u,v,w,x,s) + #endif +  + #ifdef DEBUG +Index: include/x86emu/regs.h +=================================================================== +RCS file: /cvs/osdf/cvs/host/other-licence/x86emu/include/x86emu/regs.h,v +retrieving revision 1.1 +retrieving revision 1.4 +diff -u -u -r1.1 -r1.4 +--- include/x86emu/regs.h	7 Sep 2007 10:01:21 -0000	1.1 ++++ include/x86emu/regs.h	15 Jan 2008 13:46:40 -0000	1.4 +@@ -231,6 +231,9 @@ + #define SYSMODE_PREFIX_REPNE    0x00000100 + #define SYSMODE_PREFIX_DATA     0x00000200 + #define SYSMODE_PREFIX_ADDR     0x00000400 ++//phueper: for REP(E|NE) Instructions, we need to decide wether it should be using ++//the 32bit ECX register as or the 16bit CX register as count register ++#define SYSMODE_32BIT_REP       0x00000800 + #define SYSMODE_INTR_PENDING    0x10000000 + #define SYSMODE_EXTRN_INTR      0x20000000 + #define SYSMODE_HALTED          0x40000000 +@@ -250,7 +253,8 @@ + 						 SYSMODE_SEGOVR_GS      | \ + 						 SYSMODE_SEGOVR_SS      | \ + 						 SYSMODE_PREFIX_DATA    | \ +-						 SYSMODE_PREFIX_ADDR) ++						 SYSMODE_PREFIX_ADDR    | \ ++						 SYSMODE_32BIT_REP) +  + #define  INTR_SYNCH           0x1 + #define  INTR_ASYNCH          0x2 +@@ -274,9 +278,9 @@ +      */ +     u32                         mode; +     volatile int                intr;   /* mask of pending interrupts */ +-	int                         debug; ++    volatile int                         debug; + #ifdef DEBUG +-	int                         check; ++    int                         check; +     u16                         saved_ip; +     u16                         saved_cs; +     int                         enc_pos; +Index: include/x86emu/x86emu.h +=================================================================== +RCS file: /cvs/osdf/cvs/host/other-licence/x86emu/include/x86emu/x86emu.h,v +retrieving revision 1.1 +retrieving revision 1.3 +diff -u -u -r1.1 -r1.3 +--- include/x86emu/x86emu.h	7 Sep 2007 10:01:21 -0000	1.1 ++++ include/x86emu/x86emu.h	19 Oct 2007 08:42:15 -0000	1.3 +@@ -47,6 +47,7 @@ + #include <console.h> + #define printk(x...) printk(BIOS_DEBUG, x) + #else ++#include <stdio.h> + #define printk printf + #endif +  +@@ -189,6 +181,8 @@ + #define DEBUG_TRACECALL_REGS_F  0x004000 + #define DEBUG_DECODE_NOPRINT_F  0x008000  + #define DEBUG_SAVE_IP_CS_F      0x010000 ++#define DEBUG_TRACEJMP_F        0x020000 ++#define DEBUG_TRACEJMP_REGS_F   0x040000 + #define DEBUG_SYS_F             (DEBUG_SVC_F|DEBUG_FS_F|DEBUG_PROC_F) +  + void 	X86EMU_trace_regs(void); +@@ -200,5 +194,4 @@ + #ifdef  __cplusplus + }                       			/* End of "C" linkage for C++   	*/ + #endif +- + #endif /* __X86EMU_X86EMU_H */ diff --git a/roms/SLOF/other-licence/x86emu/x86emu_download.sh b/roms/SLOF/other-licence/x86emu/x86emu_download.sh new file mode 100755 index 00000000..d4feff9f --- /dev/null +++ b/roms/SLOF/other-licence/x86emu/x86emu_download.sh @@ -0,0 +1,61 @@ +# ***************************************************************************** +# * Copyright (c) 2004, 2008 IBM Corporation +# * All rights reserved. +# * This program and the accompanying materials +# * are made available under the terms of the BSD License +# * which accompanies this distribution, and is available at +# * http://www.opensource.org/licenses/bsd-license.php +# * +# * Contributors: +# *     IBM Corporation - initial implementation +# ****************************************************************************/ +#!/bin/bash + +#set -x +#set -e + +SVN=`which svn` +PATCH=`which patch` +DIFF_FILE=./x86emu_changes.diff + +# check wether svn, patch, ... is available... + +if [ ! -x $SVN ]; then +	echo "subversion executable not found!" +	exit -1 +fi +if [ ! -x $PATCH ]; then +	echo "patch executable not found!" +	exit -1 +fi +if [ ! -r $DIFF_FILE ]; then +	echo "diff file $DIFF_FILE not found!" +	exit -1 +fi + +# download the x86emu sources from LinuxBIOS subversion + +#revision known to work... +REV=496 + +echo "Checking out x86emu from coreboot-v3 repository revision $REV" +$SVN co svn://coreboot.org/repository/coreboot-v3/util/x86emu -r $REV + +echo "Copying files..." + +mkdir -p include/x86emu +cp -v x86emu/x86emu/*.c . +cp -v x86emu/x86emu/*.h include/x86emu +cp -v x86emu/include/x86emu/*.h include/x86emu + +echo "Removing checkedout subversion director..." + +rm -rf x86emu + +echo "Patching files..." + +$PATCH -p0 < x86emu_changes.diff + + +echo "done" +exit 0  | 
