gdb/gdbserver/mem-break.c - gdb
Global variables defined
Data types defined
Functions defined
Macros defined
Source code
- #include "server.h"
- #include "regcache.h"
- #include "ax.h"
- #include <stdint.h>
- const unsigned char *breakpoint_data;
- int breakpoint_len;
- #define MAX_BREAKPOINT_LEN 8
- struct raw_breakpoint
- {
- struct raw_breakpoint *next;
-
- enum raw_bkpt_type raw_type;
-
- int refcount;
-
- CORE_ADDR pc;
-
- int size;
-
- unsigned char old_data[MAX_BREAKPOINT_LEN];
-
- int inserted;
- };
- enum bkpt_type
- {
-
- gdb_breakpoint_Z0,
-
- gdb_breakpoint_Z1,
-
- gdb_breakpoint_Z2,
-
- gdb_breakpoint_Z3,
-
- gdb_breakpoint_Z4,
-
- reinsert_breakpoint,
-
- other_breakpoint,
- };
- struct point_cond_list
- {
-
- struct agent_expr *cond;
-
- struct point_cond_list *next;
- };
- struct point_command_list
- {
-
- struct agent_expr *cmd;
-
- int persistence;
-
- struct point_command_list *next;
- };
- struct breakpoint
- {
- struct breakpoint *next;
-
- enum bkpt_type type;
-
- struct point_cond_list *cond_list;
-
- struct point_command_list *command_list;
-
- struct raw_breakpoint *raw;
-
- int (*handler) (CORE_ADDR);
- };
- enum target_hw_bp_type
- raw_bkpt_type_to_target_hw_bp_type (enum raw_bkpt_type raw_type)
- {
- switch (raw_type)
- {
- case raw_bkpt_type_hw:
- return hw_execute;
- case raw_bkpt_type_write_wp:
- return hw_write;
- case raw_bkpt_type_read_wp:
- return hw_read;
- case raw_bkpt_type_access_wp:
- return hw_access;
- default:
- internal_error (__FILE__, __LINE__,
- "bad raw breakpoint type %d", (int) raw_type);
- }
- }
- static enum bkpt_type
- Z_packet_to_bkpt_type (char z_type)
- {
- gdb_assert ('0' <= z_type && z_type <= '4');
- return gdb_breakpoint_Z0 + (z_type - '0');
- }
- enum raw_bkpt_type
- Z_packet_to_raw_bkpt_type (char z_type)
- {
- switch (z_type)
- {
- case Z_PACKET_SW_BP:
- return raw_bkpt_type_sw;
- case Z_PACKET_HW_BP:
- return raw_bkpt_type_hw;
- case Z_PACKET_WRITE_WP:
- return raw_bkpt_type_write_wp;
- case Z_PACKET_READ_WP:
- return raw_bkpt_type_read_wp;
- case Z_PACKET_ACCESS_WP:
- return raw_bkpt_type_access_wp;
- default:
- gdb_assert_not_reached ("unhandled Z packet type.");
- }
- }
- int
- any_persistent_commands ()
- {
- struct process_info *proc = current_process ();
- struct breakpoint *bp;
- struct point_command_list *cl;
- for (bp = proc->breakpoints; bp != NULL; bp = bp->next)
- {
- for (cl = bp->command_list; cl != NULL; cl = cl->next)
- if (cl->persistence)
- return 1;
- }
- return 0;
- }
- static struct raw_breakpoint *
- find_enabled_raw_code_breakpoint_at (CORE_ADDR addr, enum raw_bkpt_type type)
- {
- struct process_info *proc = current_process ();
- struct raw_breakpoint *bp;
- for (bp = proc->raw_breakpoints; bp != NULL; bp = bp->next)
- if (bp->pc == addr
- && bp->raw_type == type
- && bp->inserted >= 0)
- return bp;
- return NULL;
- }
- static struct raw_breakpoint *
- find_raw_breakpoint_at (CORE_ADDR addr, enum raw_bkpt_type type, int size)
- {
- struct process_info *proc = current_process ();
- struct raw_breakpoint *bp;
- for (bp = proc->raw_breakpoints; bp != NULL; bp = bp->next)
- if (bp->pc == addr && bp->raw_type == type && bp->size == size)
- return bp;
- return NULL;
- }
- int
- insert_memory_breakpoint (struct raw_breakpoint *bp)
- {
- unsigned char buf[MAX_BREAKPOINT_LEN];
- int err;
- if (breakpoint_data == NULL)
- return 1;
-
- if (bp->size != breakpoint_len)
- {
- if (debug_threads)
- debug_printf ("Don't know how to insert breakpoints of size %d.\n",
- bp->size);
- return -1;
- }
-
- err = read_inferior_memory (bp->pc, buf, breakpoint_len);
- if (err != 0)
- {
- if (debug_threads)
- debug_printf ("Failed to read shadow memory of"
- " breakpoint at 0x%s (%s).\n",
- paddress (bp->pc), strerror (err));
- }
- else
- {
- memcpy (bp->old_data, buf, breakpoint_len);
- err = (*the_target->write_memory) (bp->pc, breakpoint_data,
- breakpoint_len);
- if (err != 0)
- {
- if (debug_threads)
- debug_printf ("Failed to insert breakpoint at 0x%s (%s).\n",
- paddress (bp->pc), strerror (err));
- }
- }
- return err != 0 ? -1 : 0;
- }
- int
- remove_memory_breakpoint (struct raw_breakpoint *bp)
- {
- unsigned char buf[MAX_BREAKPOINT_LEN];
- int err;
-
- memcpy (buf, bp->old_data, breakpoint_len);
- err = write_inferior_memory (bp->pc, buf, breakpoint_len);
- if (err != 0)
- {
- if (debug_threads)
- debug_printf ("Failed to uninsert raw breakpoint "
- "at 0x%s (%s) while deleting it.\n",
- paddress (bp->pc), strerror (err));
- }
- return err != 0 ? -1 : 0;
- }
- static struct raw_breakpoint *
- set_raw_breakpoint_at (enum raw_bkpt_type type, CORE_ADDR where, int size,
- int *err)
- {
- struct process_info *proc = current_process ();
- struct raw_breakpoint *bp;
- if (type == raw_bkpt_type_sw || type == raw_bkpt_type_hw)
- {
- bp = find_enabled_raw_code_breakpoint_at (where, type);
- if (bp != NULL && bp->size != size)
- {
-
- if (debug_threads)
- debug_printf ("Inconsistent breakpoint size? Was %d, now %d.\n",
- bp->size, size);
- bp->inserted = -1;
- bp = NULL;
- }
- }
- else
- bp = find_raw_breakpoint_at (where, type, size);
- if (bp != NULL)
- {
- bp->refcount++;
- return bp;
- }
- bp = xcalloc (1, sizeof (*bp));
- bp->pc = where;
- bp->size = size;
- bp->refcount = 1;
- bp->raw_type = type;
- *err = the_target->insert_point (bp->raw_type, bp->pc, bp->size, bp);
- if (*err != 0)
- {
- if (debug_threads)
- debug_printf ("Failed to insert breakpoint at 0x%s (%d).\n",
- paddress (where), *err);
- free (bp);
- return NULL;
- }
- bp->inserted = 1;
-
- bp->next = proc->raw_breakpoints;
- proc->raw_breakpoints = bp;
- return bp;
- }
- struct fast_tracepoint_jump
- {
- struct fast_tracepoint_jump *next;
-
- int refcount;
-
- CORE_ADDR pc;
-
- int inserted;
-
- int length;
-
- unsigned char insn_and_shadow[0];
- };
- #define fast_tracepoint_jump_insn(fp) \
- ((fp)->insn_and_shadow + 0)
- #define fast_tracepoint_jump_shadow(fp) \
- ((fp)->insn_and_shadow + (fp)->length)
- static struct fast_tracepoint_jump *
- find_fast_tracepoint_jump_at (CORE_ADDR where)
- {
- struct process_info *proc = current_process ();
- struct fast_tracepoint_jump *jp;
- for (jp = proc->fast_tracepoint_jumps; jp != NULL; jp = jp->next)
- if (jp->pc == where)
- return jp;
- return NULL;
- }
- int
- fast_tracepoint_jump_here (CORE_ADDR where)
- {
- struct fast_tracepoint_jump *jp = find_fast_tracepoint_jump_at (where);
- return (jp != NULL);
- }
- int
- delete_fast_tracepoint_jump (struct fast_tracepoint_jump *todel)
- {
- struct fast_tracepoint_jump *bp, **bp_link;
- int ret;
- struct process_info *proc = current_process ();
- bp = proc->fast_tracepoint_jumps;
- bp_link = &proc->fast_tracepoint_jumps;
- while (bp)
- {
- if (bp == todel)
- {
- if (--bp->refcount == 0)
- {
- struct fast_tracepoint_jump *prev_bp_link = *bp_link;
- unsigned char *buf;
-
- *bp_link = bp->next;
-
- buf = alloca (bp->length);
- memcpy (buf, fast_tracepoint_jump_shadow (bp), bp->length);
- ret = write_inferior_memory (bp->pc, buf, bp->length);
- if (ret != 0)
- {
-
- *bp_link = prev_bp_link;
- if (debug_threads)
- debug_printf ("Failed to uninsert fast tracepoint jump "
- "at 0x%s (%s) while deleting it.\n",
- paddress (bp->pc), strerror (ret));
- return ret;
- }
- free (bp);
- }
- return 0;
- }
- else
- {
- bp_link = &bp->next;
- bp = *bp_link;
- }
- }
- warning ("Could not find fast tracepoint jump in list.");
- return ENOENT;
- }
- void
- inc_ref_fast_tracepoint_jump (struct fast_tracepoint_jump *jp)
- {
- jp->refcount++;
- }
- struct fast_tracepoint_jump *
- set_fast_tracepoint_jump (CORE_ADDR where,
- unsigned char *insn, ULONGEST length)
- {
- struct process_info *proc = current_process ();
- struct fast_tracepoint_jump *jp;
- int err;
- unsigned char *buf;
-
- jp = find_fast_tracepoint_jump_at (where);
- if (jp != NULL)
- {
- jp->refcount++;
- return jp;
- }
-
- jp = xcalloc (1, sizeof (*jp) + (length * 2));
- jp->pc = where;
- jp->length = length;
- memcpy (fast_tracepoint_jump_insn (jp), insn, length);
- jp->refcount = 1;
- buf = alloca (length);
-
- err = read_inferior_memory (where, buf, length);
- if (err != 0)
- {
- if (debug_threads)
- debug_printf ("Failed to read shadow memory of"
- " fast tracepoint at 0x%s (%s).\n",
- paddress (where), strerror (err));
- free (jp);
- return NULL;
- }
- memcpy (fast_tracepoint_jump_shadow (jp), buf, length);
-
- jp->inserted = 1;
- jp->next = proc->fast_tracepoint_jumps;
- proc->fast_tracepoint_jumps = jp;
-
- err = write_inferior_memory (where, buf, length);
- if (err != 0)
- {
- if (debug_threads)
- debug_printf ("Failed to insert fast tracepoint jump at 0x%s (%s).\n",
- paddress (where), strerror (err));
-
- proc->fast_tracepoint_jumps = jp->next;
- free (jp);
- return NULL;
- }
- return jp;
- }
- void
- uninsert_fast_tracepoint_jumps_at (CORE_ADDR pc)
- {
- struct fast_tracepoint_jump *jp;
- int err;
- jp = find_fast_tracepoint_jump_at (pc);
- if (jp == NULL)
- {
-
- if (debug_threads)
- debug_printf ("Could not find fast tracepoint jump at 0x%s "
- "in list (uninserting).\n",
- paddress (pc));
- return;
- }
- if (jp->inserted)
- {
- unsigned char *buf;
- jp->inserted = 0;
-
- buf = alloca (jp->length);
- memcpy (buf, fast_tracepoint_jump_shadow (jp), jp->length);
- err = write_inferior_memory (jp->pc, buf, jp->length);
- if (err != 0)
- {
- jp->inserted = 1;
- if (debug_threads)
- debug_printf ("Failed to uninsert fast tracepoint jump at"
- " 0x%s (%s).\n",
- paddress (pc), strerror (err));
- }
- }
- }
- void
- reinsert_fast_tracepoint_jumps_at (CORE_ADDR where)
- {
- struct fast_tracepoint_jump *jp;
- int err;
- unsigned char *buf;
- jp = find_fast_tracepoint_jump_at (where);
- if (jp == NULL)
- {
-
- if (debug_threads)
- debug_printf ("Could not find fast tracepoint jump at 0x%s "
- "in list (reinserting).\n",
- paddress (where));
- return;
- }
- if (jp->inserted)
- error ("Jump already inserted at reinsert time.");
- jp->inserted = 1;
-
- buf = alloca (jp->length);
- memcpy (buf, fast_tracepoint_jump_shadow (jp), jp->length);
- err = write_inferior_memory (where, buf, jp->length);
- if (err != 0)
- {
- jp->inserted = 0;
- if (debug_threads)
- debug_printf ("Failed to reinsert fast tracepoint jump at"
- " 0x%s (%s).\n",
- paddress (where), strerror (err));
- }
- }
- static struct breakpoint *
- set_breakpoint (enum bkpt_type type, enum raw_bkpt_type raw_type,
- CORE_ADDR where, int size,
- int (*handler) (CORE_ADDR), int *err)
- {
- struct process_info *proc = current_process ();
- struct breakpoint *bp;
- struct raw_breakpoint *raw;
- raw = set_raw_breakpoint_at (raw_type, where, size, err);
- if (raw == NULL)
- {
-
- return NULL;
- }
- bp = xcalloc (1, sizeof (struct breakpoint));
- bp->type = type;
- bp->raw = raw;
- bp->handler = handler;
- bp->next = proc->breakpoints;
- proc->breakpoints = bp;
- return bp;
- }
- struct breakpoint *
- set_breakpoint_at (CORE_ADDR where, int (*handler) (CORE_ADDR))
- {
- int err_ignored;
- return set_breakpoint (other_breakpoint, raw_bkpt_type_sw,
- where, breakpoint_len, handler,
- &err_ignored);
- }
- static int
- delete_raw_breakpoint (struct process_info *proc, struct raw_breakpoint *todel)
- {
- struct raw_breakpoint *bp, **bp_link;
- int ret;
- bp = proc->raw_breakpoints;
- bp_link = &proc->raw_breakpoints;
- while (bp)
- {
- if (bp == todel)
- {
- if (bp->inserted > 0)
- {
- struct raw_breakpoint *prev_bp_link = *bp_link;
- *bp_link = bp->next;
- ret = the_target->remove_point (bp->raw_type, bp->pc, bp->size,
- bp);
- if (ret != 0)
- {
-
- *bp_link = prev_bp_link;
- if (debug_threads)
- debug_printf ("Failed to uninsert raw breakpoint "
- "at 0x%s while deleting it.\n",
- paddress (bp->pc));
- return ret;
- }
- }
- else
- *bp_link = bp->next;
- free (bp);
- return 0;
- }
- else
- {
- bp_link = &bp->next;
- bp = *bp_link;
- }
- }
- warning ("Could not find raw breakpoint in list.");
- return ENOENT;
- }
- static int
- release_breakpoint (struct process_info *proc, struct breakpoint *bp)
- {
- int newrefcount;
- int ret;
- newrefcount = bp->raw->refcount - 1;
- if (newrefcount == 0)
- {
- ret = delete_raw_breakpoint (proc, bp->raw);
- if (ret != 0)
- return ret;
- }
- else
- bp->raw->refcount = newrefcount;
- free (bp);
- return 0;
- }
- static int
- delete_breakpoint_1 (struct process_info *proc, struct breakpoint *todel)
- {
- struct breakpoint *bp, **bp_link;
- int err;
- bp = proc->breakpoints;
- bp_link = &proc->breakpoints;
- while (bp)
- {
- if (bp == todel)
- {
- *bp_link = bp->next;
- err = release_breakpoint (proc, bp);
- if (err != 0)
- return err;
- bp = *bp_link;
- return 0;
- }
- else
- {
- bp_link = &bp->next;
- bp = *bp_link;
- }
- }
- warning ("Could not find breakpoint in list.");
- return ENOENT;
- }
- int
- delete_breakpoint (struct breakpoint *todel)
- {
- struct process_info *proc = current_process ();
- return delete_breakpoint_1 (proc, todel);
- }
- static struct breakpoint *
- find_gdb_breakpoint (char z_type, CORE_ADDR addr, int size)
- {
- struct process_info *proc = current_process ();
- struct breakpoint *bp;
- enum bkpt_type type = Z_packet_to_bkpt_type (z_type);
- for (bp = proc->breakpoints; bp != NULL; bp = bp->next)
- if (bp->type == type && bp->raw->pc == addr
- && (size == -1 || bp->raw->size == size))
- return bp;
- return NULL;
- }
- static int
- z_type_supported (char z_type)
- {
- return (z_type >= '0' && z_type <= '4'
- && the_target->supports_z_point_type != NULL
- && the_target->supports_z_point_type (z_type));
- }
- static struct breakpoint *
- set_gdb_breakpoint_1 (char z_type, CORE_ADDR addr, int size, int *err)
- {
- struct breakpoint *bp;
- enum bkpt_type type;
- enum raw_bkpt_type raw_type;
-
- if (z_type == Z_PACKET_SW_BP
- || z_type == Z_PACKET_HW_BP)
- {
- bp = find_gdb_breakpoint (z_type, addr, -1);
- if (bp != NULL)
- {
- if (bp->raw->size != size)
- {
-
- bp->raw->inserted = -1;
- delete_breakpoint (bp);
- bp = NULL;
- }
- else if (z_type == Z_PACKET_SW_BP)
- {
-
- validate_breakpoints ();
-
- bp = find_gdb_breakpoint (z_type, addr, -1);
- }
- }
- }
- else
- {
-
- bp = find_gdb_breakpoint (z_type, addr, size);
- }
- if (bp != NULL)
- {
-
- return bp;
- }
- raw_type = Z_packet_to_raw_bkpt_type (z_type);
- type = Z_packet_to_bkpt_type (z_type);
- return set_breakpoint (type, raw_type, addr, size, NULL, err);
- }
- static int
- check_gdb_bp_preconditions (char z_type, int *err)
- {
-
- if (!z_type_supported (z_type))
- {
- *err = 1;
- return 0;
- }
- else if (current_thread == NULL)
- {
- *err = -1;
- return 0;
- }
- else
- return 1;
- }
- struct breakpoint *
- set_gdb_breakpoint (char z_type, CORE_ADDR addr, int size, int *err)
- {
- struct breakpoint *bp;
- if (!check_gdb_bp_preconditions (z_type, err))
- return NULL;
-
- if (z_type == Z_PACKET_SW_BP)
- {
- *err = prepare_to_access_memory ();
- if (*err != 0)
- return NULL;
- }
- bp = set_gdb_breakpoint_1 (z_type, addr, size, err);
- if (z_type == Z_PACKET_SW_BP)
- done_accessing_memory ();
- return bp;
- }
- static int
- delete_gdb_breakpoint_1 (char z_type, CORE_ADDR addr, int size)
- {
- struct breakpoint *bp;
- int err;
- bp = find_gdb_breakpoint (z_type, addr, size);
- if (bp == NULL)
- return -1;
-
- clear_breakpoint_conditions_and_commands (bp);
- err = delete_breakpoint (bp);
- if (err != 0)
- return -1;
- return 0;
- }
- int
- delete_gdb_breakpoint (char z_type, CORE_ADDR addr, int size)
- {
- int ret;
- if (!check_gdb_bp_preconditions (z_type, &ret))
- return ret;
-
- if (z_type == Z_PACKET_SW_BP)
- {
- int err;
- err = prepare_to_access_memory ();
- if (err != 0)
- return -1;
- }
- ret = delete_gdb_breakpoint_1 (z_type, addr, size);
- if (z_type == Z_PACKET_SW_BP)
- done_accessing_memory ();
- return ret;
- }
- static void
- clear_breakpoint_conditions (struct breakpoint *bp)
- {
- struct point_cond_list *cond;
- if (bp->cond_list == NULL)
- return;
- cond = bp->cond_list;
- while (cond != NULL)
- {
- struct point_cond_list *cond_next;
- cond_next = cond->next;
- gdb_free_agent_expr (cond->cond);
- free (cond);
- cond = cond_next;
- }
- bp->cond_list = NULL;
- }
- static void
- clear_breakpoint_commands (struct breakpoint *bp)
- {
- struct point_command_list *cmd;
- if (bp->command_list == NULL)
- return;
- cmd = bp->command_list;
- while (cmd != NULL)
- {
- struct point_command_list *cmd_next;
- cmd_next = cmd->next;
- gdb_free_agent_expr (cmd->cmd);
- free (cmd);
- cmd = cmd_next;
- }
- bp->command_list = NULL;
- }
- void
- clear_breakpoint_conditions_and_commands (struct breakpoint *bp)
- {
- clear_breakpoint_conditions (bp);
- clear_breakpoint_commands (bp);
- }
- static void
- add_condition_to_breakpoint (struct breakpoint *bp,
- struct agent_expr *condition)
- {
- struct point_cond_list *new_cond;
-
- new_cond = xcalloc (1, sizeof (*new_cond));
- new_cond->cond = condition;
-
- new_cond->next = bp->cond_list;
- bp->cond_list = new_cond;
- }
- int
- add_breakpoint_condition (struct breakpoint *bp, char **condition)
- {
- char *actparm = *condition;
- struct agent_expr *cond;
- if (condition == NULL)
- return 1;
- if (bp == NULL)
- return 0;
- cond = gdb_parse_agent_expr (&actparm);
- if (cond == NULL)
- {
- fprintf (stderr, "Condition evaluation failed. "
- "Assuming unconditional.\n");
- return 0;
- }
- add_condition_to_breakpoint (bp, cond);
- *condition = actparm;
- return 1;
- }
- static int
- gdb_condition_true_at_breakpoint_z_type (char z_type, CORE_ADDR addr)
- {
-
- struct breakpoint *bp = find_gdb_breakpoint (z_type, addr, -1);
- ULONGEST value = 0;
- struct point_cond_list *cl;
- int err = 0;
- struct eval_agent_expr_context ctx;
- if (bp == NULL)
- return 0;
-
- if (bp->cond_list == NULL)
- return 1;
- ctx.regcache = get_thread_regcache (current_thread, 1);
- ctx.tframe = NULL;
- ctx.tpoint = NULL;
-
- for (cl = bp->cond_list;
- cl && !value && !err; cl = cl->next)
- {
-
- err = gdb_eval_agent_expr (&ctx, cl->cond, &value);
- }
- if (err)
- return 1;
- return (value != 0);
- }
- int
- gdb_condition_true_at_breakpoint (CORE_ADDR where)
- {
-
- return (gdb_condition_true_at_breakpoint_z_type (Z_PACKET_SW_BP, where)
- || gdb_condition_true_at_breakpoint_z_type (Z_PACKET_HW_BP, where));
- }
- void
- add_commands_to_breakpoint (struct breakpoint *bp,
- struct agent_expr *commands, int persist)
- {
- struct point_command_list *new_cmd;
-
- new_cmd = xcalloc (1, sizeof (*new_cmd));
- new_cmd->cmd = commands;
- new_cmd->persistence = persist;
-
- new_cmd->next = bp->command_list;
- bp->command_list = new_cmd;
- }
- int
- add_breakpoint_commands (struct breakpoint *bp, char **command,
- int persist)
- {
- char *actparm = *command;
- struct agent_expr *cmd;
- if (command == NULL)
- return 1;
- if (bp == NULL)
- return 0;
- cmd = gdb_parse_agent_expr (&actparm);
- if (cmd == NULL)
- {
- fprintf (stderr, "Command evaluation failed. "
- "Disabling.\n");
- return 0;
- }
- add_commands_to_breakpoint (bp, cmd, persist);
- *command = actparm;
- return 1;
- }
- static int
- gdb_no_commands_at_breakpoint_z_type (char z_type, CORE_ADDR addr)
- {
- struct breakpoint *bp = find_gdb_breakpoint (z_type, addr, -1);
- if (bp == NULL)
- return 1;
- if (debug_threads)
- debug_printf ("at 0x%s, type Z%c, bp command_list is 0x%s\n",
- paddress (addr), z_type,
- phex_nz ((uintptr_t) bp->command_list, 0));
- return (bp->command_list == NULL);
- }
- int
- gdb_no_commands_at_breakpoint (CORE_ADDR where)
- {
-
- return (gdb_no_commands_at_breakpoint_z_type (Z_PACKET_SW_BP, where)
- && gdb_no_commands_at_breakpoint_z_type (Z_PACKET_HW_BP, where));
- }
- static int
- run_breakpoint_commands_z_type (char z_type, CORE_ADDR addr)
- {
-
- struct breakpoint *bp = find_gdb_breakpoint (z_type, addr, -1);
- ULONGEST value = 0;
- struct point_command_list *cl;
- int err = 0;
- struct eval_agent_expr_context ctx;
- if (bp == NULL)
- return 1;
- ctx.regcache = get_thread_regcache (current_thread, 1);
- ctx.tframe = NULL;
- ctx.tpoint = NULL;
- for (cl = bp->command_list;
- cl && !value && !err; cl = cl->next)
- {
-
- err = gdb_eval_agent_expr (&ctx, cl->cmd, &value);
-
- if (err)
- return 0;
- }
- return 1;
- }
- void
- run_breakpoint_commands (CORE_ADDR where)
- {
-
- if (run_breakpoint_commands_z_type (Z_PACKET_SW_BP, where))
- run_breakpoint_commands_z_type (Z_PACKET_HW_BP, where);
- }
- int
- gdb_breakpoint_here (CORE_ADDR where)
- {
-
- return (find_gdb_breakpoint (Z_PACKET_SW_BP, where, -1) != NULL
- || find_gdb_breakpoint (Z_PACKET_HW_BP, where, -1) != NULL);
- }
- void
- set_reinsert_breakpoint (CORE_ADDR stop_at)
- {
- struct breakpoint *bp;
- bp = set_breakpoint_at (stop_at, NULL);
- bp->type = reinsert_breakpoint;
- }
- void
- delete_reinsert_breakpoints (void)
- {
- struct process_info *proc = current_process ();
- struct breakpoint *bp, **bp_link;
- bp = proc->breakpoints;
- bp_link = &proc->breakpoints;
- while (bp)
- {
- if (bp->type == reinsert_breakpoint)
- {
- *bp_link = bp->next;
- release_breakpoint (proc, bp);
- bp = *bp_link;
- }
- else
- {
- bp_link = &bp->next;
- bp = *bp_link;
- }
- }
- }
- static void
- uninsert_raw_breakpoint (struct raw_breakpoint *bp)
- {
- if (bp->inserted < 0)
- {
- if (debug_threads)
- debug_printf ("Breakpoint at %s is marked insert-disabled.\n",
- paddress (bp->pc));
- }
- else if (bp->inserted > 0)
- {
- int err;
- bp->inserted = 0;
- err = the_target->remove_point (bp->raw_type, bp->pc, bp->size, bp);
- if (err != 0)
- {
- bp->inserted = 1;
- if (debug_threads)
- debug_printf ("Failed to uninsert raw breakpoint at 0x%s.\n",
- paddress (bp->pc));
- }
- }
- }
- void
- uninsert_breakpoints_at (CORE_ADDR pc)
- {
- struct process_info *proc = current_process ();
- struct raw_breakpoint *bp;
- int found = 0;
- for (bp = proc->raw_breakpoints; bp != NULL; bp = bp->next)
- if ((bp->raw_type == raw_bkpt_type_sw
- || bp->raw_type == raw_bkpt_type_hw)
- && bp->pc == pc)
- {
- found = 1;
- if (bp->inserted)
- uninsert_raw_breakpoint (bp);
- }
- if (!found)
- {
-
- if (debug_threads)
- debug_printf ("Could not find breakpoint at 0x%s "
- "in list (uninserting).\n",
- paddress (pc));
- }
- }
- void
- uninsert_all_breakpoints (void)
- {
- struct process_info *proc = current_process ();
- struct raw_breakpoint *bp;
- for (bp = proc->raw_breakpoints; bp != NULL; bp = bp->next)
- if ((bp->raw_type == raw_bkpt_type_sw
- || bp->raw_type == raw_bkpt_type_hw)
- && bp->inserted)
- uninsert_raw_breakpoint (bp);
- }
- static void
- reinsert_raw_breakpoint (struct raw_breakpoint *bp)
- {
- int err;
- if (bp->inserted)
- error ("Breakpoint already inserted at reinsert time.");
- err = the_target->insert_point (bp->raw_type, bp->pc, bp->size, bp);
- if (err == 0)
- bp->inserted = 1;
- else if (debug_threads)
- debug_printf ("Failed to reinsert breakpoint at 0x%s (%d).\n",
- paddress (bp->pc), err);
- }
- void
- reinsert_breakpoints_at (CORE_ADDR pc)
- {
- struct process_info *proc = current_process ();
- struct raw_breakpoint *bp;
- int found = 0;
- for (bp = proc->raw_breakpoints; bp != NULL; bp = bp->next)
- if ((bp->raw_type == raw_bkpt_type_sw
- || bp->raw_type == raw_bkpt_type_hw)
- && bp->pc == pc)
- {
- found = 1;
- reinsert_raw_breakpoint (bp);
- }
- if (!found)
- {
-
- if (debug_threads)
- debug_printf ("Could not find raw breakpoint at 0x%s "
- "in list (reinserting).\n",
- paddress (pc));
- }
- }
- void
- reinsert_all_breakpoints (void)
- {
- struct process_info *proc = current_process ();
- struct raw_breakpoint *bp;
- for (bp = proc->raw_breakpoints; bp != NULL; bp = bp->next)
- if ((bp->raw_type == raw_bkpt_type_sw
- || bp->raw_type == raw_bkpt_type_hw)
- && !bp->inserted)
- reinsert_raw_breakpoint (bp);
- }
- void
- check_breakpoints (CORE_ADDR stop_pc)
- {
- struct process_info *proc = current_process ();
- struct breakpoint *bp, **bp_link;
- bp = proc->breakpoints;
- bp_link = &proc->breakpoints;
- while (bp)
- {
- struct raw_breakpoint *raw = bp->raw;
- if ((raw->raw_type == raw_bkpt_type_sw
- || raw->raw_type == raw_bkpt_type_hw)
- && raw->pc == stop_pc)
- {
- if (!raw->inserted)
- {
- warning ("Hit a removed breakpoint?");
- return;
- }
- if (bp->handler != NULL && (*bp->handler) (stop_pc))
- {
- *bp_link = bp->next;
- release_breakpoint (proc, bp);
- bp = *bp_link;
- continue;
- }
- }
- bp_link = &bp->next;
- bp = *bp_link;
- }
- }
- void
- set_breakpoint_data (const unsigned char *bp_data, int bp_len)
- {
- breakpoint_data = bp_data;
- breakpoint_len = bp_len;
- }
- int
- breakpoint_here (CORE_ADDR addr)
- {
- struct process_info *proc = current_process ();
- struct raw_breakpoint *bp;
- for (bp = proc->raw_breakpoints; bp != NULL; bp = bp->next)
- if ((bp->raw_type == raw_bkpt_type_sw
- || bp->raw_type == raw_bkpt_type_hw)
- && bp->pc == addr)
- return 1;
- return 0;
- }
- int
- breakpoint_inserted_here (CORE_ADDR addr)
- {
- struct process_info *proc = current_process ();
- struct raw_breakpoint *bp;
- for (bp = proc->raw_breakpoints; bp != NULL; bp = bp->next)
- if ((bp->raw_type == raw_bkpt_type_sw
- || bp->raw_type == raw_bkpt_type_hw)
- && bp->pc == addr
- && bp->inserted)
- return 1;
- return 0;
- }
- int
- software_breakpoint_inserted_here (CORE_ADDR addr)
- {
- struct process_info *proc = current_process ();
- struct raw_breakpoint *bp;
- for (bp = proc->raw_breakpoints; bp != NULL; bp = bp->next)
- if (bp->raw_type == raw_bkpt_type_sw
- && bp->pc == addr
- && bp->inserted)
- return 1;
- return 0;
- }
- int
- hardware_breakpoint_inserted_here (CORE_ADDR addr)
- {
- struct process_info *proc = current_process ();
- struct raw_breakpoint *bp;
- for (bp = proc->raw_breakpoints; bp != NULL; bp = bp->next)
- if (bp->raw_type == raw_bkpt_type_hw
- && bp->pc == addr
- && bp->inserted)
- return 1;
- return 0;
- }
- static int
- validate_inserted_breakpoint (struct raw_breakpoint *bp)
- {
- unsigned char *buf;
- int err;
- gdb_assert (bp->inserted);
- gdb_assert (bp->raw_type == raw_bkpt_type_sw);
- buf = alloca (breakpoint_len);
- err = (*the_target->read_memory) (bp->pc, buf, breakpoint_len);
- if (err || memcmp (buf, breakpoint_data, breakpoint_len) != 0)
- {
-
- bp->inserted = -1;
- return 0;
- }
- return 1;
- }
- static void
- delete_disabled_breakpoints (void)
- {
- struct process_info *proc = current_process ();
- struct breakpoint *bp, *next;
- for (bp = proc->breakpoints; bp != NULL; bp = next)
- {
- next = bp->next;
- if (bp->raw->inserted < 0)
- delete_breakpoint_1 (proc, bp);
- }
- }
- void
- validate_breakpoints (void)
- {
- struct process_info *proc = current_process ();
- struct breakpoint *bp;
- for (bp = proc->breakpoints; bp != NULL; bp = bp->next)
- {
- struct raw_breakpoint *raw = bp->raw;
- if (raw->raw_type == raw_bkpt_type_sw && raw->inserted > 0)
- validate_inserted_breakpoint (raw);
- }
- delete_disabled_breakpoints ();
- }
- void
- check_mem_read (CORE_ADDR mem_addr, unsigned char *buf, int mem_len)
- {
- struct process_info *proc = current_process ();
- struct raw_breakpoint *bp = proc->raw_breakpoints;
- struct fast_tracepoint_jump *jp = proc->fast_tracepoint_jumps;
- CORE_ADDR mem_end = mem_addr + mem_len;
- int disabled_one = 0;
- for (; jp != NULL; jp = jp->next)
- {
- CORE_ADDR bp_end = jp->pc + jp->length;
- CORE_ADDR start, end;
- int copy_offset, copy_len, buf_offset;
- gdb_assert (fast_tracepoint_jump_shadow (jp) >= buf + mem_len
- || buf >= fast_tracepoint_jump_shadow (jp) + (jp)->length);
- if (mem_addr >= bp_end)
- continue;
- if (jp->pc >= mem_end)
- continue;
- start = jp->pc;
- if (mem_addr > start)
- start = mem_addr;
- end = bp_end;
- if (end > mem_end)
- end = mem_end;
- copy_len = end - start;
- copy_offset = start - jp->pc;
- buf_offset = start - mem_addr;
- if (jp->inserted)
- memcpy (buf + buf_offset,
- fast_tracepoint_jump_shadow (jp) + copy_offset,
- copy_len);
- }
- for (; bp != NULL; bp = bp->next)
- {
- CORE_ADDR bp_end = bp->pc + breakpoint_len;
- CORE_ADDR start, end;
- int copy_offset, copy_len, buf_offset;
- if (bp->raw_type != raw_bkpt_type_sw)
- continue;
- gdb_assert (bp->old_data >= buf + mem_len
- || buf >= &bp->old_data[sizeof (bp->old_data)]);
- if (mem_addr >= bp_end)
- continue;
- if (bp->pc >= mem_end)
- continue;
- start = bp->pc;
- if (mem_addr > start)
- start = mem_addr;
- end = bp_end;
- if (end > mem_end)
- end = mem_end;
- copy_len = end - start;
- copy_offset = start - bp->pc;
- buf_offset = start - mem_addr;
- if (bp->inserted > 0)
- {
- if (validate_inserted_breakpoint (bp))
- memcpy (buf + buf_offset, bp->old_data + copy_offset, copy_len);
- else
- disabled_one = 1;
- }
- }
- if (disabled_one)
- delete_disabled_breakpoints ();
- }
- void
- check_mem_write (CORE_ADDR mem_addr, unsigned char *buf,
- const unsigned char *myaddr, int mem_len)
- {
- struct process_info *proc = current_process ();
- struct raw_breakpoint *bp = proc->raw_breakpoints;
- struct fast_tracepoint_jump *jp = proc->fast_tracepoint_jumps;
- CORE_ADDR mem_end = mem_addr + mem_len;
- int disabled_one = 0;
-
- for (; jp != NULL; jp = jp->next)
- {
- CORE_ADDR jp_end = jp->pc + jp->length;
- CORE_ADDR start, end;
- int copy_offset, copy_len, buf_offset;
- gdb_assert (fast_tracepoint_jump_shadow (jp) >= myaddr + mem_len
- || myaddr >= fast_tracepoint_jump_shadow (jp) + (jp)->length);
- gdb_assert (fast_tracepoint_jump_insn (jp) >= buf + mem_len
- || buf >= fast_tracepoint_jump_insn (jp) + (jp)->length);
- if (mem_addr >= jp_end)
- continue;
- if (jp->pc >= mem_end)
- continue;
- start = jp->pc;
- if (mem_addr > start)
- start = mem_addr;
- end = jp_end;
- if (end > mem_end)
- end = mem_end;
- copy_len = end - start;
- copy_offset = start - jp->pc;
- buf_offset = start - mem_addr;
- memcpy (fast_tracepoint_jump_shadow (jp) + copy_offset,
- myaddr + buf_offset, copy_len);
- if (jp->inserted)
- memcpy (buf + buf_offset,
- fast_tracepoint_jump_insn (jp) + copy_offset, copy_len);
- }
- for (; bp != NULL; bp = bp->next)
- {
- CORE_ADDR bp_end = bp->pc + breakpoint_len;
- CORE_ADDR start, end;
- int copy_offset, copy_len, buf_offset;
- if (bp->raw_type != raw_bkpt_type_sw)
- continue;
- gdb_assert (bp->old_data >= myaddr + mem_len
- || myaddr >= &bp->old_data[sizeof (bp->old_data)]);
- if (mem_addr >= bp_end)
- continue;
- if (bp->pc >= mem_end)
- continue;
- start = bp->pc;
- if (mem_addr > start)
- start = mem_addr;
- end = bp_end;
- if (end > mem_end)
- end = mem_end;
- copy_len = end - start;
- copy_offset = start - bp->pc;
- buf_offset = start - mem_addr;
- memcpy (bp->old_data + copy_offset, myaddr + buf_offset, copy_len);
- if (bp->inserted > 0)
- {
- if (validate_inserted_breakpoint (bp))
- memcpy (buf + buf_offset, breakpoint_data + copy_offset, copy_len);
- else
- disabled_one = 1;
- }
- }
- if (disabled_one)
- delete_disabled_breakpoints ();
- }
- void
- delete_all_breakpoints (void)
- {
- struct process_info *proc = current_process ();
- while (proc->breakpoints)
- delete_breakpoint_1 (proc, proc->breakpoints);
- }
- void
- mark_breakpoints_out (struct process_info *proc)
- {
- struct raw_breakpoint *raw_bp;
- for (raw_bp = proc->raw_breakpoints; raw_bp != NULL; raw_bp = raw_bp->next)
- raw_bp->inserted = 0;
- }
- void
- free_all_breakpoints (struct process_info *proc)
- {
- mark_breakpoints_out (proc);
-
- while (proc->breakpoints)
- delete_breakpoint_1 (proc, proc->breakpoints);
- }