The patch was changed accoring to access.cc changes and

Bryce's recomendations.
This commit is contained in:
Stanislav Shwartsman 2002-09-04 21:13:08 +00:00
parent d6c1c14d43
commit c3b4f170d6

View File

@ -1,10 +1,11 @@
----------------------------------------------------------------------
Patch name: bochs-1.4.1-mmx.patch-endian-support
Patch name: bochs-mmx.patch-endian-support
Author: Stanislav Shwartsman
Date: September 1, 2002
Date: September 4, 2002
Detailed description: MMX instruction set support.
Also supports BIG_ENDIAN systems. Tested on Solaris and HP1100.
Created for current CVS source code.
Patch was created with:
cvs diff -u
@ -14,16 +15,13 @@ Instructions:
To patch, go to main bochs directory.
Type "patch -p1 < THIS_PATCH_FILE".
----------------------------------------------------------------------
diff -r -u -N bochs-1.4.1/configure.in bochs-1.4.1-mmx-release-endian/configure.in
--- bochs-1.4.1/configure.in 2002-06-24 00:19:42.000000000 +0200
+++ bochs-1.4.1-mmx-release-endian/configure.in 2002-08-25 13:41:34.000000000 +0200
@@ -799,6 +800,23 @@
[
AC_MSG_RESULT(no)
AC_DEFINE(BX_SUPPORT_VBE, 0)
+ ]
+ )
+
diff -r -u -N bochs/configure.in bochs-mmx/configure.in
--- bochs/configure.in 2002-09-02 20:44:35.000000000 +0200
+++ bochs-mmx/configure.in 2002-09-04 23:40:54.000000000 +0200
@@ -924,6 +924,23 @@
]
)
+AC_MSG_CHECKING(for MMX support)
+AC_ARG_ENABLE(mmx,
+ [ --enable-mmx compile in MMX emulation],
@ -38,23 +36,15 @@ diff -r -u -N bochs-1.4.1/configure.in bochs-1.4.1-mmx-release-endian/configure.
+ [
+ AC_MSG_RESULT(no)
+ AC_DEFINE(BX_SUPPORT_MMX, 0)
]
)
diff -r -u -N bochs-1.4.1/config.h.in bochs-1.4.1-mmx-release-endian/config.h.in
--- bochs-1.4.1/config.h.in 2002-06-24 00:19:42.000000000 +0200
+++ bochs-1.4.1-mmx-release-endian/config.h.in 2002-08-25 13:41:34.000000000 +0200
@@ -533,6 +533,7 @@
#define BX_DYNAMIC_CPU_SPARC 0
#define BX_SUPPORT_FPU 0
+#define BX_SUPPORT_MMX 0
#define BX_HAVE_GETENV 0
#define BX_HAVE_SELECT 0
diff -r -u -N bochs-1.4.1/cpu/Makefile.in bochs-1.4.1-mmx-release-endian/cpu/Makefile.in
--- bochs-1.4.1/cpu/Makefile.in 2001-10-07 22:19:04.000000000 +0200
+++ bochs-1.4.1-mmx-release-endian/cpu/Makefile.in 2002-08-24 18:05:28.000000000 +0200
+ ]
+ )
+
AC_MSG_CHECKING(for FPU emulation)
FPU_VAR=''
FPU_GLUE_OBJ=''
diff -r -u -N bochs/cpu/Makefile.in bochs-mmx/cpu/Makefile.in
--- bochs/cpu/Makefile.in 2002-08-28 00:43:57.000000000 +0200
+++ bochs-mmx/cpu/Makefile.in 2002-09-04 23:40:54.000000000 +0200
@@ -48,7 +48,7 @@
OBJS = \
init.o \
@ -64,7 +54,7 @@ diff -r -u -N bochs-1.4.1/cpu/Makefile.in bochs-1.4.1-mmx-release-endian/cpu/Mak
exception.o \
ctrl_xfer_pro.o \
flag_ctrl_pro.o \
@@ -198,6 +198,16 @@
@@ -214,6 +214,16 @@
../iodev/unmapped.h ../iodev/eth.h ../iodev/ne2k.h \
../iodev/guest2host.h ../iodev/slowdown_timer.h \
../instrument/stubs/instrument.h
@ -81,153 +71,10 @@ diff -r -u -N bochs-1.4.1/cpu/Makefile.in bochs-1.4.1-mmx-release-endian/cpu/Mak
ctrl_xfer16.o: ctrl_xfer16.@CPP_SUFFIX@ ../bochs.h ../config.h ../osdep.h \
../debug/debug.h ../bxversion.h ../gui/siminterface.h ../state_file.h \
../cpu/cpu.h ../cpu/lazy_flags.h ../memory/memory.h ../pc_system.h \
diff -r -u -N bochs-1.4.1/cpu/access.cc bochs-1.4.1-mmx-release-endian/cpu/access.cc
--- bochs-1.4.1/cpu/access.cc 2001-10-03 15:10:38.000000000 +0200
+++ bochs-1.4.1-mmx-release-endian/cpu/access.cc 2002-08-24 18:17:36.000000000 +0200
@@ -228,105 +228,84 @@
}
}
-
-
-
void
-BX_CPU_C::write_virtual_byte(unsigned s, Bit32u offset, Bit8u *data)
+BX_CPU_C::write_virtual(unsigned s, Bit32u offset, unsigned len, void *data)
{
Bit32u laddr;
bx_segment_reg_t *seg;
seg = &BX_CPU_THIS_PTR sregs[s];
- write_virtual_checks(seg, offset, 1);
+ write_virtual_checks(seg, offset, len);
laddr = seg->cache.u.segment.base + offset;
- BX_INSTR_MEM_DATA(laddr, 1, BX_WRITE);
+ BX_INSTR_MEM_DATA(laddr, len, BX_WRITE);
// all checks OK
- access_linear(laddr, 1, CPL==3, BX_WRITE, (void *) data);
+ access_linear(laddr, len, CPL==3, BX_WRITE, data);
}
void
-BX_CPU_C::write_virtual_word(unsigned s, Bit32u offset, Bit16u *data)
+BX_CPU_C::write_virtual_byte(unsigned s, Bit32u offset, Bit8u *data)
{
- Bit32u laddr;
- bx_segment_reg_t *seg;
-
- seg = &BX_CPU_THIS_PTR sregs[s];
- write_virtual_checks(seg, offset, 2);
-
- laddr = seg->cache.u.segment.base + offset;
- BX_INSTR_MEM_DATA(laddr, 2, BX_WRITE);
+ write_virtual(s, offset, 1, (void*) data);
+}
- // all checks OK
- access_linear(laddr, 2, CPL==3, BX_WRITE, (void *) data);
+ void
+BX_CPU_C::write_virtual_word(unsigned s, Bit32u offset, Bit16u *data)
+{
+ write_virtual(s, offset, 2, (void*) data);
}
void
BX_CPU_C::write_virtual_dword(unsigned s, Bit32u offset, Bit32u *data)
{
- Bit32u laddr;
- bx_segment_reg_t *seg;
-
- seg = &BX_CPU_THIS_PTR sregs[s];
- write_virtual_checks(seg, offset, 4);
-
- laddr = seg->cache.u.segment.base + offset;
- BX_INSTR_MEM_DATA(laddr, 4, BX_WRITE);
-
- // all checks OK
- access_linear(laddr, 4, CPL==3, BX_WRITE, (void *) data);
+ write_virtual(s, offset, 4, (void*) data);
}
void
-BX_CPU_C::read_virtual_byte(unsigned s, Bit32u offset, Bit8u *data)
+BX_CPU_C::write_virtual_qword(unsigned s, Bit32u offset, Bit64u *data)
+{
+ write_virtual(s, offset, 8, (void*) data);
+}
+
+ void
+BX_CPU_C::read_virtual(unsigned s, Bit32u offset, unsigned len, void *data)
{
Bit32u laddr;
bx_segment_reg_t *seg;
seg = &BX_CPU_THIS_PTR sregs[s];
- read_virtual_checks(seg, offset, 1);
+ read_virtual_checks(seg, offset, len);
laddr = seg->cache.u.segment.base + offset;
- BX_INSTR_MEM_DATA(laddr, 1, BX_READ);
+ BX_INSTR_MEM_DATA(laddr, len, BX_READ);
// all checks OK
- access_linear(laddr, 1, CPL==3, BX_READ, (void *) data);
+ access_linear(laddr, len, CPL==3, BX_READ, data);
}
+ void
+BX_CPU_C::read_virtual_byte(unsigned s, Bit32u offset, Bit8u *data)
+{
+ read_virtual(s, offset, 1, (void*) data);
+}
void
BX_CPU_C::read_virtual_word(unsigned s, Bit32u offset, Bit16u *data)
{
- Bit32u laddr;
- bx_segment_reg_t *seg;
-
- seg = &BX_CPU_THIS_PTR sregs[s];
- read_virtual_checks(seg, offset, 2);
-
- laddr = seg->cache.u.segment.base + offset;
- BX_INSTR_MEM_DATA(laddr, 2, BX_READ);
-
- // all checks OK
- access_linear(laddr, 2, CPL==3, BX_READ, (void *) data);
+ read_virtual(s, offset, 2, (void*) data);
}
-
void
BX_CPU_C::read_virtual_dword(unsigned s, Bit32u offset, Bit32u *data)
{
- Bit32u laddr;
- bx_segment_reg_t *seg;
-
- seg = &BX_CPU_THIS_PTR sregs[s];
- read_virtual_checks(seg, offset, 4);
-
- laddr = seg->cache.u.segment.base + offset;
- BX_INSTR_MEM_DATA(laddr, 4, BX_READ);
+ read_virtual(s, offset, 4, (void*) data);
+}
- // all checks OK
- access_linear(laddr, 4, CPL==3, BX_READ, (void *) data);
+ void
+BX_CPU_C::read_virtual_qword(unsigned s, Bit32u offset, Bit64u *data)
+{
+ read_virtual(s, offset, 8, (void*) data);
}
//////////////////////////////////////////////////////////////
diff -r -u -N bochs-1.4.1/cpu/cpu.h bochs-1.4.1-mmx-release-endian/cpu/cpu.h
--- bochs-1.4.1/cpu/cpu.h 2002-07-16 22:01:29.000000000 +0200
+++ bochs-1.4.1-mmx-release-endian/cpu/cpu.h 2002-08-29 19:53:51.000000000 +0200
@@ -707,6 +707,8 @@
diff -r -u -N bochs/cpu/cpu.h bochs-mmx/cpu/cpu.h
--- bochs/cpu/cpu.h 2002-09-04 22:23:54.000000000 +0200
+++ bochs-mmx/cpu/cpu.h 2002-09-04 23:40:54.000000000 +0200
@@ -712,6 +712,8 @@
class BX_MEM_C;
@ -236,7 +83,7 @@ diff -r -u -N bochs-1.4.1/cpu/cpu.h bochs-1.4.1-mmx-release-endian/cpu/cpu.h
class BX_CPU_C : public logfunctions {
public: // for now...
@@ -808,6 +810,8 @@
@@ -813,6 +815,8 @@
bx_regs_msr_t msr;
#endif
@ -245,7 +92,7 @@ diff -r -u -N bochs-1.4.1/cpu/cpu.h bochs-1.4.1-mmx-release-endian/cpu/cpu.h
// pointer to the address space that this processor uses.
BX_MEM_C *mem;
@@ -1267,6 +1271,71 @@
@@ -1274,6 +1278,71 @@
BX_SMF void ESC6(BxInstruction_t *);
BX_SMF void ESC7(BxInstruction_t *);
@ -317,26 +164,7 @@ diff -r -u -N bochs-1.4.1/cpu/cpu.h bochs-1.4.1-mmx-release-endian/cpu/cpu.h
BX_SMF void fpu_execute(BxInstruction_t *i);
BX_SMF void fpu_init(void);
BX_SMF void fpu_print_regs (void);
@@ -1439,14 +1508,18 @@
BX_SMF void revalidate_prefetch_q(void);
BX_SMF void invalidate_prefetch_q(void);
+ BX_SMF void write_virtual(unsigned seg, Bit32u offset, unsigned len, void *data);
+ BX_SMF void read_virtual(unsigned seg, Bit32u offset, unsigned len, void *data);
BX_SMF void write_virtual_checks(bx_segment_reg_t *seg, Bit32u offset, unsigned length);
BX_SMF void read_virtual_checks(bx_segment_reg_t *seg, Bit32u offset, unsigned length);
BX_SMF void write_virtual_byte(unsigned seg, Bit32u offset, Bit8u *data);
BX_SMF void write_virtual_word(unsigned seg, Bit32u offset, Bit16u *data);
BX_SMF void write_virtual_dword(unsigned seg, Bit32u offset, Bit32u *data);
+ BX_SMF void write_virtual_qword(unsigned seg, Bit32u offset, Bit64u *data);
BX_SMF void read_virtual_byte(unsigned seg, Bit32u offset, Bit8u *data);
BX_SMF void read_virtual_word(unsigned seg, Bit32u offset, Bit16u *data);
BX_SMF void read_virtual_dword(unsigned seg, Bit32u offset, Bit32u *data);
+ BX_SMF void read_virtual_qword(unsigned seg, Bit32u offset, Bit64u *data);
BX_SMF void read_RMW_virtual_byte(unsigned seg, Bit32u offset, Bit8u *data);
BX_SMF void read_RMW_virtual_word(unsigned seg, Bit32u offset, Bit16u *data);
@@ -1568,6 +1641,8 @@
@@ -1578,6 +1647,8 @@
BX_SMF BX_CPP_INLINE Bit16u get_CX(void);
BX_SMF BX_CPP_INLINE Bit16u get_DX(void);
@ -345,7 +173,7 @@ diff -r -u -N bochs-1.4.1/cpu/cpu.h bochs-1.4.1-mmx-release-endian/cpu/cpu.h
#if BX_CPU_LEVEL >= 2
BX_SMF BX_CPP_INLINE Boolean real_mode(void);
#endif
@@ -1589,6 +1664,14 @@
@@ -1599,6 +1670,14 @@
#define BX_HWDebugMemRW 0x03
#endif
@ -360,7 +188,7 @@ diff -r -u -N bochs-1.4.1/cpu/cpu.h bochs-1.4.1-mmx-release-endian/cpu/cpu.h
#if BX_SMP_PROCESSORS==1
// single processor simulation, so there's one of everything
@@ -1840,7 +1923,13 @@
@@ -1850,7 +1929,13 @@
#define BxGroup7 BxGroupN
#define BxGroup8 BxGroupN
#define BxGroup9 BxGroupN
@ -375,9 +203,9 @@ diff -r -u -N bochs-1.4.1/cpu/cpu.h bochs-1.4.1-mmx-release-endian/cpu/cpu.h
#if BX_DEBUGGER
typedef enum _show_flags {
diff -r -u -N bochs-1.4.1/cpu/fetchdecode.cc bochs-1.4.1-mmx-release-endian/cpu/fetchdecode.cc
--- bochs-1.4.1/cpu/fetchdecode.cc 2001-10-03 15:10:38.000000000 +0200
+++ bochs-1.4.1-mmx-release-endian/cpu/fetchdecode.cc 2002-08-25 13:01:36.000000000 +0200
diff -r -u -N bochs/cpu/fetchdecode.cc bochs-mmx/cpu/fetchdecode.cc
--- bochs/cpu/fetchdecode.cc 2002-09-03 06:54:28.000000000 +0200
+++ bochs-mmx/cpu/fetchdecode.cc 2002-09-04 23:40:54.000000000 +0200
@@ -344,6 +344,40 @@
/* 7 */ { 0, &BX_CPU_C::BxError }
};
@ -727,9 +555,9 @@ diff -r -u -N bochs-1.4.1/cpu/fetchdecode.cc bochs-1.4.1-mmx-release-endian/cpu/
};
diff -r -u -N bochs-1.4.1/cpu/i387.h bochs-1.4.1-mmx-release-endian/cpu/i387.h
--- bochs-1.4.1/cpu/i387.h 1970-01-01 02:00:00.000000000 +0200
+++ bochs-1.4.1-mmx-release-endian/cpu/i387.h 2002-09-04 16:03:49.000000000 +0200
diff -r -u -N bochs/cpu/i387.h bochs-mmx/cpu/i387.h
--- bochs/cpu/i387.h 1970-01-01 02:00:00.000000000 +0200
+++ bochs-mmx/cpu/i387.h 2002-09-04 23:40:54.000000000 +0200
@@ -0,0 +1,157 @@
+#ifndef BX_I387_RELATED_EXTENSIONS_H
+#define BX_I387_RELATED_EXTENSIONS_H
@ -888,9 +716,9 @@ diff -r -u -N bochs-1.4.1/cpu/i387.h bochs-1.4.1-mmx-release-endian/cpu/i387.h
+} i387_t;
+
+#endif
diff -r -u -N bochs-1.4.1/cpu/mmx.cc bochs-1.4.1-mmx-release-endian/cpu/mmx.cc
--- bochs-1.4.1/cpu/mmx.cc 1970-01-01 02:00:00.000000000 +0200
+++ bochs-1.4.1-mmx-release-endian/cpu/mmx.cc 2002-09-04 21:44:15.000000000 +0200
diff -r -u -N bochs/cpu/mmx.cc bochs-mmx/cpu/mmx.cc
--- bochs/cpu/mmx.cc 1970-01-01 02:00:00.000000000 +0200
+++ bochs-mmx/cpu/mmx.cc 2002-09-04 23:40:54.000000000 +0200
@@ -0,0 +1,1842 @@
+#define NEED_CPU_REG_SHORTCUTS 1
+#include "bochs.h"
@ -2734,10 +2562,10 @@ diff -r -u -N bochs-1.4.1/cpu/mmx.cc bochs-1.4.1-mmx-release-endian/cpu/mmx.cc
+ UndefinedOpcode(i);
+#endif
+}
diff -r -u -N bochs-1.4.1/cpu/proc_ctrl.cc bochs-1.4.1-mmx-release-endian/cpu/proc_ctrl.cc
--- bochs-1.4.1/cpu/proc_ctrl.cc 2002-06-24 00:19:44.000000000 +0200
+++ bochs-1.4.1-mmx-release-endian/cpu/proc_ctrl.cc 2002-08-23 17:00:30.000000000 +0200
@@ -1026,6 +1026,9 @@
diff -r -u -N bochs/cpu/proc_ctrl.cc bochs-mmx/cpu/proc_ctrl.cc
--- bochs/cpu/proc_ctrl.cc 2002-09-04 10:59:13.000000000 +0200
+++ bochs-mmx/cpu/proc_ctrl.cc 2002-09-04 23:40:54.000000000 +0200
@@ -1029,6 +1029,9 @@
# if BX_SUPPORT_FPU
features |= 0x01;
# endif
@ -2747,7 +2575,7 @@ diff -r -u -N bochs-1.4.1/cpu/proc_ctrl.cc bochs-1.4.1-mmx-release-endian/cpu/pr
#elif BX_CPU_LEVEL == 6
family = 6;
@@ -1038,6 +1041,9 @@
@@ -1042,9 +1045,12 @@
# if BX_SUPPORT_FPU
features |= 0x01; // has FPU
# endif
@ -2756,10 +2584,14 @@ diff -r -u -N bochs-1.4.1/cpu/proc_ctrl.cc bochs-1.4.1-mmx-release-endian/cpu/pr
+# endif
#else
BX_PANIC(("CPUID: not implemented for > 6"));
#endif
diff -r -u -N bochs-1.4.1/fpu/fpu_system.h bochs-1.4.1-mmx-release-endian/fpu/fpu_system.h
--- bochs-1.4.1/fpu/fpu_system.h 2001-10-06 05:53:46.000000000 +0200
+++ bochs-1.4.1-mmx-release-endian/fpu/fpu_system.h 2002-08-24 18:57:12.000000000 +0200
-#endif
+#endif
#if BX_SUPPORT_4MEG_PAGES
features |= 8; // support page-size extension (4m pages)
diff -r -u -N bochs/fpu/fpu_system.h bochs-mmx/fpu/fpu_system.h
--- bochs/fpu/fpu_system.h 2001-10-06 05:53:46.000000000 +0200
+++ bochs-mmx/fpu/fpu_system.h 2002-09-04 23:40:54.000000000 +0200
@@ -96,18 +96,7 @@
* rather than a kernel (ported by Kevin Lawton)
* ------------------------------------------------------------ */
@ -2820,9 +2652,9 @@ diff -r -u -N bochs-1.4.1/fpu/fpu_system.h bochs-1.4.1-mmx-release-endian/fpu/fp
#define I387 i387
diff -r -u -N bochs-1.4.1/fpu/wmFPUemu_glue.cc bochs-1.4.1-mmx-release-endian/fpu/wmFPUemu_glue.cc
--- bochs-1.4.1/fpu/wmFPUemu_glue.cc 2001-09-15 08:55:14.000000000 +0200
+++ bochs-1.4.1-mmx-release-endian/fpu/wmFPUemu_glue.cc 2002-08-24 19:28:36.000000000 +0200
diff -r -u -N bochs/fpu/wmFPUemu_glue.cc bochs-mmx/fpu/wmFPUemu_glue.cc
--- bochs/fpu/wmFPUemu_glue.cc 2001-09-15 08:55:14.000000000 +0200
+++ bochs-mmx/fpu/wmFPUemu_glue.cc 2002-09-04 23:40:54.000000000 +0200
@@ -45,7 +45,7 @@
static BxInstruction_t *fpu_iptr = NULL;
static BX_CPU_C *fpu_cpu_ptr = NULL;