mirror of
https://github.com/holub/mame
synced 2025-06-30 07:58:56 +03:00
Changed how watchpoints work so that supporting them adds 0 overhead
unless some are actually live. Changed a few call sites from using memory_set_context() to cpuintrf_push_context().
This commit is contained in:
parent
10879d56b4
commit
75d18b3a33
@ -59,7 +59,6 @@ struct _debugger_private
|
|||||||
UINT8 memory_modified;
|
UINT8 memory_modified;
|
||||||
|
|
||||||
int execution_state;
|
int execution_state;
|
||||||
int memory_hook_cpunum;
|
|
||||||
|
|
||||||
UINT32 bpindex;
|
UINT32 bpindex;
|
||||||
UINT32 wpindex;
|
UINT32 wpindex;
|
||||||
@ -355,6 +354,10 @@ static void compute_debug_flags(running_machine *machine, const debug_cpu_info *
|
|||||||
|
|
||||||
/* add in the watchpoint flags */
|
/* add in the watchpoint flags */
|
||||||
machine->debug_flags |= (info->flags & DEBUG_FLAG_WATCHPOINT) >> (24 - 4);
|
machine->debug_flags |= (info->flags & DEBUG_FLAG_WATCHPOINT) >> (24 - 4);
|
||||||
|
|
||||||
|
/* if any of the watchpoint flags are set and we're live, tell the memory system */
|
||||||
|
if (global.livecpu != NULL && ((info->flags & DEBUG_FLAG_WATCHPOINT) != 0))
|
||||||
|
memory_set_context(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -598,6 +601,42 @@ void debug_cpu_instruction_hook(running_machine *machine, offs_t curpc)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*-------------------------------------------------
|
||||||
|
debug_cpu_memory_read_hook - the memory system
|
||||||
|
calls this hook when watchpoints are enabled
|
||||||
|
and a memory read happens
|
||||||
|
-------------------------------------------------*/
|
||||||
|
|
||||||
|
void debug_cpu_memory_read_hook(running_machine *machine, int cpunum, int spacenum, offs_t address, UINT64 mem_mask)
|
||||||
|
{
|
||||||
|
debug_cpu_info *info = &global.cpuinfo[cpunum];
|
||||||
|
|
||||||
|
/* check watchpoints */
|
||||||
|
if ((info->flags & (DEBUG_FLAG_LIVE_WPR_PROGRAM << spacenum)) != 0)
|
||||||
|
watchpoint_check(cpunum, spacenum, WATCHPOINT_READ, address, 0, mem_mask);
|
||||||
|
|
||||||
|
/* check hotspots */
|
||||||
|
if (info->hotspots != NULL)
|
||||||
|
check_hotspots(cpunum, spacenum, address);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*-------------------------------------------------
|
||||||
|
debug_cpu_memory_write_hook - the memory
|
||||||
|
system calls this hook when watchpoints are
|
||||||
|
enabled and a memory write happens
|
||||||
|
-------------------------------------------------*/
|
||||||
|
|
||||||
|
void debug_cpu_memory_write_hook(running_machine *machine, int cpunum, int spacenum, offs_t address, UINT64 data, UINT64 mem_mask)
|
||||||
|
{
|
||||||
|
debug_cpu_info *info = &global.cpuinfo[cpunum];
|
||||||
|
|
||||||
|
/* check watchpoints */
|
||||||
|
if ((info->flags & (DEBUG_FLAG_LIVE_WPW_PROGRAM << spacenum)) != 0)
|
||||||
|
watchpoint_check(cpunum, spacenum, WATCHPOINT_WRITE, address, data, mem_mask);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
EXECUTION CONTROL
|
EXECUTION CONTROL
|
||||||
@ -1045,61 +1084,6 @@ static void process_source_file(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*-------------------------------------------------
|
|
||||||
standard_debug_hook_read - standard read hook
|
|
||||||
-------------------------------------------------*/
|
|
||||||
|
|
||||||
static void standard_debug_hook_read(int spacenum, offs_t address, UINT64 mem_mask)
|
|
||||||
{
|
|
||||||
debug_cpu_info *info = &global.cpuinfo[global.memory_hook_cpunum];
|
|
||||||
|
|
||||||
/* check watchpoints */
|
|
||||||
if ((info->flags & (DEBUG_FLAG_LIVE_WPR_PROGRAM << spacenum)) != 0)
|
|
||||||
watchpoint_check(global.memory_hook_cpunum, spacenum, WATCHPOINT_READ, address, 0, mem_mask);
|
|
||||||
|
|
||||||
/* check hotspots */
|
|
||||||
if (info->hotspots != NULL)
|
|
||||||
check_hotspots(global.memory_hook_cpunum, spacenum, address);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*-------------------------------------------------
|
|
||||||
standard_debug_hook_write - standard write hook
|
|
||||||
-------------------------------------------------*/
|
|
||||||
|
|
||||||
static void standard_debug_hook_write(int spacenum, offs_t address, UINT64 data, UINT64 mem_mask)
|
|
||||||
{
|
|
||||||
debug_cpu_info *info = &global.cpuinfo[global.memory_hook_cpunum];
|
|
||||||
|
|
||||||
/* check watchpoints */
|
|
||||||
if ((info->flags & (DEBUG_FLAG_LIVE_WPW_PROGRAM << spacenum)) != 0)
|
|
||||||
watchpoint_check(global.memory_hook_cpunum, spacenum, WATCHPOINT_WRITE, address, data, mem_mask);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*-------------------------------------------------
|
|
||||||
debug_cpu_get_memory_hooks - get memory hooks
|
|
||||||
for the specified CPU
|
|
||||||
-------------------------------------------------*/
|
|
||||||
|
|
||||||
void debug_cpu_get_memory_hooks(int cpunum, debug_hook_read_func *read, debug_hook_write_func *write)
|
|
||||||
{
|
|
||||||
debug_cpu_info *info = &global.cpuinfo[cpunum];
|
|
||||||
|
|
||||||
global.memory_hook_cpunum = cpunum;
|
|
||||||
|
|
||||||
if ((info->flags & DEBUG_FLAG_READ_WATCHPOINT) != 0 || info->hotspots != NULL)
|
|
||||||
*read = standard_debug_hook_read;
|
|
||||||
else
|
|
||||||
*read = NULL;
|
|
||||||
|
|
||||||
if ((info->flags & DEBUG_FLAG_WRITE_WATCHPOINT) != 0)
|
|
||||||
*write = standard_debug_hook_write;
|
|
||||||
else
|
|
||||||
*write = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*-------------------------------------------------
|
/*-------------------------------------------------
|
||||||
debug_cpu_set_instruction_hook - set a hook to
|
debug_cpu_set_instruction_hook - set a hook to
|
||||||
be called on each instruction for a given CPU
|
be called on each instruction for a given CPU
|
||||||
@ -1140,6 +1124,10 @@ static void breakpoint_update_flags(debug_cpu_info *info)
|
|||||||
info->flags |= DEBUG_FLAG_LIVE_BP;
|
info->flags |= DEBUG_FLAG_LIVE_BP;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* push the flags out globally */
|
||||||
|
if (global.livecpu != NULL)
|
||||||
|
compute_debug_flags(Machine, global.livecpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1292,6 +1280,13 @@ static void watchpoint_update_flags(debug_cpu_info *info, int spacenum)
|
|||||||
UINT32 readflag = DEBUG_FLAG_LIVE_WPR_PROGRAM << spacenum;
|
UINT32 readflag = DEBUG_FLAG_LIVE_WPR_PROGRAM << spacenum;
|
||||||
debug_cpu_watchpoint *wp;
|
debug_cpu_watchpoint *wp;
|
||||||
|
|
||||||
|
/* if hotspots are enabled, turn on all reads */
|
||||||
|
if (info->hotspots != NULL)
|
||||||
|
{
|
||||||
|
info->flags |= DEBUG_FLAG_READ_WATCHPOINT;
|
||||||
|
readflag = 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* see if there are any enabled breakpoints */
|
/* see if there are any enabled breakpoints */
|
||||||
info->flags &= ~(readflag | writeflag);
|
info->flags &= ~(readflag | writeflag);
|
||||||
for (wp = info->space[spacenum].wplist; wp != NULL; wp = wp->next)
|
for (wp = info->space[spacenum].wplist; wp != NULL; wp = wp->next)
|
||||||
@ -1310,6 +1305,10 @@ static void watchpoint_update_flags(debug_cpu_info *info, int spacenum)
|
|||||||
if ((readflag | writeflag) == 0)
|
if ((readflag | writeflag) == 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* push the flags out globally */
|
||||||
|
if (global.livecpu != NULL)
|
||||||
|
compute_debug_flags(Machine, global.livecpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1395,6 +1394,7 @@ static void watchpoint_check(int cpunum, int spacenum, int type, offs_t address,
|
|||||||
else
|
else
|
||||||
sprintf(buffer, "Stopped at watchpoint %X reading %s from %08X (PC=%X)", wp->index, sizes[size], BYTE2ADDR(address, &global.cpuinfo[cpunum], spacenum), activecpu_get_pc());
|
sprintf(buffer, "Stopped at watchpoint %X reading %s from %08X (PC=%X)", wp->index, sizes[size], BYTE2ADDR(address, &global.cpuinfo[cpunum], spacenum), activecpu_get_pc());
|
||||||
debug_console_printf("%s\n", buffer);
|
debug_console_printf("%s\n", buffer);
|
||||||
|
compute_debug_flags(Machine, info);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1432,10 +1432,6 @@ int debug_cpu_watchpoint_set(int cpunum, int spacenum, int type, offs_t address,
|
|||||||
|
|
||||||
watchpoint_update_flags(info, spacenum);
|
watchpoint_update_flags(info, spacenum);
|
||||||
|
|
||||||
/* force debug_cpu_get_memory_hooks() to be called */
|
|
||||||
cpuintrf_push_context(-1);
|
|
||||||
cpuintrf_pop_context();
|
|
||||||
|
|
||||||
return wp->index;
|
return wp->index;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1472,11 +1468,6 @@ int debug_cpu_watchpoint_clear(int wpnum)
|
|||||||
free(wp);
|
free(wp);
|
||||||
|
|
||||||
watchpoint_update_flags(info, spacenum);
|
watchpoint_update_flags(info, spacenum);
|
||||||
|
|
||||||
/* force debug_cpu_get_memory_hooks() to be called */
|
|
||||||
cpuintrf_push_context(-1);
|
|
||||||
cpuintrf_pop_context();
|
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1510,7 +1501,6 @@ int debug_cpu_watchpoint_enable(int wpnum, int enable)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1546,10 +1536,7 @@ int debug_cpu_hotspot_track(int cpunum, int numspots, int threshhold)
|
|||||||
info->hotspot_threshhold = threshhold;
|
info->hotspot_threshhold = threshhold;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* force debug_cpu_get_memory_hooks() to be called */
|
watchpoint_update_flags(info, ADDRESS_SPACE_PROGRAM);
|
||||||
cpuintrf_push_context(-1);
|
|
||||||
cpuintrf_pop_context();
|
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -228,12 +228,18 @@ void debug_cpu_stop_hook(running_machine *machine, int cpunum);
|
|||||||
/* the CPU execution system calls this hook when an interrupt is acknowledged */
|
/* the CPU execution system calls this hook when an interrupt is acknowledged */
|
||||||
void debug_cpu_interrupt_hook(running_machine *machine, int cpunum, int irqline);
|
void debug_cpu_interrupt_hook(running_machine *machine, int cpunum, int irqline);
|
||||||
|
|
||||||
/* the CPU execution system calls this hook when an exception is generated */
|
/* called by the CPU cores when an exception is generated */
|
||||||
void debug_cpu_exception_hook(running_machine *machine, int cpunum, int exception);
|
void debug_cpu_exception_hook(running_machine *machine, int cpunum, int exception);
|
||||||
|
|
||||||
/* called by the CPU cores before executing each instruction */
|
/* called by the CPU cores before executing each instruction */
|
||||||
void debug_cpu_instruction_hook(running_machine *machine, offs_t curpc);
|
void debug_cpu_instruction_hook(running_machine *machine, offs_t curpc);
|
||||||
|
|
||||||
|
/* the memory system calls this hook when watchpoints are enabled and a memory read happens */
|
||||||
|
void debug_cpu_memory_read_hook(running_machine *machine, int cpunum, int spacenum, offs_t address, UINT64 mem_mask);
|
||||||
|
|
||||||
|
/* the memory system calls this hook when watchpoints are enabled and a memory write happens */
|
||||||
|
void debug_cpu_memory_write_hook(running_machine *machine, int cpunum, int spacenum, offs_t address, UINT64 data, UINT64 mem_mask);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* ----- core debugger functions ----- */
|
/* ----- core debugger functions ----- */
|
||||||
|
1155
src/emu/memory.c
1155
src/emu/memory.c
File diff suppressed because it is too large
Load Diff
@ -39,12 +39,13 @@ enum
|
|||||||
STATIC_INVALID = 0, /* invalid - should never be used */
|
STATIC_INVALID = 0, /* invalid - should never be used */
|
||||||
STATIC_BANK1 = 1, /* first memory bank */
|
STATIC_BANK1 = 1, /* first memory bank */
|
||||||
/* entries 1-32 are for fixed banks 1-32 specified by the driver */
|
/* entries 1-32 are for fixed banks 1-32 specified by the driver */
|
||||||
/* entries 33-67 are for dynamically allocated internal banks */
|
/* entries 33-66 are for dynamically allocated internal banks */
|
||||||
STATIC_BANKMAX = 67, /* last memory bank */
|
STATIC_BANKMAX = 66, /* last memory bank */
|
||||||
STATIC_RAM, /* RAM - reads/writes map to dynamic banks */
|
STATIC_RAM, /* RAM - reads/writes map to dynamic banks */
|
||||||
STATIC_ROM, /* ROM - reads = RAM; writes = UNMAP */
|
STATIC_ROM, /* ROM - reads = RAM; writes = UNMAP */
|
||||||
STATIC_NOP, /* NOP - reads = unmapped value; writes = no-op */
|
STATIC_NOP, /* NOP - reads = unmapped value; writes = no-op */
|
||||||
STATIC_UNMAP, /* unmapped - same as NOP except we log errors */
|
STATIC_UNMAP, /* unmapped - same as NOP except we log errors */
|
||||||
|
STATIC_WATCHPOINT, /* watchpoint - used internally */
|
||||||
STATIC_COUNT /* total number of static handlers */
|
STATIC_COUNT /* total number of static handlers */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -120,15 +120,15 @@ WRITE8_HANDLER( pitnrun_68705_portB_w )
|
|||||||
}
|
}
|
||||||
if (~data & 0x10)
|
if (~data & 0x10)
|
||||||
{
|
{
|
||||||
memory_set_context(0);
|
cpuintrf_push_context(0);
|
||||||
program_write_byte(address, portA_out);
|
program_write_byte(address, portA_out);
|
||||||
memory_set_context(2);
|
cpuintrf_pop_context();
|
||||||
}
|
}
|
||||||
if (~data & 0x20)
|
if (~data & 0x20)
|
||||||
{
|
{
|
||||||
memory_set_context(0);
|
cpuintrf_push_context(0);
|
||||||
portA_in = program_read_byte(address);
|
portA_in = program_read_byte(address);
|
||||||
memory_set_context(2);
|
cpuintrf_pop_context();
|
||||||
}
|
}
|
||||||
if (~data & 0x40)
|
if (~data & 0x40)
|
||||||
{
|
{
|
||||||
|
@ -221,18 +221,18 @@ WRITE8_HANDLER( taitosj_68705_portB_w )
|
|||||||
{
|
{
|
||||||
LOG(("%04x: 68705 write %02x to address %04x\n",activecpu_get_pc(),portA_out,address));
|
LOG(("%04x: 68705 write %02x to address %04x\n",activecpu_get_pc(),portA_out,address));
|
||||||
|
|
||||||
memory_set_context(0);
|
cpuintrf_push_context(0);
|
||||||
program_write_byte(address, portA_out);
|
program_write_byte(address, portA_out);
|
||||||
memory_set_context(2);
|
cpuintrf_pop_context();
|
||||||
|
|
||||||
/* increase low 8 bits of latched address for burst writes */
|
/* increase low 8 bits of latched address for burst writes */
|
||||||
address = (address & 0xff00) | ((address + 1) & 0xff);
|
address = (address & 0xff00) | ((address + 1) & 0xff);
|
||||||
}
|
}
|
||||||
if (~data & 0x20)
|
if (~data & 0x20)
|
||||||
{
|
{
|
||||||
memory_set_context(0);
|
cpuintrf_push_context(0);
|
||||||
portA_in = program_read_byte(address);
|
portA_in = program_read_byte(address);
|
||||||
memory_set_context(2);
|
cpuintrf_pop_context();
|
||||||
LOG(("%04x: 68705 read %02x from address %04x\n",activecpu_get_pc(),portA_in,address));
|
LOG(("%04x: 68705 read %02x from address %04x\n",activecpu_get_pc(),portA_in,address));
|
||||||
}
|
}
|
||||||
if (~data & 0x40)
|
if (~data & 0x40)
|
||||||
|
Loading…
Reference in New Issue
Block a user