[prev in list] [next in list] [prev in thread] [next in thread]
List: bochs-cvs
Subject: [Bochs-cvs] SF.net SVN: bochs:[11137] trunk/bochs
From: sshwarts () users ! sourceforge ! net
Date: 2012-04-11 19:01:25
Message-ID: E1SI2nF-0000Li-D8 () sfp-svn-5 ! v30 ! ch3 ! sourceforge ! com
[Download RAW message or body]
Revision: 11137
http://bochs.svn.sourceforge.net/bochs/?rev=11137&view=rev
Author: sshwarts
Date: 2012-04-11 19:01:25 +0000 (Wed, 11 Apr 2012)
Log Message:
-----------
bx_instr_mem_data_access became completely obsolete with new stack optimization \
merged into SVN. It already had limited usability before. With stack direct access \
optimization the callback won't be called for stack accesses as well. See note by \
Brian Slechta:
=== Cut Hete ===
While using Bochs as a reference model for simulations, the simulator needs
information about what loads/stores are taking place with each instruction.
Presumably, that is what the BX_INSTR_MEM_DATA() instrumentation macros
cover (which is the place where our simulator hooks up).
The RETnear_xxx() functions call access_linear() directly, rather than call
read_virtual_xxx() functions. This is a problem for code making use of the
BX_INSTR_MEM_DATA() hook because it does not get called for these
instructions. Should this be changed along with some other instructions
that exhibit this?
=== Cut Hete ===
For Bryan's usage bx_instr_lin_access and bx_instr_phy_read/bx_instr_phy_write \
callbacks should be used.
Modified Paths:
--------------
trunk/bochs/CHANGES
trunk/bochs/cpu/access32.cc
trunk/bochs/cpu/access64.cc
trunk/bochs/instrument/example0/instrument.cc
trunk/bochs/instrument/example0/instrument.h
trunk/bochs/instrument/example1/instrument.cc
trunk/bochs/instrument/example1/instrument.h
trunk/bochs/instrument/example2/instrument.h
trunk/bochs/instrument/instrumentation.txt
trunk/bochs/instrument/stubs/instrument.cc
trunk/bochs/instrument/stubs/instrument.h
Modified: trunk/bochs/CHANGES
===================================================================
--- trunk/bochs/CHANGES 2012-04-11 18:11:14 UTC (rev 11136)
+++ trunk/bochs/CHANGES 2012-04-11 19:01:25 UTC (rev 11137)
@@ -25,6 +25,7 @@
- Moved networking, sound and USB devices to subdirectories in iodev.
- Moved MWAIT_IS_NOP .bochsrc option from CPUID to CPU so it can be set
even if cpu was configured using pre-defined CPUDB profile.
+ - pcidev: enable support for Linux kernel 3.x (Debian patch by Guillem Jover)
- I/O Devices
- Networking
@@ -67,6 +68,7 @@
[3486555] Fix critical stack leak in Win32 GUI by Carlo Bramini
- these S.F. bugs were closed/fixed
+ [3516859] bug in svn e1000 module
[3516029] stepping not working in debugger GUI in case of smp vm
[3510403] closing config dialog box closes entire simulator
[3459998] Bochs cannot be compiled outside the source tree
Modified: trunk/bochs/cpu/access32.cc
===================================================================
--- trunk/bochs/cpu/access32.cc 2012-04-11 18:11:14 UTC (rev 11136)
+++ trunk/bochs/cpu/access32.cc 2012-04-11 19:01:25 UTC (rev 11137)
@@ -31,7 +31,6 @@
{
Bit32u laddr;
bx_segment_reg_t *seg = &BX_CPU_THIS_PTR sregs[s];
- BX_INSTR_MEM_DATA_ACCESS(BX_CPU_ID, s, offset, 1, BX_WRITE);
BX_ASSERT(BX_CPU_THIS_PTR cpu_mode != BX_MODE_LONG_64);
@@ -75,7 +74,6 @@
{
Bit32u laddr;
bx_segment_reg_t *seg = &BX_CPU_THIS_PTR sregs[s];
- BX_INSTR_MEM_DATA_ACCESS(BX_CPU_ID, s, offset, 2, BX_WRITE);
BX_ASSERT(BX_CPU_THIS_PTR cpu_mode != BX_MODE_LONG_64);
@@ -133,7 +131,6 @@
{
Bit32u laddr;
bx_segment_reg_t *seg = &BX_CPU_THIS_PTR sregs[s];
- BX_INSTR_MEM_DATA_ACCESS(BX_CPU_ID, s, offset, 4, BX_WRITE);
BX_ASSERT(BX_CPU_THIS_PTR cpu_mode != BX_MODE_LONG_64);
@@ -191,7 +188,6 @@
{
Bit32u laddr;
bx_segment_reg_t *seg = &BX_CPU_THIS_PTR sregs[s];
- BX_INSTR_MEM_DATA_ACCESS(BX_CPU_ID, s, offset, 8, BX_WRITE);
BX_ASSERT(BX_CPU_THIS_PTR cpu_mode != BX_MODE_LONG_64);
@@ -251,7 +247,6 @@
{
Bit32u laddr;
bx_segment_reg_t *seg = &BX_CPU_THIS_PTR sregs[s];
- BX_INSTR_MEM_DATA_ACCESS(BX_CPU_ID, s, offset, 16, BX_WRITE);
BX_ASSERT(BX_CPU_THIS_PTR cpu_mode != BX_MODE_LONG_64);
@@ -296,7 +291,6 @@
BX_CPU_C::write_virtual_dqword_aligned_32(unsigned s, Bit32u offset, const \
BxPackedXmmRegister *data) {
bx_segment_reg_t *seg = &BX_CPU_THIS_PTR sregs[s];
- BX_INSTR_MEM_DATA_ACCESS(BX_CPU_ID, s, offset, 16, BX_WRITE);
BX_ASSERT(BX_CPU_THIS_PTR cpu_mode != BX_MODE_LONG_64);
@@ -352,7 +346,6 @@
Bit32u laddr;
unsigned len = elements << 2;
bx_segment_reg_t *seg = &BX_CPU_THIS_PTR sregs[s];
- BX_INSTR_MEM_DATA_ACCESS(BX_CPU_ID, s, offset, len, BX_WRITE);
BX_ASSERT(BX_CPU_THIS_PTR cpu_mode != BX_MODE_LONG_64);
@@ -401,7 +394,6 @@
unsigned len = elements << 2;
bx_segment_reg_t *seg = &BX_CPU_THIS_PTR sregs[s];
- BX_INSTR_MEM_DATA_ACCESS(BX_CPU_ID, s, offset, len, BX_WRITE);
BX_ASSERT(BX_CPU_THIS_PTR cpu_mode != BX_MODE_LONG_64);
@@ -460,7 +452,6 @@
Bit32u laddr;
bx_segment_reg_t *seg = &BX_CPU_THIS_PTR sregs[s];
Bit8u data;
- BX_INSTR_MEM_DATA_ACCESS(BX_CPU_ID, s, offset, 1, BX_READ);
BX_ASSERT(BX_CPU_THIS_PTR cpu_mode != BX_MODE_LONG_64);
@@ -504,7 +495,6 @@
Bit32u laddr;
bx_segment_reg_t *seg = &BX_CPU_THIS_PTR sregs[s];
Bit16u data;
- BX_INSTR_MEM_DATA_ACCESS(BX_CPU_ID, s, offset, 2, BX_READ);
BX_ASSERT(BX_CPU_THIS_PTR cpu_mode != BX_MODE_LONG_64);
@@ -561,7 +551,6 @@
Bit32u laddr;
bx_segment_reg_t *seg = &BX_CPU_THIS_PTR sregs[s];
Bit32u data;
- BX_INSTR_MEM_DATA_ACCESS(BX_CPU_ID, s, offset, 4, BX_READ);
BX_ASSERT(BX_CPU_THIS_PTR cpu_mode != BX_MODE_LONG_64);
@@ -618,7 +607,6 @@
Bit32u laddr;
bx_segment_reg_t *seg = &BX_CPU_THIS_PTR sregs[s];
Bit64u data;
- BX_INSTR_MEM_DATA_ACCESS(BX_CPU_ID, s, offset, 8, BX_READ);
BX_ASSERT(BX_CPU_THIS_PTR cpu_mode != BX_MODE_LONG_64);
@@ -676,7 +664,6 @@
{
Bit32u laddr;
bx_segment_reg_t *seg = &BX_CPU_THIS_PTR sregs[s];
- BX_INSTR_MEM_DATA_ACCESS(BX_CPU_ID, s, offset, 16, BX_READ);
BX_ASSERT(BX_CPU_THIS_PTR cpu_mode != BX_MODE_LONG_64);
@@ -718,7 +705,6 @@
BX_CPU_C::read_virtual_dqword_aligned_32(unsigned s, Bit32u offset, \
BxPackedXmmRegister *data) {
bx_segment_reg_t *seg = &BX_CPU_THIS_PTR sregs[s];
- BX_INSTR_MEM_DATA_ACCESS(BX_CPU_ID, s, offset, 16, BX_READ);
BX_ASSERT(BX_CPU_THIS_PTR cpu_mode != BX_MODE_LONG_64);
@@ -772,7 +758,6 @@
Bit32u laddr;
unsigned len = elements << 2;
bx_segment_reg_t *seg = &BX_CPU_THIS_PTR sregs[s];
- BX_INSTR_MEM_DATA_ACCESS(BX_CPU_ID, s, offset, len, BX_READ);
BX_ASSERT(BX_CPU_THIS_PTR cpu_mode != BX_MODE_LONG_64);
@@ -818,7 +803,6 @@
unsigned len = elements << 2;
bx_segment_reg_t *seg = &BX_CPU_THIS_PTR sregs[s];
- BX_INSTR_MEM_DATA_ACCESS(BX_CPU_ID, s, offset, len, BX_READ);
BX_ASSERT(BX_CPU_THIS_PTR cpu_mode != BX_MODE_LONG_64);
@@ -880,7 +864,6 @@
Bit32u laddr;
bx_segment_reg_t *seg = &BX_CPU_THIS_PTR sregs[s];
Bit8u data;
- BX_INSTR_MEM_DATA_ACCESS(BX_CPU_ID, s, offset, 1, BX_RW);
BX_ASSERT(BX_CPU_THIS_PTR cpu_mode != BX_MODE_LONG_64);
@@ -927,7 +910,6 @@
Bit32u laddr;
bx_segment_reg_t *seg = &BX_CPU_THIS_PTR sregs[s];
Bit16u data;
- BX_INSTR_MEM_DATA_ACCESS(BX_CPU_ID, s, offset, 2, BX_RW);
BX_ASSERT(BX_CPU_THIS_PTR cpu_mode != BX_MODE_LONG_64);
@@ -988,7 +970,6 @@
Bit32u laddr;
bx_segment_reg_t *seg = &BX_CPU_THIS_PTR sregs[s];
Bit32u data;
- BX_INSTR_MEM_DATA_ACCESS(BX_CPU_ID, s, offset, 4, BX_RW);
BX_ASSERT(BX_CPU_THIS_PTR cpu_mode != BX_MODE_LONG_64);
@@ -1049,7 +1030,6 @@
Bit32u laddr;
bx_segment_reg_t *seg = &BX_CPU_THIS_PTR sregs[s];
Bit64u data;
- BX_INSTR_MEM_DATA_ACCESS(BX_CPU_ID, s, offset, 8, BX_RW);
BX_ASSERT(BX_CPU_THIS_PTR cpu_mode != BX_MODE_LONG_64);
Modified: trunk/bochs/cpu/access64.cc
===================================================================
--- trunk/bochs/cpu/access64.cc 2012-04-11 18:11:14 UTC (rev 11136)
+++ trunk/bochs/cpu/access64.cc 2012-04-11 19:01:25 UTC (rev 11137)
@@ -33,8 +33,6 @@
{
BX_ASSERT(BX_CPU_THIS_PTR cpu_mode == BX_MODE_LONG_64);
- BX_INSTR_MEM_DATA_ACCESS(BX_CPU_ID, s, offset, 1, BX_WRITE);
-
Bit64u laddr = get_laddr64(s, offset);
unsigned tlbIndex = BX_TLB_INDEX_OF(laddr, 0);
Bit64u lpf = LPFOf(laddr);
@@ -67,8 +65,6 @@
{
BX_ASSERT(BX_CPU_THIS_PTR cpu_mode == BX_MODE_LONG_64);
- BX_INSTR_MEM_DATA_ACCESS(BX_CPU_ID, s, offset, 2, BX_WRITE);
-
Bit64u laddr = get_laddr64(s, offset);
unsigned tlbIndex = BX_TLB_INDEX_OF(laddr, 1);
#if BX_SUPPORT_ALIGNMENT_CHECK && BX_CPU_LEVEL >= 4
@@ -119,8 +115,6 @@
{
BX_ASSERT(BX_CPU_THIS_PTR cpu_mode == BX_MODE_LONG_64);
- BX_INSTR_MEM_DATA_ACCESS(BX_CPU_ID, s, offset, 4, BX_WRITE);
-
Bit64u laddr = get_laddr64(s, offset);
unsigned tlbIndex = BX_TLB_INDEX_OF(laddr, 3);
#if BX_SUPPORT_ALIGNMENT_CHECK && BX_CPU_LEVEL >= 4
@@ -171,8 +165,6 @@
{
BX_ASSERT(BX_CPU_THIS_PTR cpu_mode == BX_MODE_LONG_64);
- BX_INSTR_MEM_DATA_ACCESS(BX_CPU_ID, s, offset, 8, BX_WRITE);
-
Bit64u laddr = get_laddr64(s, offset);
unsigned tlbIndex = BX_TLB_INDEX_OF(laddr, 7);
#if BX_SUPPORT_ALIGNMENT_CHECK && BX_CPU_LEVEL >= 4
@@ -223,8 +215,6 @@
{
BX_ASSERT(BX_CPU_THIS_PTR cpu_mode == BX_MODE_LONG_64);
- BX_INSTR_MEM_DATA_ACCESS(BX_CPU_ID, s, offset, 16, BX_WRITE);
-
Bit64u laddr = get_laddr64(s, offset);
unsigned tlbIndex = BX_TLB_INDEX_OF(laddr, 15);
Bit64u lpf = LPFOf(laddr);
@@ -258,8 +248,6 @@
{
BX_ASSERT(BX_CPU_THIS_PTR cpu_mode == BX_MODE_LONG_64);
- BX_INSTR_MEM_DATA_ACCESS(BX_CPU_ID, s, offset, 16, BX_WRITE);
-
Bit64u laddr = get_laddr64(s, offset);
unsigned tlbIndex = BX_TLB_INDEX_OF(laddr, 0);
Bit64u lpf = AlignedAccessLPFOf(laddr, 15);
@@ -302,8 +290,6 @@
unsigned len = elements << 2;
BX_ASSERT(BX_CPU_THIS_PTR cpu_mode == BX_MODE_LONG_64);
- BX_INSTR_MEM_DATA_ACCESS(BX_CPU_ID, s, offset, len, BX_WRITE);
-
Bit64u laddr = get_laddr64(s, offset);
unsigned tlbIndex = BX_TLB_INDEX_OF(laddr, len-1);
Bit64u lpf = LPFOf(laddr);
@@ -341,8 +327,6 @@
unsigned len = elements << 2;
BX_ASSERT(BX_CPU_THIS_PTR cpu_mode == BX_MODE_LONG_64);
- BX_INSTR_MEM_DATA_ACCESS(BX_CPU_ID, s, offset, len, BX_WRITE);
-
Bit64u laddr = get_laddr64(s, offset);
unsigned tlbIndex = BX_TLB_INDEX_OF(laddr, 0);
Bit64u lpf = AlignedAccessLPFOf(laddr, len-1);
@@ -385,7 +369,6 @@
{
BX_ASSERT(BX_CPU_THIS_PTR cpu_mode == BX_MODE_LONG_64);
Bit8u data;
- BX_INSTR_MEM_DATA_ACCESS(BX_CPU_ID, s, offset, 1, BX_READ);
Bit64u laddr = get_laddr64(s, offset);
unsigned tlbIndex = BX_TLB_INDEX_OF(laddr, 0);
@@ -418,7 +401,6 @@
{
BX_ASSERT(BX_CPU_THIS_PTR cpu_mode == BX_MODE_LONG_64);
Bit16u data;
- BX_INSTR_MEM_DATA_ACCESS(BX_CPU_ID, s, offset, 2, BX_READ);
Bit64u laddr = get_laddr64(s, offset);
unsigned tlbIndex = BX_TLB_INDEX_OF(laddr, 1);
@@ -469,7 +451,6 @@
{
BX_ASSERT(BX_CPU_THIS_PTR cpu_mode == BX_MODE_LONG_64);
Bit32u data;
- BX_INSTR_MEM_DATA_ACCESS(BX_CPU_ID, s, offset, 4, BX_READ);
Bit64u laddr = get_laddr64(s, offset);
unsigned tlbIndex = BX_TLB_INDEX_OF(laddr, 3);
@@ -520,7 +501,6 @@
{
BX_ASSERT(BX_CPU_THIS_PTR cpu_mode == BX_MODE_LONG_64);
Bit64u data;
- BX_INSTR_MEM_DATA_ACCESS(BX_CPU_ID, s, offset, 8, BX_READ);
Bit64u laddr = get_laddr64(s, offset);
unsigned tlbIndex = BX_TLB_INDEX_OF(laddr, 7);
@@ -570,7 +550,6 @@
BX_CPU_C::read_virtual_dqword_64(unsigned s, Bit64u offset, BxPackedXmmRegister \
*data) {
BX_ASSERT(BX_CPU_THIS_PTR cpu_mode == BX_MODE_LONG_64);
- BX_INSTR_MEM_DATA_ACCESS(BX_CPU_ID, s, offset, 16, BX_READ);
Bit64u laddr = get_laddr64(s, offset);
unsigned tlbIndex = BX_TLB_INDEX_OF(laddr, 15);
@@ -602,7 +581,6 @@
BX_CPU_C::read_virtual_dqword_aligned_64(unsigned s, Bit64u offset, \
BxPackedXmmRegister *data) {
BX_ASSERT(BX_CPU_THIS_PTR cpu_mode == BX_MODE_LONG_64);
- BX_INSTR_MEM_DATA_ACCESS(BX_CPU_ID, s, offset, 16, BX_READ);
Bit64u laddr = get_laddr64(s, offset);
unsigned tlbIndex = BX_TLB_INDEX_OF(laddr, 0);
@@ -643,7 +621,6 @@
unsigned len = elements << 2;
BX_ASSERT(BX_CPU_THIS_PTR cpu_mode == BX_MODE_LONG_64);
- BX_INSTR_MEM_DATA_ACCESS(BX_CPU_ID, s, offset, len, BX_READ);
Bit64u laddr = get_laddr64(s, offset);
unsigned tlbIndex = BX_TLB_INDEX_OF(laddr, len-1);
@@ -679,7 +656,6 @@
unsigned len = elements << 2;
BX_ASSERT(BX_CPU_THIS_PTR cpu_mode == BX_MODE_LONG_64);
- BX_INSTR_MEM_DATA_ACCESS(BX_CPU_ID, s, offset, len, BX_READ);
Bit64u laddr = get_laddr64(s, offset);
unsigned tlbIndex = BX_TLB_INDEX_OF(laddr, 0);
@@ -726,7 +702,6 @@
{
BX_ASSERT(BX_CPU_THIS_PTR cpu_mode == BX_MODE_LONG_64);
Bit8u data;
- BX_INSTR_MEM_DATA_ACCESS(BX_CPU_ID, s, offset, 1, BX_RW);
Bit64u laddr = get_laddr64(s, offset);
unsigned tlbIndex = BX_TLB_INDEX_OF(laddr, 0);
@@ -763,7 +738,6 @@
{
BX_ASSERT(BX_CPU_THIS_PTR cpu_mode == BX_MODE_LONG_64);
Bit16u data;
- BX_INSTR_MEM_DATA_ACCESS(BX_CPU_ID, s, offset, 2, BX_RW);
Bit64u laddr = get_laddr64(s, offset);
unsigned tlbIndex = BX_TLB_INDEX_OF(laddr, 1);
@@ -818,7 +792,6 @@
{
BX_ASSERT(BX_CPU_THIS_PTR cpu_mode == BX_MODE_LONG_64);
Bit32u data;
- BX_INSTR_MEM_DATA_ACCESS(BX_CPU_ID, s, offset, 4, BX_RW);
Bit64u laddr = get_laddr64(s, offset);
unsigned tlbIndex = BX_TLB_INDEX_OF(laddr, 3);
@@ -873,7 +846,6 @@
{
BX_ASSERT(BX_CPU_THIS_PTR cpu_mode == BX_MODE_LONG_64);
Bit64u data;
- BX_INSTR_MEM_DATA_ACCESS(BX_CPU_ID, s, offset, 8, BX_RW);
Bit64u laddr = get_laddr64(s, offset);
unsigned tlbIndex = BX_TLB_INDEX_OF(laddr, 7);
Modified: trunk/bochs/instrument/example0/instrument.cc
===================================================================
--- trunk/bochs/instrument/example0/instrument.cc 2012-04-11 18:11:14 UTC (rev 11136)
+++ trunk/bochs/instrument/example0/instrument.cc 2012-04-11 19:01:25 UTC (rev 11137)
@@ -48,7 +48,7 @@
struct {
bx_address laddr; // linear address
bx_phy_address paddr; // physical address
- unsigned op; // BX_READ, BX_WRITE or BX_RW
+ unsigned rw; // BX_READ, BX_WRITE or BX_RW
unsigned size; // 1 .. 32
} data_access[MAX_DATA_ACCESSES];
bx_bool is_branch;
@@ -106,7 +106,7 @@
fprintf(stderr, "MEM ACCESS[%u]: 0x" FMT_ADDRX " (linear) 0x" FMT_PHY_ADDRX " \
(physical) %s SIZE: %d\n", n, i->data_access[n].laddr,
i->data_access[n].paddr,
- i->data_access[n].op == BX_READ ? "RD":"WR",
+ i->data_access[n].rw == BX_READ ? "RD":"WR",
i->data_access[n].size);
}
fprintf(stderr, "\n");
@@ -202,29 +202,18 @@
}
}
-void bx_instr_mem_data_access(unsigned cpu, unsigned seg, bx_address offset, \
unsigned len, unsigned rw) +void bx_instr_lin_access(unsigned cpu, bx_address lin, \
bx_phy_address phy, unsigned len, unsigned rw) {
- unsigned index;
- bx_phy_address phy;
-
if(!active || !instruction[cpu].ready) return;
- if (instruction[cpu].num_data_accesses >= MAX_DATA_ACCESSES)
- {
- return;
- }
+ unsigned index = instruction[cpu].num_data_accesses;
- bx_address lin = BX_CPU(cpu)->get_laddr(seg, offset);
- bx_bool page_valid = BX_CPU(cpu)->dbg_xlate_linear2phy(lin, &phy);
-
- // If linear translation doesn't exist, a paging exception will occur.
- // Invalidate physical address data for now.
- if (!page_valid) phy = (bx_phy_address) (-1);
-
- index = instruction[cpu].num_data_accesses;
- instruction[cpu].data_access[index].laddr = lin;
- instruction[cpu].data_access[index].paddr = phy;
- instruction[cpu].data_access[index].op = rw;
- instruction[cpu].data_access[index].size = len;
- instruction[cpu].num_data_accesses++;
+ if (index < MAX_DATA_ACCESSES) {
+ instruction[cpu].data_access[index].laddr = lin;
+ instruction[cpu].data_access[index].paddr = phy;
+ instruction[cpu].data_access[index].rw = rw;
+ instruction[cpu].data_access[index].size = len;
+ instruction[cpu].num_data_accesses++;
+ index++;
+ }
}
Modified: trunk/bochs/instrument/example0/instrument.h
===================================================================
--- trunk/bochs/instrument/example0/instrument.h 2012-04-11 18:11:14 UTC (rev 11136)
+++ trunk/bochs/instrument/example0/instrument.h 2012-04-11 19:01:25 UTC (rev 11137)
@@ -46,7 +46,7 @@
void bx_instr_exception(unsigned cpu, unsigned vector, unsigned error_code);
void bx_instr_hwinterrupt(unsigned cpu, unsigned vector, Bit16u cs, bx_address eip);
-void bx_instr_mem_data_access(unsigned cpu, unsigned seg, bx_address offset, \
unsigned len, unsigned rw); +void bx_instr_lin_access(unsigned cpu, bx_address lin, \
bx_phy_address phy, unsigned len, unsigned rw);
/* initialization/deinitialization of instrumentalization*/
#define BX_INSTR_INIT_ENV() bx_instr_init_env()
@@ -91,12 +91,9 @@
#define BX_INSTR_REPEAT_ITERATION(cpu_id, i)
/* memory access */
-#define BX_INSTR_LIN_ACCESS(cpu_id, lin, phy, len, rw)
+#define BX_INSTR_LIN_ACCESS(cpu_id, lin, phy, len, rw) \
+ bx_instr_lin_access(cpu_id, lin, phy, len, rw)
-/* memory access */
-#define BX_INSTR_MEM_DATA_ACCESS(cpu_id, seg, offset, len, rw) \
- bx_instr_mem_data_access(cpu_id, seg, offset, len, rw)
-
/* called from memory object */
#define BX_INSTR_PHY_WRITE(cpu_id, addr, len)
#define BX_INSTR_PHY_READ(cpu_id, addr, len)
@@ -154,9 +151,6 @@
/* memory access */
#define BX_INSTR_LIN_ACCESS(cpu_id, lin, phy, len, rw)
-/* memory access */
-#define BX_INSTR_MEM_DATA_ACCESS(cpu_id, seg, offset, len, rw)
-
/* called from memory object */
#define BX_INSTR_PHY_WRITE(cpu_id, addr, len)
#define BX_INSTR_PHY_READ(cpu_id, addr, len)
Modified: trunk/bochs/instrument/example1/instrument.cc
===================================================================
--- trunk/bochs/instrument/example1/instrument.cc 2012-04-11 18:11:14 UTC (rev 11136)
+++ trunk/bochs/instrument/example1/instrument.cc 2012-04-11 19:01:25 UTC (rev 11137)
@@ -79,7 +79,7 @@
fprintf(stderr, "MEM ACCESS[%u]: 0x" FMT_ADDRX " (linear) 0x" FMT_PHY_ADDRX " \
(physical) %s SIZE: %d\n", n, data_access[n].laddr,
data_access[n].paddr,
- data_access[n].op == BX_READ ? "RD":"WR",
+ data_access[n].rw == BX_READ ? "RD":"WR",
data_access[n].size);
}
fprintf(stderr, "\n");
@@ -172,27 +172,15 @@
}
}
-void bxInstrumentation::bx_instr_mem_data_access(unsigned seg, bx_address offset, \
unsigned len, unsigned rw) +void bxInstrumentation::bx_instr_lin_access(bx_address \
lin, bx_phy_adress phy, unsigned len, unsigned rw) {
- bx_phy_address phy;
-
if(!active || !ready) return;
- if (num_data_accesses >= MAX_DATA_ACCESSES)
- {
- return;
+ if (num_data_accesses < MAX_DATA_ACCESSES) {
+ data_access[num_data_accesses].laddr = lin;
+ data_access[num_data_accesses].paddr = phy;
+ data_access[num_data_accesses].rw = rw;
+ data_access[num_data_accesses].size = len;
+ num_data_accesses++;
}
-
- bx_address lin = BX_CPU(cpu)->get_laddr(seg, offset);
- bx_bool page_valid = BX_CPU(cpu)->dbg_xlate_linear2phy(lin, &phy);
-
- // If linear translation doesn't exist, a paging exception will occur.
- // Invalidate physical address data for now.
- if (!page_valid) phy = (bx_phy_address) (-1);
-
- data_access[num_data_accesses].laddr = lin;
- data_access[num_data_accesses].paddr = phy;
- data_access[num_data_accesses].op = rw;
- data_access[num_data_accesses].size = len;
- num_data_accesses++;
}
Modified: trunk/bochs/instrument/example1/instrument.h
===================================================================
--- trunk/bochs/instrument/example1/instrument.h 2012-04-11 18:11:14 UTC (rev 11136)
+++ trunk/bochs/instrument/example1/instrument.h 2012-04-11 19:01:25 UTC (rev 11137)
@@ -54,7 +54,7 @@
struct {
bx_address laddr; // linear address
bx_phy_address paddr; // physical address
- unsigned op; // BX_READ, BX_WRITE or BX_RW
+ unsigned rw; // BX_READ, BX_WRITE or BX_RW
unsigned size; // 1 .. 32
} data_access[MAX_DATA_ACCESSES];
@@ -87,7 +87,7 @@
void bx_instr_exception(unsigned vector, unsigned error_code);
void bx_instr_hwinterrupt(unsigned vector, Bit16u cs, bx_address eip);
- void bx_instr_mem_data_access(unsigned seg, bx_address offset, unsigned len, \
unsigned rw); + void bx_instr_lin_access(bx_address lin, bx_phy_adress phy, unsigned \
len, unsigned rw);
private:
void branch_taken(bx_address new_eip);
@@ -142,11 +142,9 @@
#define BX_INSTR_REPEAT_ITERATION(cpu_id, i)
/* memory access */
-#define BX_INSTR_LIN_ACCESS(cpu_id, lin, phy, len, rw)
+#define BX_INSTR_LIN_ACCESS(cpu_id, lin, phy, len, rw) \
+ icpu[cpu_id].bx_instr_lin_access(lin, phy, len, rw)
-#define BX_INSTR_MEM_DATA_ACCESS(cpu_id, seg, offset, len, rw) \
- icpu[cpu_id].bx_instr_mem_data_access(seg, offset, len, rw)
-
/* called from memory object */
#define BX_INSTR_PHY_WRITE(cpu_id, addr, len)
#define BX_INSTR_PHY_READ(cpu_id, addr, len)
@@ -204,9 +202,6 @@
/* memory access */
#define BX_INSTR_LIN_ACCESS(cpu_id, lin, phy, len, rw)
-/* memory access */
-#define BX_INSTR_MEM_DATA_ACCESS(cpu_id, seg, offset, len, rw)
-
/* called from memory object */
#define BX_INSTR_PHY_WRITE(cpu_id, addr, len)
#define BX_INSTR_PHY_READ(cpu_id, addr, len)
Modified: trunk/bochs/instrument/example2/instrument.h
===================================================================
--- trunk/bochs/instrument/example2/instrument.h 2012-04-11 18:11:14 UTC (rev 11136)
+++ trunk/bochs/instrument/example2/instrument.h 2012-04-11 19:01:25 UTC (rev 11137)
@@ -84,9 +84,6 @@
/* memory access */
#define BX_INSTR_LIN_ACCESS(cpu_id, lin, phy, len, rw)
-/* memory access */
-#define BX_INSTR_MEM_DATA_ACCESS(cpu_id, seg, offset, len, rw)
-
/* called from memory object */
#define BX_INSTR_PHY_WRITE(cpu_id, addr, len)
#define BX_INSTR_PHY_READ(cpu_id, addr, len)
@@ -145,9 +142,6 @@
/* memory access */
#define BX_INSTR_LIN_ACCESS(cpu_id, lin, phy, len, rw)
-/* memory access */
-#define BX_INSTR_MEM_DATA_ACCESS(cpu_id, seg, offset, len, rw)
-
/* called from memory object */
#define BX_INSTR_PHY_WRITE(cpu_id, addr, len)
#define BX_INSTR_PHY_READ(cpu_id, addr, len)
Modified: trunk/bochs/instrument/instrumentation.txt
===================================================================
--- trunk/bochs/instrument/instrumentation.txt 2012-04-11 18:11:14 UTC (rev 11136)
+++ trunk/bochs/instrument/instrumentation.txt 2012-04-11 19:01:25 UTC (rev 11137)
@@ -218,17 +218,6 @@
enabled.
- void bx_instr_mem_data_access(unsigned cpu, unsigned seg, bx_address offset, \
unsigned len, unsigned rw);
-
-The callback is called each time, when Bochs simulator executes segment based
-linear memory access. In contrast to previous callback it will be called even
-if memory access fails because of any reason (for example segment protection
-failure or page fault).
-
-The callback will not be called for system memory accesses like sys desriptor
-tables reads/writes or new stack pushes during far call or exception.
-
-
void bx_instr_phy_read(unsigned cpu, bx_address addr, unsigned len);
void bx_instr_phy_write(unsigned cpu, bx_address addr, unsigned len);
@@ -246,8 +235,6 @@
1. BX_INSTR_LIN_ACCESS doesn't work when repeat-speedups feature is enabled.
-2. BX_INSTR_MEM_DATA doesn't work when repeat-speedups feature is enabled.
-
Feature requests:
1. BX_INSTR_CNEAR_BRANCH_NOT_TAKEN callback should have an additional
@@ -255,17 +242,3 @@
2. BX_INSTR_SMI, BX_INSTR_NMI, BX_INSTR_SIPI and other external events
callbacks
-
-3. ???
-
-While using Bochs as a reference model for simulations, the simulator needs
-information about what loads/stores are taking place with each instruction.
-Presumably, that is what the BX_INSTR_MEM_DATA() instrumentation macros
-cover (which is the place where our simulator hooks up).
-
-The RETnear_xxx() functions call access_linear() directly, rather than call
-read_virtual_xxx() functions. This is a problem for code making use of the
-BX_INSTR_MEM_DATA() hook because it does not get called for these
-instructions. Should this be changed along with some other instructions
-that exhibit this?
- Brian Slechta
Modified: trunk/bochs/instrument/stubs/instrument.cc
===================================================================
--- trunk/bochs/instrument/stubs/instrument.cc 2012-04-11 18:11:14 UTC (rev 11136)
+++ trunk/bochs/instrument/stubs/instrument.cc 2012-04-11 19:01:25 UTC (rev 11137)
@@ -60,7 +60,6 @@
void bx_instr_inp2(Bit16u addr, unsigned len, unsigned val) {}
void bx_instr_outp(Bit16u addr, unsigned len, unsigned val) {}
-void bx_instr_mem_data_access(unsigned cpu, unsigned seg, bx_address offset, \
unsigned len, unsigned rw) {} void bx_instr_lin_access(unsigned cpu, bx_address lin, \
bx_address phy, unsigned len, unsigned rw) {}
void bx_instr_phy_write(unsigned cpu, bx_address addr, unsigned len) {}
Modified: trunk/bochs/instrument/stubs/instrument.h
===================================================================
--- trunk/bochs/instrument/stubs/instrument.h 2012-04-11 18:11:14 UTC (rev 11136)
+++ trunk/bochs/instrument/stubs/instrument.h 2012-04-11 19:01:25 UTC (rev 11137)
@@ -64,7 +64,6 @@
void bx_instr_inp2(Bit16u addr, unsigned len, unsigned val);
void bx_instr_outp(Bit16u addr, unsigned len, unsigned val);
-void bx_instr_mem_data_access(unsigned cpu, unsigned seg, bx_address offset, \
unsigned len, unsigned rw); void bx_instr_lin_access(unsigned cpu, bx_address lin, \
bx_address phy, unsigned len, unsigned rw);
void bx_instr_phy_write(unsigned cpu, bx_address addr, unsigned len);
@@ -121,9 +120,6 @@
/* memory access */
#define BX_INSTR_LIN_ACCESS(cpu_id, lin, phy, len, rw) bx_instr_lin_access(cpu_id, \
lin, phy, len, rw)
-/* memory access */
-#define BX_INSTR_MEM_DATA_ACCESS(cpu_id, seg, offset, len, rw) \
bx_instr_mem_data_access(cpu_id, seg, offset, len, rw)
-
/* called from memory object */
#define BX_INSTR_PHY_WRITE(cpu_id, addr, len) bx_instr_phy_write(cpu_id, addr, len)
#define BX_INSTR_PHY_READ(cpu_id, addr, len) bx_instr_phy_read(cpu_id, addr, len)
This was sent by the SourceForge.net collaborative development platform, the world's \
largest Open Source development site.
------------------------------------------------------------------------------
Better than sec? Nothing is better than sec when it comes to
monitoring Big Data applications. Try Boundary one-second
resolution app monitoring today. Free.
http://p.sf.net/sfu/Boundary-dev2dev
_______________________________________________
Bochs-cvs mailing list
Bochs-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bochs-cvs
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic