|
@@ -42,7 +42,7 @@ const char *filename;
|
|
const char *argv0;
|
|
const char *argv0;
|
|
int gdbstub_port;
|
|
int gdbstub_port;
|
|
envlist_t *envlist;
|
|
envlist_t *envlist;
|
|
-const char *cpu_model;
|
|
|
|
|
|
+static const char *cpu_model;
|
|
unsigned long mmap_min_addr;
|
|
unsigned long mmap_min_addr;
|
|
#if defined(CONFIG_USE_GUEST_BASE)
|
|
#if defined(CONFIG_USE_GUEST_BASE)
|
|
unsigned long guest_base;
|
|
unsigned long guest_base;
|
|
@@ -3285,6 +3285,37 @@ void init_task_state(TaskState *ts)
|
|
ts->sigqueue_table[i].next = NULL;
|
|
ts->sigqueue_table[i].next = NULL;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+CPUArchState *cpu_copy(CPUArchState *env)
|
|
|
|
+{
|
|
|
|
+ CPUArchState *new_env = cpu_init(cpu_model);
|
|
|
|
+#if defined(TARGET_HAS_ICE)
|
|
|
|
+ CPUBreakpoint *bp;
|
|
|
|
+ CPUWatchpoint *wp;
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+ /* Reset non arch specific state */
|
|
|
|
+ cpu_reset(ENV_GET_CPU(new_env));
|
|
|
|
+
|
|
|
|
+ memcpy(new_env, env, sizeof(CPUArchState));
|
|
|
|
+
|
|
|
|
+ /* Clone all break/watchpoints.
|
|
|
|
+ Note: Once we support ptrace with hw-debug register access, make sure
|
|
|
|
+ BP_CPU break/watchpoints are handled correctly on clone. */
|
|
|
|
+ QTAILQ_INIT(&env->breakpoints);
|
|
|
|
+ QTAILQ_INIT(&env->watchpoints);
|
|
|
|
+#if defined(TARGET_HAS_ICE)
|
|
|
|
+ QTAILQ_FOREACH(bp, &env->breakpoints, entry) {
|
|
|
|
+ cpu_breakpoint_insert(new_env, bp->pc, bp->flags, NULL);
|
|
|
|
+ }
|
|
|
|
+ QTAILQ_FOREACH(wp, &env->watchpoints, entry) {
|
|
|
|
+ cpu_watchpoint_insert(new_env, wp->vaddr, (~wp->len_mask) + 1,
|
|
|
|
+ wp->flags, NULL);
|
|
|
|
+ }
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+ return new_env;
|
|
|
|
+}
|
|
|
|
+
|
|
static void handle_arg_help(const char *arg)
|
|
static void handle_arg_help(const char *arg)
|
|
{
|
|
{
|
|
usage();
|
|
usage();
|