exec: Change cpu_breakpoint_{insert,remove{,_by_ref,_all}} argument
Use CPUState. Allows to clean up CPUArchState in gdbstub. Signed-off-by: Andreas Färber <afaerber@suse.de>
This commit is contained in:
		
							parent
							
								
									75a34036d4
								
							
						
					
					
						commit
						b3310ab338
					
				
							
								
								
									
										20
									
								
								exec.c
								
								
								
								
							
							
						
						
									
										20
									
								
								exec.c
								
								
								
								
							| 
						 | 
				
			
			@ -617,11 +617,10 @@ void cpu_watchpoint_remove_all(CPUState *cpu, int mask)
 | 
			
		|||
#endif
 | 
			
		||||
 | 
			
		||||
/* Add a breakpoint.  */
 | 
			
		||||
int cpu_breakpoint_insert(CPUArchState *env, target_ulong pc, int flags,
 | 
			
		||||
int cpu_breakpoint_insert(CPUState *cpu, vaddr pc, int flags,
 | 
			
		||||
                          CPUBreakpoint **breakpoint)
 | 
			
		||||
{
 | 
			
		||||
#if defined(TARGET_HAS_ICE)
 | 
			
		||||
    CPUState *cpu = ENV_GET_CPU(env);
 | 
			
		||||
    CPUBreakpoint *bp;
 | 
			
		||||
 | 
			
		||||
    bp = g_malloc(sizeof(*bp));
 | 
			
		||||
| 
						 | 
				
			
			@ -648,15 +647,14 @@ int cpu_breakpoint_insert(CPUArchState *env, target_ulong pc, int flags,
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
/* Remove a specific breakpoint.  */
 | 
			
		||||
int cpu_breakpoint_remove(CPUArchState *env, target_ulong pc, int flags)
 | 
			
		||||
int cpu_breakpoint_remove(CPUState *cpu, vaddr pc, int flags)
 | 
			
		||||
{
 | 
			
		||||
#if defined(TARGET_HAS_ICE)
 | 
			
		||||
    CPUState *cpu = ENV_GET_CPU(env);
 | 
			
		||||
    CPUBreakpoint *bp;
 | 
			
		||||
 | 
			
		||||
    QTAILQ_FOREACH(bp, &cpu->breakpoints, entry) {
 | 
			
		||||
        if (bp->pc == pc && bp->flags == flags) {
 | 
			
		||||
            cpu_breakpoint_remove_by_ref(env, bp);
 | 
			
		||||
            cpu_breakpoint_remove_by_ref(cpu, bp);
 | 
			
		||||
            return 0;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -667,11 +665,9 @@ int cpu_breakpoint_remove(CPUArchState *env, target_ulong pc, int flags)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
/* Remove a specific breakpoint by reference.  */
 | 
			
		||||
void cpu_breakpoint_remove_by_ref(CPUArchState *env, CPUBreakpoint *breakpoint)
 | 
			
		||||
void cpu_breakpoint_remove_by_ref(CPUState *cpu, CPUBreakpoint *breakpoint)
 | 
			
		||||
{
 | 
			
		||||
#if defined(TARGET_HAS_ICE)
 | 
			
		||||
    CPUState *cpu = ENV_GET_CPU(env);
 | 
			
		||||
 | 
			
		||||
    QTAILQ_REMOVE(&cpu->breakpoints, breakpoint, entry);
 | 
			
		||||
 | 
			
		||||
    breakpoint_invalidate(cpu, breakpoint->pc);
 | 
			
		||||
| 
						 | 
				
			
			@ -681,15 +677,15 @@ void cpu_breakpoint_remove_by_ref(CPUArchState *env, CPUBreakpoint *breakpoint)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
/* Remove all matching breakpoints. */
 | 
			
		||||
void cpu_breakpoint_remove_all(CPUArchState *env, int mask)
 | 
			
		||||
void cpu_breakpoint_remove_all(CPUState *cpu, int mask)
 | 
			
		||||
{
 | 
			
		||||
#if defined(TARGET_HAS_ICE)
 | 
			
		||||
    CPUState *cpu = ENV_GET_CPU(env);
 | 
			
		||||
    CPUBreakpoint *bp, *next;
 | 
			
		||||
 | 
			
		||||
    QTAILQ_FOREACH_SAFE(bp, &cpu->breakpoints, entry, next) {
 | 
			
		||||
        if (bp->flags & mask)
 | 
			
		||||
            cpu_breakpoint_remove_by_ref(env, bp);
 | 
			
		||||
        if (bp->flags & mask) {
 | 
			
		||||
            cpu_breakpoint_remove_by_ref(cpu, bp);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										20
									
								
								gdbstub.c
								
								
								
								
							
							
						
						
									
										20
									
								
								gdbstub.c
								
								
								
								
							| 
						 | 
				
			
			@ -635,7 +635,6 @@ static const int xlat_gdb_type[] = {
 | 
			
		|||
static int gdb_breakpoint_insert(target_ulong addr, target_ulong len, int type)
 | 
			
		||||
{
 | 
			
		||||
    CPUState *cpu;
 | 
			
		||||
    CPUArchState *env;
 | 
			
		||||
    int err = 0;
 | 
			
		||||
 | 
			
		||||
    if (kvm_enabled()) {
 | 
			
		||||
| 
						 | 
				
			
			@ -646,10 +645,10 @@ static int gdb_breakpoint_insert(target_ulong addr, target_ulong len, int type)
 | 
			
		|||
    case GDB_BREAKPOINT_SW:
 | 
			
		||||
    case GDB_BREAKPOINT_HW:
 | 
			
		||||
        CPU_FOREACH(cpu) {
 | 
			
		||||
            env = cpu->env_ptr;
 | 
			
		||||
            err = cpu_breakpoint_insert(env, addr, BP_GDB, NULL);
 | 
			
		||||
            if (err)
 | 
			
		||||
            err = cpu_breakpoint_insert(cpu, addr, BP_GDB, NULL);
 | 
			
		||||
            if (err) {
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return err;
 | 
			
		||||
#ifndef CONFIG_USER_ONLY
 | 
			
		||||
| 
						 | 
				
			
			@ -672,7 +671,6 @@ static int gdb_breakpoint_insert(target_ulong addr, target_ulong len, int type)
 | 
			
		|||
static int gdb_breakpoint_remove(target_ulong addr, target_ulong len, int type)
 | 
			
		||||
{
 | 
			
		||||
    CPUState *cpu;
 | 
			
		||||
    CPUArchState *env;
 | 
			
		||||
    int err = 0;
 | 
			
		||||
 | 
			
		||||
    if (kvm_enabled()) {
 | 
			
		||||
| 
						 | 
				
			
			@ -683,10 +681,10 @@ static int gdb_breakpoint_remove(target_ulong addr, target_ulong len, int type)
 | 
			
		|||
    case GDB_BREAKPOINT_SW:
 | 
			
		||||
    case GDB_BREAKPOINT_HW:
 | 
			
		||||
        CPU_FOREACH(cpu) {
 | 
			
		||||
            env = cpu->env_ptr;
 | 
			
		||||
            err = cpu_breakpoint_remove(env, addr, BP_GDB);
 | 
			
		||||
            if (err)
 | 
			
		||||
            err = cpu_breakpoint_remove(cpu, addr, BP_GDB);
 | 
			
		||||
            if (err) {
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return err;
 | 
			
		||||
#ifndef CONFIG_USER_ONLY
 | 
			
		||||
| 
						 | 
				
			
			@ -708,7 +706,6 @@ static int gdb_breakpoint_remove(target_ulong addr, target_ulong len, int type)
 | 
			
		|||
static void gdb_breakpoint_remove_all(void)
 | 
			
		||||
{
 | 
			
		||||
    CPUState *cpu;
 | 
			
		||||
    CPUArchState *env;
 | 
			
		||||
 | 
			
		||||
    if (kvm_enabled()) {
 | 
			
		||||
        kvm_remove_all_breakpoints(gdbserver_state->c_cpu);
 | 
			
		||||
| 
						 | 
				
			
			@ -716,8 +713,7 @@ static void gdb_breakpoint_remove_all(void)
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    CPU_FOREACH(cpu) {
 | 
			
		||||
        env = cpu->env_ptr;
 | 
			
		||||
        cpu_breakpoint_remove_all(env, BP_GDB);
 | 
			
		||||
        cpu_breakpoint_remove_all(cpu, BP_GDB);
 | 
			
		||||
#ifndef CONFIG_USER_ONLY
 | 
			
		||||
        cpu_watchpoint_remove_all(cpu, BP_GDB);
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -1599,7 +1595,7 @@ void gdbserver_fork(CPUArchState *env)
 | 
			
		|||
    }
 | 
			
		||||
    close(s->fd);
 | 
			
		||||
    s->fd = -1;
 | 
			
		||||
    cpu_breakpoint_remove_all(env, BP_GDB);
 | 
			
		||||
    cpu_breakpoint_remove_all(cpu, BP_GDB);
 | 
			
		||||
    cpu_watchpoint_remove_all(cpu, BP_GDB);
 | 
			
		||||
}
 | 
			
		||||
#else
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -413,21 +413,6 @@ void QEMU_NORETURN cpu_abort(CPUArchState *env, const char *fmt, ...)
 | 
			
		|||
     | CPU_INTERRUPT_TGT_EXT_3   \
 | 
			
		||||
     | CPU_INTERRUPT_TGT_EXT_4)
 | 
			
		||||
 | 
			
		||||
/* Breakpoint/watchpoint flags */
 | 
			
		||||
#define BP_MEM_READ           0x01
 | 
			
		||||
#define BP_MEM_WRITE          0x02
 | 
			
		||||
#define BP_MEM_ACCESS         (BP_MEM_READ | BP_MEM_WRITE)
 | 
			
		||||
#define BP_STOP_BEFORE_ACCESS 0x04
 | 
			
		||||
#define BP_WATCHPOINT_HIT     0x08
 | 
			
		||||
#define BP_GDB                0x10
 | 
			
		||||
#define BP_CPU                0x20
 | 
			
		||||
 | 
			
		||||
int cpu_breakpoint_insert(CPUArchState *env, target_ulong pc, int flags,
 | 
			
		||||
                          CPUBreakpoint **breakpoint);
 | 
			
		||||
int cpu_breakpoint_remove(CPUArchState *env, target_ulong pc, int flags);
 | 
			
		||||
void cpu_breakpoint_remove_by_ref(CPUArchState *env, CPUBreakpoint *breakpoint);
 | 
			
		||||
void cpu_breakpoint_remove_all(CPUArchState *env, int mask);
 | 
			
		||||
 | 
			
		||||
#if !defined(CONFIG_USER_ONLY)
 | 
			
		||||
 | 
			
		||||
/* memory API */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -595,6 +595,21 @@ void qemu_init_vcpu(CPUState *cpu);
 | 
			
		|||
 */
 | 
			
		||||
void cpu_single_step(CPUState *cpu, int enabled);
 | 
			
		||||
 | 
			
		||||
/* Breakpoint/watchpoint flags */
 | 
			
		||||
#define BP_MEM_READ           0x01
 | 
			
		||||
#define BP_MEM_WRITE          0x02
 | 
			
		||||
#define BP_MEM_ACCESS         (BP_MEM_READ | BP_MEM_WRITE)
 | 
			
		||||
#define BP_STOP_BEFORE_ACCESS 0x04
 | 
			
		||||
#define BP_WATCHPOINT_HIT     0x08
 | 
			
		||||
#define BP_GDB                0x10
 | 
			
		||||
#define BP_CPU                0x20
 | 
			
		||||
 | 
			
		||||
int cpu_breakpoint_insert(CPUState *cpu, vaddr pc, int flags,
 | 
			
		||||
                          CPUBreakpoint **breakpoint);
 | 
			
		||||
int cpu_breakpoint_remove(CPUState *cpu, vaddr pc, int flags);
 | 
			
		||||
void cpu_breakpoint_remove_by_ref(CPUState *cpu, CPUBreakpoint *breakpoint);
 | 
			
		||||
void cpu_breakpoint_remove_all(CPUState *cpu, int mask);
 | 
			
		||||
 | 
			
		||||
int cpu_watchpoint_insert(CPUState *cpu, vaddr addr, vaddr len,
 | 
			
		||||
                          int flags, CPUWatchpoint **watchpoint);
 | 
			
		||||
int cpu_watchpoint_remove(CPUState *cpu, vaddr addr,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3455,7 +3455,7 @@ CPUArchState *cpu_copy(CPUArchState *env)
 | 
			
		|||
    QTAILQ_INIT(&cpu->watchpoints);
 | 
			
		||||
#if defined(TARGET_HAS_ICE)
 | 
			
		||||
    QTAILQ_FOREACH(bp, &cpu->breakpoints, entry) {
 | 
			
		||||
        cpu_breakpoint_insert(new_env, bp->pc, bp->flags, NULL);
 | 
			
		||||
        cpu_breakpoint_insert(new_cpu, bp->pc, bp->flags, NULL);
 | 
			
		||||
    }
 | 
			
		||||
    QTAILQ_FOREACH(wp, &cpu->watchpoints, entry) {
 | 
			
		||||
        cpu_watchpoint_insert(new_cpu, wp->vaddr, (~wp->len_mask) + 1,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2473,7 +2473,7 @@ static void x86_cpu_reset(CPUState *s)
 | 
			
		|||
    memset(env->dr, 0, sizeof(env->dr));
 | 
			
		||||
    env->dr[6] = DR6_FIXED_1;
 | 
			
		||||
    env->dr[7] = DR7_FIXED_1;
 | 
			
		||||
    cpu_breakpoint_remove_all(env, BP_CPU);
 | 
			
		||||
    cpu_breakpoint_remove_all(s, BP_CPU);
 | 
			
		||||
    cpu_watchpoint_remove_all(s, BP_CPU);
 | 
			
		||||
 | 
			
		||||
    env->tsc_adjust = 0;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -999,7 +999,7 @@ void hw_breakpoint_insert(CPUX86State *env, int index)
 | 
			
		|||
    switch (hw_breakpoint_type(env->dr[7], index)) {
 | 
			
		||||
    case DR7_TYPE_BP_INST:
 | 
			
		||||
        if (hw_breakpoint_enabled(env->dr[7], index)) {
 | 
			
		||||
            err = cpu_breakpoint_insert(env, env->dr[index], BP_CPU,
 | 
			
		||||
            err = cpu_breakpoint_insert(cs, env->dr[index], BP_CPU,
 | 
			
		||||
                                        &env->cpu_breakpoint[index]);
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
| 
						 | 
				
			
			@ -1036,7 +1036,7 @@ void hw_breakpoint_remove(CPUX86State *env, int index)
 | 
			
		|||
    switch (hw_breakpoint_type(env->dr[7], index)) {
 | 
			
		||||
    case DR7_TYPE_BP_INST:
 | 
			
		||||
        if (hw_breakpoint_enabled(env->dr[7], index)) {
 | 
			
		||||
            cpu_breakpoint_remove_by_ref(env, env->cpu_breakpoint[index]);
 | 
			
		||||
            cpu_breakpoint_remove_by_ref(cs, env->cpu_breakpoint[index]);
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
    case DR7_TYPE_DATA_WR:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -320,7 +320,7 @@ static int cpu_post_load(void *opaque, int version_id)
 | 
			
		|||
        env->fptags[i] = (env->fptag_vmstate >> i) & 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    cpu_breakpoint_remove_all(env, BP_CPU);
 | 
			
		||||
    cpu_breakpoint_remove_all(cs, BP_CPU);
 | 
			
		||||
    cpu_watchpoint_remove_all(cs, BP_CPU);
 | 
			
		||||
    for (i = 0; i < DR7_MAX_BP; i++) {
 | 
			
		||||
        hw_breakpoint_insert(env, i);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -53,16 +53,21 @@ hwaddr lm32_cpu_get_phys_page_debug(CPUState *cs, vaddr addr)
 | 
			
		|||
 | 
			
		||||
void lm32_breakpoint_insert(CPULM32State *env, int idx, target_ulong address)
 | 
			
		||||
{
 | 
			
		||||
    cpu_breakpoint_insert(env, address, BP_CPU, &env->cpu_breakpoint[idx]);
 | 
			
		||||
    LM32CPU *cpu = lm32_env_get_cpu(env);
 | 
			
		||||
 | 
			
		||||
    cpu_breakpoint_insert(CPU(cpu), address, BP_CPU,
 | 
			
		||||
                          &env->cpu_breakpoint[idx]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void lm32_breakpoint_remove(CPULM32State *env, int idx)
 | 
			
		||||
{
 | 
			
		||||
    LM32CPU *cpu = lm32_env_get_cpu(env);
 | 
			
		||||
 | 
			
		||||
    if (!env->cpu_breakpoint[idx]) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    cpu_breakpoint_remove_by_ref(env, env->cpu_breakpoint[idx]);
 | 
			
		||||
    cpu_breakpoint_remove_by_ref(CPU(cpu), env->cpu_breakpoint[idx]);
 | 
			
		||||
    env->cpu_breakpoint[idx] = NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue