Fixed instrumentation example
This commit is contained in:
parent
895693b3b5
commit
5bcef53393
@ -1,5 +1,5 @@
|
|||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
// $Id: instrument.cc,v 1.5 2002-09-28 17:09:04 sshwarts Exp $
|
// $Id: instrument.cc,v 1.6 2002-09-29 16:05:13 sshwarts Exp $
|
||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// Copyright (C) 2001 MandrakeSoft S.A.
|
// Copyright (C) 2001 MandrakeSoft S.A.
|
||||||
@ -26,6 +26,7 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "bochs.h"
|
#include "bochs.h"
|
||||||
|
#include "cpu/cpu.h"
|
||||||
|
|
||||||
|
|
||||||
// maximum size of an instruction
|
// maximum size of an instruction
|
||||||
@ -37,7 +38,7 @@
|
|||||||
// Use this variable to turn on/off collection of instrumentation data
|
// Use this variable to turn on/off collection of instrumentation data
|
||||||
// If you are not using the debugger to turn this on/off, then possibly
|
// If you are not using the debugger to turn this on/off, then possibly
|
||||||
// start this at 1 instead of 0.
|
// start this at 1 instead of 0.
|
||||||
static Boolean active = 0;
|
static Boolean active = 1;
|
||||||
|
|
||||||
|
|
||||||
static struct instruction_t {
|
static struct instruction_t {
|
||||||
@ -46,8 +47,6 @@ static struct instruction_t {
|
|||||||
unsigned nprefixes;
|
unsigned nprefixes;
|
||||||
Bit8u opcode[MAX_OPCODE_SIZE];
|
Bit8u opcode[MAX_OPCODE_SIZE];
|
||||||
Boolean is32;
|
Boolean is32;
|
||||||
Bit32u linear_iaddr;
|
|
||||||
Bit32u phy_iaddr;
|
|
||||||
unsigned num_data_accesses;
|
unsigned num_data_accesses;
|
||||||
struct {
|
struct {
|
||||||
bx_address laddr; // linear address
|
bx_address laddr; // linear address
|
||||||
@ -66,13 +65,10 @@ static logfunctions *instrument_log = new logfunctions ();
|
|||||||
|
|
||||||
void bx_instr_reset(unsigned cpu)
|
void bx_instr_reset(unsigned cpu)
|
||||||
{
|
{
|
||||||
for(int i=0;i<BX_SMP_PROCESSORS;i++)
|
instruction[cpu].valid = 0;
|
||||||
{
|
instruction[cpu].nprefixes = 0;
|
||||||
instruction[cpu].valid = 0;
|
instruction[cpu].num_data_accesses = 0;
|
||||||
instruction[cpu].nprefixes = 0;
|
instruction[cpu].is_branch = 0;
|
||||||
instruction[cpu].num_data_accesses = 0;
|
|
||||||
instruction[cpu].is_branch = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void bx_instr_new_instruction(unsigned cpu)
|
void bx_instr_new_instruction(unsigned cpu)
|
||||||
@ -89,7 +85,7 @@ void bx_instr_new_instruction(unsigned cpu)
|
|||||||
char disasm_tbuf[512]; // buffer for instruction disassembly
|
char disasm_tbuf[512]; // buffer for instruction disassembly
|
||||||
unsigned length = i->opcode_size, n;
|
unsigned length = i->opcode_size, n;
|
||||||
|
|
||||||
bx_disassemble.disasm(i->is32, i->opcode, disasm_tbuf);
|
bx_disassemble.disasm(i->is32, 0, i->opcode, disasm_tbuf);
|
||||||
|
|
||||||
if(length != 0)
|
if(length != 0)
|
||||||
{
|
{
|
||||||
@ -97,7 +93,7 @@ void bx_instr_new_instruction(unsigned cpu)
|
|||||||
fprintf(stderr, "CPU: %d: %s\n", cpu, disasm_tbuf);
|
fprintf(stderr, "CPU: %d: %s\n", cpu, disasm_tbuf);
|
||||||
fprintf(stderr, "LEN: %d\tPREFIX: %d\tBYTES: ", length, i->nprefixes);
|
fprintf(stderr, "LEN: %d\tPREFIX: %d\tBYTES: ", length, i->nprefixes);
|
||||||
for(n=0;n<length;n++) fprintf(stderr, "%02x", i->opcode[n]);
|
for(n=0;n<length;n++) fprintf(stderr, "%02x", i->opcode[n]);
|
||||||
if(instruction[cpu].is_branch)
|
if(i->is_branch)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "\tBRANCH ");
|
fprintf(stderr, "\tBRANCH ");
|
||||||
|
|
||||||
@ -190,7 +186,7 @@ void bx_instr_opcode(unsigned cpu, Bit8u *opcode, unsigned len, Boolean is32)
|
|||||||
instruction[cpu].opcode_size = len;
|
instruction[cpu].opcode_size = len;
|
||||||
}
|
}
|
||||||
|
|
||||||
void bx_instr_fetch_decode_completed(unsigned cpu, BxInstruction_t *i)
|
void bx_instr_fetch_decode_completed(unsigned cpu, const bxInstruction_c *i)
|
||||||
{
|
{
|
||||||
if(active)
|
if(active)
|
||||||
{
|
{
|
||||||
@ -241,9 +237,11 @@ void bx_instr_hwinterrupt(unsigned cpu, unsigned vector, Bit16u cs, bx_address e
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void bx_instr_lin_read(unsigned cpu, bx_address lin, bx_address phy, unsigned len)
|
void bx_instr_mem_data(unsigned cpu, bx_address lin, unsigned size, unsigned rw)
|
||||||
{
|
{
|
||||||
unsigned index;
|
unsigned index;
|
||||||
|
bx_address phy;
|
||||||
|
Boolean page_valid;
|
||||||
|
|
||||||
if(!active)
|
if(!active)
|
||||||
{
|
{
|
||||||
@ -259,36 +257,20 @@ void bx_instr_lin_read(unsigned cpu, bx_address lin, bx_address phy, unsigned le
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
index = instruction[cpu].num_data_accesses;
|
BX_CPU(cpu)->dbg_xlate_linear2phy(lin, &phy, &page_valid);
|
||||||
instruction[cpu].data_access[index].paddr = A20ADDR(phy);
|
phy = A20ADDR(phy);
|
||||||
instruction[cpu].data_access[index].laddr = lin;
|
|
||||||
instruction[cpu].data_access[index].op = BX_READ;
|
|
||||||
instruction[cpu].data_access[index].size = len;
|
|
||||||
instruction[cpu].num_data_accesses++;
|
|
||||||
}
|
|
||||||
|
|
||||||
void bx_instr_lin_write(unsigned cpu, bx_address lin, bx_address phy, unsigned len)
|
// If linear translation doesn't exist, a paging exception will occur.
|
||||||
{
|
// Invalidate physical address data for now.
|
||||||
unsigned index;
|
if (!page_valid)
|
||||||
|
|
||||||
if(!active)
|
|
||||||
{
|
{
|
||||||
return;
|
phy = 0;
|
||||||
}
|
|
||||||
if (!instruction[cpu].valid)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (instruction[cpu].num_data_accesses >= MAX_DATA_ACCESSES)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
index = instruction[cpu].num_data_accesses;
|
index = instruction[cpu].num_data_accesses;
|
||||||
instruction[cpu].data_access[index].paddr = A20ADDR(phy);
|
|
||||||
instruction[cpu].data_access[index].laddr = lin;
|
instruction[cpu].data_access[index].laddr = lin;
|
||||||
instruction[cpu].data_access[index].op = BX_WRITE;
|
instruction[cpu].data_access[index].paddr = phy;
|
||||||
instruction[cpu].data_access[index].size = len;
|
instruction[cpu].data_access[index].op = rw;
|
||||||
|
instruction[cpu].data_access[index].size = size;
|
||||||
instruction[cpu].num_data_accesses++;
|
instruction[cpu].num_data_accesses++;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
// $Id: instrument.h,v 1.5 2002-09-28 17:09:04 sshwarts Exp $
|
// $Id: instrument.h,v 1.6 2002-09-29 16:05:13 sshwarts Exp $
|
||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// Copyright (C) 2001 MandrakeSoft S.A.
|
// Copyright (C) 2001 MandrakeSoft S.A.
|
||||||
@ -49,6 +49,8 @@
|
|||||||
|
|
||||||
#if BX_INSTRUMENTATION
|
#if BX_INSTRUMENTATION
|
||||||
|
|
||||||
|
class bxInstruction_c;
|
||||||
|
|
||||||
// called from the CPU core
|
// called from the CPU core
|
||||||
|
|
||||||
void bx_instr_reset(unsigned cpu);
|
void bx_instr_reset(unsigned cpu);
|
||||||
@ -60,7 +62,7 @@ void bx_instr_ucnear_branch(unsigned cpu, unsigned what, bx_address new_eip);
|
|||||||
void bx_instr_far_branch(unsigned cpu, unsigned what, Bit16u new_cs, bx_address new_eip);
|
void bx_instr_far_branch(unsigned cpu, unsigned what, Bit16u new_cs, bx_address new_eip);
|
||||||
|
|
||||||
void bx_instr_opcode(unsigned cpu, Bit8u *opcode, unsigned len, Boolean is32);
|
void bx_instr_opcode(unsigned cpu, Bit8u *opcode, unsigned len, Boolean is32);
|
||||||
void bx_instr_fetch_decode_completed(unsigned cpu, BxInstruction_t *i);
|
void bx_instr_fetch_decode_completed(unsigned cpu, const bxInstruction_c *i);
|
||||||
|
|
||||||
void bx_instr_prefix_as(unsigned cpu);
|
void bx_instr_prefix_as(unsigned cpu);
|
||||||
void bx_instr_prefix_os(unsigned cpu);
|
void bx_instr_prefix_os(unsigned cpu);
|
||||||
@ -79,8 +81,7 @@ void bx_instr_interrupt(unsigned cpu, unsigned vector);
|
|||||||
void bx_instr_exception(unsigned cpu, unsigned vector);
|
void bx_instr_exception(unsigned cpu, unsigned vector);
|
||||||
void bx_instr_hwinterrupt(unsigned cpu, unsigned vector, Bit16u cs, bx_address eip);
|
void bx_instr_hwinterrupt(unsigned cpu, unsigned vector, Bit16u cs, bx_address eip);
|
||||||
|
|
||||||
void bx_instr_lin_read(unsigned cpu, bx_address lin, bx_address phy, unsigned len);
|
void bx_instr_mem_data(unsigned cpu, bx_address lin, unsigned size, unsigned rw);
|
||||||
void bx_instr_lin_write(unsigned cpu, bx_address lin, bx_address phy, unsigned len);
|
|
||||||
|
|
||||||
/* simulation init, shutdown, reset */
|
/* simulation init, shutdown, reset */
|
||||||
# define BX_INSTR_INIT(cpu_id)
|
# define BX_INSTR_INIT(cpu_id)
|
||||||
@ -132,11 +133,11 @@ void bx_instr_lin_write(unsigned cpu, bx_address lin, bx_address phy, unsigned l
|
|||||||
# define BX_INSTR_REPEAT_ITERATION(cpu_id)
|
# define BX_INSTR_REPEAT_ITERATION(cpu_id)
|
||||||
|
|
||||||
/* memory access */
|
/* memory access */
|
||||||
# define BX_INSTR_LIN_READ(cpu_id, lin, phy, len) bx_instr_lin_read(cpu_id, lin, phy, len)
|
# define BX_INSTR_LIN_READ(cpu_id, lin, phy, len)
|
||||||
# define BX_INSTR_LIN_WRITE(cpu_id, lin, phy, len) bx_instr_lin_write(cpu_id, lin, phy, len)
|
# define BX_INSTR_LIN_WRITE(cpu_id, lin, phy, len)
|
||||||
|
|
||||||
# define BX_INSTR_MEM_CODE(cpu_id, linear, size)
|
# define BX_INSTR_MEM_CODE(cpu_id, linear, size)
|
||||||
# define BX_INSTR_MEM_DATA(cpu_id, linear, size, rw)
|
# define BX_INSTR_MEM_DATA(cpu_id, linear, size, rw) bx_instr_mem_data(cpu_id, linear, size, rw)
|
||||||
|
|
||||||
/* called from memory object */
|
/* called from memory object */
|
||||||
# define BX_INSTR_PHY_WRITE(addr, len)
|
# define BX_INSTR_PHY_WRITE(addr, len)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user