Skip to content

Commit

Permalink
cpu: Introduce CPUClass::set_pc() for gdb_set_cpu_pc()
Browse files Browse the repository at this point in the history
This moves setting the Program Counter from gdbstub into target code.
Use vaddr type as upper-bound replacement for target_ulong.

Signed-off-by: Andreas Färber <afaerber@suse.de>
  • Loading branch information
afaerber committed Jul 23, 2013
1 parent 2be8d45 commit f45748f
Show file tree
Hide file tree
Showing 15 changed files with 119 additions and 33 deletions.
39 changes: 6 additions & 33 deletions gdbstub.c
Original file line number Diff line number Diff line change
Expand Up @@ -2042,40 +2042,13 @@ static void gdb_breakpoint_remove_all(void)

static void gdb_set_cpu_pc(GDBState *s, target_ulong pc)
{
cpu_synchronize_state(ENV_GET_CPU(s->c_cpu));
#if defined(TARGET_I386)
s->c_cpu->eip = pc;
#elif defined (TARGET_PPC)
s->c_cpu->nip = pc;
#elif defined (TARGET_SPARC)
s->c_cpu->pc = pc;
s->c_cpu->npc = pc + 4;
#elif defined (TARGET_ARM)
s->c_cpu->regs[15] = pc;
#elif defined (TARGET_SH4)
s->c_cpu->pc = pc;
#elif defined (TARGET_MIPS)
s->c_cpu->active_tc.PC = pc & ~(target_ulong)1;
if (pc & 1) {
s->c_cpu->hflags |= MIPS_HFLAG_M16;
} else {
s->c_cpu->hflags &= ~(MIPS_HFLAG_M16);
CPUState *cpu = ENV_GET_CPU(s->c_cpu);
CPUClass *cc = CPU_GET_CLASS(cpu);

cpu_synchronize_state(cpu);
if (cc->set_pc) {
cc->set_pc(cpu, pc);
}
#elif defined (TARGET_MICROBLAZE)
s->c_cpu->sregs[SR_PC] = pc;
#elif defined(TARGET_OPENRISC)
s->c_cpu->pc = pc;
#elif defined (TARGET_CRIS)
s->c_cpu->pc = pc;
#elif defined (TARGET_ALPHA)
s->c_cpu->pc = pc;
#elif defined (TARGET_S390X)
s->c_cpu->psw.addr = pc;
#elif defined (TARGET_LM32)
s->c_cpu->pc = pc;
#elif defined(TARGET_XTENSA)
s->c_cpu->pc = pc;
#endif
}

static CPUArchState *find_cpu(uint32_t thread_id)
Expand Down
2 changes: 2 additions & 0 deletions include/qom/cpu.h
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ typedef void (*CPUUnassignedAccess)(CPUState *cpu, hwaddr addr,
* @get_arch_id: Callback for getting architecture-dependent CPU ID.
* @get_paging_enabled: Callback for inquiring whether paging is enabled.
* @get_memory_mapping: Callback for obtaining the memory mappings.
* @set_pc: Callback for setting the Program Counter register.
* @vmsd: State description for migration.
*
* Represents a CPU family or model.
Expand All @@ -96,6 +97,7 @@ typedef struct CPUClass {
bool (*get_paging_enabled)(const CPUState *cpu);
void (*get_memory_mapping)(CPUState *cpu, MemoryMappingList *list,
Error **errp);
void (*set_pc)(CPUState *cpu, vaddr value);

const struct VMStateDescription *vmsd;
int (*write_elf64_note)(WriteCoreDumpFunction f, CPUState *cpu,
Expand Down
8 changes: 8 additions & 0 deletions target-alpha/cpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,13 @@
#include "migration/vmstate.h"


static void alpha_cpu_set_pc(CPUState *cs, vaddr value)
{
AlphaCPU *cpu = ALPHA_CPU(cs);

cpu->env.pc = value;
}

static void alpha_cpu_realizefn(DeviceState *dev, Error **errp)
{
AlphaCPUClass *acc = ALPHA_CPU_GET_CLASS(dev);
Expand Down Expand Up @@ -264,6 +271,7 @@ static void alpha_cpu_class_init(ObjectClass *oc, void *data)
cc->do_interrupt = alpha_cpu_do_interrupt;
cc->dump_state = alpha_cpu_dump_state;
cpu_class_set_do_unassigned_access(cc, alpha_cpu_unassigned_access);
cc->set_pc = alpha_cpu_set_pc;
device_class_set_vmsd(dc, &vmstate_alpha_cpu);
}

Expand Down
8 changes: 8 additions & 0 deletions target-arm/cpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,13 @@
#endif
#include "sysemu/sysemu.h"

static void arm_cpu_set_pc(CPUState *cs, vaddr value)
{
ARMCPU *cpu = ARM_CPU(cs);

cpu->env.regs[15] = value;
}

static void cp_reg_reset(gpointer key, gpointer value, gpointer opaque)
{
/* Reset a single ARMCPRegInfo register */
Expand Down Expand Up @@ -816,6 +823,7 @@ static void arm_cpu_class_init(ObjectClass *oc, void *data)
cc->class_by_name = arm_cpu_class_by_name;
cc->do_interrupt = arm_cpu_do_interrupt;
cc->dump_state = arm_cpu_dump_state;
cc->set_pc = arm_cpu_set_pc;
cpu_class_set_vmsd(cc, &vmstate_arm_cpu);
}

Expand Down
8 changes: 8 additions & 0 deletions target-cris/cpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,13 @@
#include "mmu.h"


static void cris_cpu_set_pc(CPUState *cs, vaddr value)
{
CRISCPU *cpu = CRIS_CPU(cs);

cpu->env.pc = value;
}

/* CPUClass::reset() */
static void cris_cpu_reset(CPUState *s)
{
Expand Down Expand Up @@ -247,6 +254,7 @@ static void cris_cpu_class_init(ObjectClass *oc, void *data)
cc->class_by_name = cris_cpu_class_by_name;
cc->do_interrupt = cris_cpu_do_interrupt;
cc->dump_state = cris_cpu_dump_state;
cc->set_pc = cris_cpu_set_pc;
}

static const TypeInfo cris_cpu_type_info = {
Expand Down
8 changes: 8 additions & 0 deletions target-i386/cpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -2506,6 +2506,13 @@ static bool x86_cpu_get_paging_enabled(const CPUState *cs)
return cpu->env.cr[0] & CR0_PG_MASK;
}

static void x86_cpu_set_pc(CPUState *cs, vaddr value)
{
X86CPU *cpu = X86_CPU(cs);

cpu->env.eip = value;
}

static void x86_cpu_common_class_init(ObjectClass *oc, void *data)
{
X86CPUClass *xcc = X86_CPU_CLASS(oc);
Expand All @@ -2522,6 +2529,7 @@ static void x86_cpu_common_class_init(ObjectClass *oc, void *data)

cc->do_interrupt = x86_cpu_do_interrupt;
cc->dump_state = x86_cpu_dump_state;
cc->set_pc = x86_cpu_set_pc;
cc->get_arch_id = x86_cpu_get_arch_id;
cc->get_paging_enabled = x86_cpu_get_paging_enabled;
#ifndef CONFIG_USER_ONLY
Expand Down
8 changes: 8 additions & 0 deletions target-lm32/cpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,13 @@
#include "qemu-common.h"


static void lm32_cpu_set_pc(CPUState *cs, vaddr value)
{
LM32CPU *cpu = LM32_CPU(cs);

cpu->env.pc = value;
}

/* CPUClass::reset() */
static void lm32_cpu_reset(CPUState *s)
{
Expand Down Expand Up @@ -79,6 +86,7 @@ static void lm32_cpu_class_init(ObjectClass *oc, void *data)

cc->do_interrupt = lm32_cpu_do_interrupt;
cc->dump_state = lm32_cpu_dump_state;
cc->set_pc = lm32_cpu_set_pc;
cpu_class_set_vmsd(cc, &vmstate_lm32_cpu);
}

Expand Down
8 changes: 8 additions & 0 deletions target-microblaze/cpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,13 @@
#include "migration/vmstate.h"


static void mb_cpu_set_pc(CPUState *cs, vaddr value)
{
MicroBlazeCPU *cpu = MICROBLAZE_CPU(cs);

cpu->env.sregs[SR_PC] = value;
}

/* CPUClass::reset() */
static void mb_cpu_reset(CPUState *s)
{
Expand Down Expand Up @@ -134,6 +141,7 @@ static void mb_cpu_class_init(ObjectClass *oc, void *data)
cc->do_interrupt = mb_cpu_do_interrupt;
cc->dump_state = mb_cpu_dump_state;
cpu_class_set_do_unassigned_access(cc, mb_cpu_unassigned_access);
cc->set_pc = mb_cpu_set_pc;
dc->vmsd = &vmstate_mb_cpu;
dc->props = mb_properties;
}
Expand Down
14 changes: 14 additions & 0 deletions target-mips/cpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,19 @@
#include "qemu-common.h"


static void mips_cpu_set_pc(CPUState *cs, vaddr value)
{
MIPSCPU *cpu = MIPS_CPU(cs);
CPUMIPSState *env = &cpu->env;

env->active_tc.PC = value & ~(target_ulong)1;
if (value & 1) {
env->hflags |= MIPS_HFLAG_M16;
} else {
env->hflags &= ~(MIPS_HFLAG_M16);
}
}

/* CPUClass::reset() */
static void mips_cpu_reset(CPUState *s)
{
Expand Down Expand Up @@ -76,6 +89,7 @@ static void mips_cpu_class_init(ObjectClass *c, void *data)
cc->do_interrupt = mips_cpu_do_interrupt;
cc->dump_state = mips_cpu_dump_state;
cpu_class_set_do_unassigned_access(cc, mips_cpu_unassigned_access);
cc->set_pc = mips_cpu_set_pc;
}

static const TypeInfo mips_cpu_type_info = {
Expand Down
8 changes: 8 additions & 0 deletions target-openrisc/cpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,13 @@
#include "cpu.h"
#include "qemu-common.h"

static void openrisc_cpu_set_pc(CPUState *cs, vaddr value)
{
OpenRISCCPU *cpu = OPENRISC_CPU(cs);

cpu->env.pc = value;
}

/* CPUClass::reset() */
static void openrisc_cpu_reset(CPUState *s)
{
Expand Down Expand Up @@ -146,6 +153,7 @@ static void openrisc_cpu_class_init(ObjectClass *oc, void *data)
cc->class_by_name = openrisc_cpu_class_by_name;
cc->do_interrupt = openrisc_cpu_do_interrupt;
cc->dump_state = openrisc_cpu_dump_state;
cc->set_pc = openrisc_cpu_set_pc;
device_class_set_vmsd(dc, &vmstate_openrisc_cpu);
}

Expand Down
8 changes: 8 additions & 0 deletions target-ppc/translate_init.c
Original file line number Diff line number Diff line change
Expand Up @@ -8322,6 +8322,13 @@ CpuDefinitionInfoList *arch_query_cpu_definitions(Error **errp)
return cpu_list;
}

static void ppc_cpu_set_pc(CPUState *cs, vaddr value)
{
PowerPCCPU *cpu = POWERPC_CPU(cs);

cpu->env.nip = value;
}

/* CPUClass::reset() */
static void ppc_cpu_reset(CPUState *s)
{
Expand Down Expand Up @@ -8449,6 +8456,7 @@ static void ppc_cpu_class_init(ObjectClass *oc, void *data)
cc->do_interrupt = ppc_cpu_do_interrupt;
cc->dump_state = ppc_cpu_dump_state;
cc->dump_statistics = ppc_cpu_dump_statistics;
cc->set_pc = ppc_cpu_set_pc;
}

static const TypeInfo ppc_cpu_type_info = {
Expand Down
8 changes: 8 additions & 0 deletions target-s390x/cpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,13 @@ CpuDefinitionInfoList *arch_query_cpu_definitions(Error **errp)
}
#endif

static void s390_cpu_set_pc(CPUState *cs, vaddr value)
{
S390CPU *cpu = S390_CPU(cs);

cpu->env.psw.addr = value;
}

/* CPUClass::reset() */
static void s390_cpu_reset(CPUState *s)
{
Expand Down Expand Up @@ -165,6 +172,7 @@ static void s390_cpu_class_init(ObjectClass *oc, void *data)

cc->do_interrupt = s390_cpu_do_interrupt;
cc->dump_state = s390_cpu_dump_state;
cc->set_pc = s390_cpu_set_pc;
dc->vmsd = &vmstate_s390_cpu;
}

Expand Down
8 changes: 8 additions & 0 deletions target-sh4/cpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,13 @@
#include "migration/vmstate.h"


static void superh_cpu_set_pc(CPUState *cs, vaddr value)
{
SuperHCPU *cpu = SUPERH_CPU(cs);

cpu->env.pc = value;
}

/* CPUClass::reset() */
static void superh_cpu_reset(CPUState *s)
{
Expand Down Expand Up @@ -269,6 +276,7 @@ static void superh_cpu_class_init(ObjectClass *oc, void *data)
cc->class_by_name = superh_cpu_class_by_name;
cc->do_interrupt = superh_cpu_do_interrupt;
cc->dump_state = superh_cpu_dump_state;
cc->set_pc = superh_cpu_set_pc;
dc->vmsd = &vmstate_sh_cpu;
}

Expand Down
9 changes: 9 additions & 0 deletions target-sparc/cpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -723,6 +723,14 @@ void sparc_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fprintf,
cpu_fprintf(f, "\n");
}

static void sparc_cpu_set_pc(CPUState *cs, vaddr value)
{
SPARCCPU *cpu = SPARC_CPU(cs);

cpu->env.pc = value;
cpu->env.npc = value + 4;
}

static void sparc_cpu_realizefn(DeviceState *dev, Error **errp)
{
SPARCCPUClass *scc = SPARC_CPU_GET_CLASS(dev);
Expand Down Expand Up @@ -767,6 +775,7 @@ static void sparc_cpu_class_init(ObjectClass *oc, void *data)
cc->do_interrupt = sparc_cpu_do_interrupt;
cc->dump_state = sparc_cpu_dump_state;
cpu_class_set_do_unassigned_access(cc, sparc_cpu_unassigned_access);
cc->set_pc = sparc_cpu_set_pc;
}

static const TypeInfo sparc_cpu_type_info = {
Expand Down
8 changes: 8 additions & 0 deletions target-xtensa/cpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,13 @@
#include "migration/vmstate.h"


static void xtensa_cpu_set_pc(CPUState *cs, vaddr value)
{
XtensaCPU *cpu = XTENSA_CPU(cs);

cpu->env.pc = value;
}

/* CPUClass::reset() */
static void xtensa_cpu_reset(CPUState *s)
{
Expand Down Expand Up @@ -100,6 +107,7 @@ static void xtensa_cpu_class_init(ObjectClass *oc, void *data)

cc->do_interrupt = xtensa_cpu_do_interrupt;
cc->dump_state = xtensa_cpu_dump_state;
cc->set_pc = xtensa_cpu_set_pc;
dc->vmsd = &vmstate_xtensa_cpu;
}

Expand Down

0 comments on commit f45748f

Please sign in to comment.