ppc: Pass PowerPCCPU to ppc_set_irq()

Adapt static caller functions.

This cleans up after passing PowerPCCPU to kvmppc_set_interrupt().

Signed-off-by: Andreas Färber <afaerber@suse.de>
This commit is contained in:
Andreas Färber 2012-12-01 03:55:58 +01:00
parent 1bc22652d6
commit 7058581a26
3 changed files with 60 additions and 36 deletions

View file

@ -50,8 +50,9 @@
static void cpu_ppc_tb_stop (CPUPPCState *env); static void cpu_ppc_tb_stop (CPUPPCState *env);
static void cpu_ppc_tb_start (CPUPPCState *env); static void cpu_ppc_tb_start (CPUPPCState *env);
void ppc_set_irq(CPUPPCState *env, int n_IRQ, int level) void ppc_set_irq(PowerPCCPU *cpu, int n_IRQ, int level)
{ {
CPUPPCState *env = &cpu->env;
unsigned int old_pending = env->pending_interrupts; unsigned int old_pending = env->pending_interrupts;
if (level) { if (level) {
@ -65,7 +66,7 @@ void ppc_set_irq(CPUPPCState *env, int n_IRQ, int level)
if (old_pending != env->pending_interrupts) { if (old_pending != env->pending_interrupts) {
#ifdef CONFIG_KVM #ifdef CONFIG_KVM
kvmppc_set_interrupt(ppc_env_get_cpu(env), n_IRQ, level); kvmppc_set_interrupt(cpu, n_IRQ, level);
#endif #endif
} }
@ -100,13 +101,13 @@ static void ppc6xx_set_irq(void *opaque, int pin, int level)
/* Level sensitive - active high */ /* Level sensitive - active high */
LOG_IRQ("%s: set the external IRQ state to %d\n", LOG_IRQ("%s: set the external IRQ state to %d\n",
__func__, level); __func__, level);
ppc_set_irq(env, PPC_INTERRUPT_EXT, level); ppc_set_irq(cpu, PPC_INTERRUPT_EXT, level);
break; break;
case PPC6xx_INPUT_SMI: case PPC6xx_INPUT_SMI:
/* Level sensitive - active high */ /* Level sensitive - active high */
LOG_IRQ("%s: set the SMI IRQ state to %d\n", LOG_IRQ("%s: set the SMI IRQ state to %d\n",
__func__, level); __func__, level);
ppc_set_irq(env, PPC_INTERRUPT_SMI, level); ppc_set_irq(cpu, PPC_INTERRUPT_SMI, level);
break; break;
case PPC6xx_INPUT_MCP: case PPC6xx_INPUT_MCP:
/* Negative edge sensitive */ /* Negative edge sensitive */
@ -116,7 +117,7 @@ static void ppc6xx_set_irq(void *opaque, int pin, int level)
if (cur_level == 1 && level == 0) { if (cur_level == 1 && level == 0) {
LOG_IRQ("%s: raise machine check state\n", LOG_IRQ("%s: raise machine check state\n",
__func__); __func__);
ppc_set_irq(env, PPC_INTERRUPT_MCK, 1); ppc_set_irq(cpu, PPC_INTERRUPT_MCK, 1);
} }
break; break;
case PPC6xx_INPUT_CKSTP_IN: case PPC6xx_INPUT_CKSTP_IN:
@ -138,7 +139,7 @@ static void ppc6xx_set_irq(void *opaque, int pin, int level)
case PPC6xx_INPUT_SRESET: case PPC6xx_INPUT_SRESET:
LOG_IRQ("%s: set the RESET IRQ state to %d\n", LOG_IRQ("%s: set the RESET IRQ state to %d\n",
__func__, level); __func__, level);
ppc_set_irq(env, PPC_INTERRUPT_RESET, level); ppc_set_irq(cpu, PPC_INTERRUPT_RESET, level);
break; break;
default: default:
/* Unknown pin - do nothing */ /* Unknown pin - do nothing */
@ -178,13 +179,13 @@ static void ppc970_set_irq(void *opaque, int pin, int level)
/* Level sensitive - active high */ /* Level sensitive - active high */
LOG_IRQ("%s: set the external IRQ state to %d\n", LOG_IRQ("%s: set the external IRQ state to %d\n",
__func__, level); __func__, level);
ppc_set_irq(env, PPC_INTERRUPT_EXT, level); ppc_set_irq(cpu, PPC_INTERRUPT_EXT, level);
break; break;
case PPC970_INPUT_THINT: case PPC970_INPUT_THINT:
/* Level sensitive - active high */ /* Level sensitive - active high */
LOG_IRQ("%s: set the SMI IRQ state to %d\n", __func__, LOG_IRQ("%s: set the SMI IRQ state to %d\n", __func__,
level); level);
ppc_set_irq(env, PPC_INTERRUPT_THERM, level); ppc_set_irq(cpu, PPC_INTERRUPT_THERM, level);
break; break;
case PPC970_INPUT_MCP: case PPC970_INPUT_MCP:
/* Negative edge sensitive */ /* Negative edge sensitive */
@ -194,7 +195,7 @@ static void ppc970_set_irq(void *opaque, int pin, int level)
if (cur_level == 1 && level == 0) { if (cur_level == 1 && level == 0) {
LOG_IRQ("%s: raise machine check state\n", LOG_IRQ("%s: raise machine check state\n",
__func__); __func__);
ppc_set_irq(env, PPC_INTERRUPT_MCK, 1); ppc_set_irq(cpu, PPC_INTERRUPT_MCK, 1);
} }
break; break;
case PPC970_INPUT_CKSTP: case PPC970_INPUT_CKSTP:
@ -218,7 +219,7 @@ static void ppc970_set_irq(void *opaque, int pin, int level)
case PPC970_INPUT_SRESET: case PPC970_INPUT_SRESET:
LOG_IRQ("%s: set the RESET IRQ state to %d\n", LOG_IRQ("%s: set the RESET IRQ state to %d\n",
__func__, level); __func__, level);
ppc_set_irq(env, PPC_INTERRUPT_RESET, level); ppc_set_irq(cpu, PPC_INTERRUPT_RESET, level);
break; break;
case PPC970_INPUT_TBEN: case PPC970_INPUT_TBEN:
LOG_IRQ("%s: set the TBEN state to %d\n", __func__, LOG_IRQ("%s: set the TBEN state to %d\n", __func__,
@ -259,7 +260,7 @@ static void power7_set_irq(void *opaque, int pin, int level)
/* Level sensitive - active high */ /* Level sensitive - active high */
LOG_IRQ("%s: set the external IRQ state to %d\n", LOG_IRQ("%s: set the external IRQ state to %d\n",
__func__, level); __func__, level);
ppc_set_irq(env, PPC_INTERRUPT_EXT, level); ppc_set_irq(cpu, PPC_INTERRUPT_EXT, level);
break; break;
default: default:
/* Unknown pin - do nothing */ /* Unknown pin - do nothing */
@ -319,13 +320,13 @@ static void ppc40x_set_irq(void *opaque, int pin, int level)
/* Level sensitive - active high */ /* Level sensitive - active high */
LOG_IRQ("%s: set the critical IRQ state to %d\n", LOG_IRQ("%s: set the critical IRQ state to %d\n",
__func__, level); __func__, level);
ppc_set_irq(env, PPC_INTERRUPT_CEXT, level); ppc_set_irq(cpu, PPC_INTERRUPT_CEXT, level);
break; break;
case PPC40x_INPUT_INT: case PPC40x_INPUT_INT:
/* Level sensitive - active high */ /* Level sensitive - active high */
LOG_IRQ("%s: set the external IRQ state to %d\n", LOG_IRQ("%s: set the external IRQ state to %d\n",
__func__, level); __func__, level);
ppc_set_irq(env, PPC_INTERRUPT_EXT, level); ppc_set_irq(cpu, PPC_INTERRUPT_EXT, level);
break; break;
case PPC40x_INPUT_HALT: case PPC40x_INPUT_HALT:
/* Level sensitive - active low */ /* Level sensitive - active low */
@ -342,7 +343,7 @@ static void ppc40x_set_irq(void *opaque, int pin, int level)
/* Level sensitive - active high */ /* Level sensitive - active high */
LOG_IRQ("%s: set the debug pin state to %d\n", LOG_IRQ("%s: set the debug pin state to %d\n",
__func__, level); __func__, level);
ppc_set_irq(env, PPC_INTERRUPT_DEBUG, level); ppc_set_irq(cpu, PPC_INTERRUPT_DEBUG, level);
break; break;
default: default:
/* Unknown pin - do nothing */ /* Unknown pin - do nothing */
@ -387,26 +388,26 @@ static void ppce500_set_irq(void *opaque, int pin, int level)
case PPCE500_INPUT_RESET_CORE: case PPCE500_INPUT_RESET_CORE:
if (level) { if (level) {
LOG_IRQ("%s: reset the PowerPC core\n", __func__); LOG_IRQ("%s: reset the PowerPC core\n", __func__);
ppc_set_irq(env, PPC_INTERRUPT_MCK, level); ppc_set_irq(cpu, PPC_INTERRUPT_MCK, level);
} }
break; break;
case PPCE500_INPUT_CINT: case PPCE500_INPUT_CINT:
/* Level sensitive - active high */ /* Level sensitive - active high */
LOG_IRQ("%s: set the critical IRQ state to %d\n", LOG_IRQ("%s: set the critical IRQ state to %d\n",
__func__, level); __func__, level);
ppc_set_irq(env, PPC_INTERRUPT_CEXT, level); ppc_set_irq(cpu, PPC_INTERRUPT_CEXT, level);
break; break;
case PPCE500_INPUT_INT: case PPCE500_INPUT_INT:
/* Level sensitive - active high */ /* Level sensitive - active high */
LOG_IRQ("%s: set the core IRQ state to %d\n", LOG_IRQ("%s: set the core IRQ state to %d\n",
__func__, level); __func__, level);
ppc_set_irq(env, PPC_INTERRUPT_EXT, level); ppc_set_irq(cpu, PPC_INTERRUPT_EXT, level);
break; break;
case PPCE500_INPUT_DEBUG: case PPCE500_INPUT_DEBUG:
/* Level sensitive - active high */ /* Level sensitive - active high */
LOG_IRQ("%s: set the debug pin state to %d\n", LOG_IRQ("%s: set the debug pin state to %d\n",
__func__, level); __func__, level);
ppc_set_irq(env, PPC_INTERRUPT_DEBUG, level); ppc_set_irq(cpu, PPC_INTERRUPT_DEBUG, level);
break; break;
default: default:
/* Unknown pin - do nothing */ /* Unknown pin - do nothing */
@ -645,16 +646,20 @@ uint64_t cpu_ppc_load_purr (CPUPPCState *env)
*/ */
static inline void cpu_ppc_decr_excp(CPUPPCState *env) static inline void cpu_ppc_decr_excp(CPUPPCState *env)
{ {
PowerPCCPU *cpu = ppc_env_get_cpu(env);
/* Raise it */ /* Raise it */
LOG_TB("raise decrementer exception\n"); LOG_TB("raise decrementer exception\n");
ppc_set_irq(env, PPC_INTERRUPT_DECR, 1); ppc_set_irq(cpu, PPC_INTERRUPT_DECR, 1);
} }
static inline void cpu_ppc_hdecr_excp(CPUPPCState *env) static inline void cpu_ppc_hdecr_excp(CPUPPCState *env)
{ {
PowerPCCPU *cpu = ppc_env_get_cpu(env);
/* Raise it */ /* Raise it */
LOG_TB("raise decrementer exception\n"); LOG_TB("raise decrementer exception\n");
ppc_set_irq(env, PPC_INTERRUPT_HDECR, 1); ppc_set_irq(cpu, PPC_INTERRUPT_HDECR, 1);
} }
static void __cpu_ppc_store_decr (CPUPPCState *env, uint64_t *nextp, static void __cpu_ppc_store_decr (CPUPPCState *env, uint64_t *nextp,
@ -829,12 +834,14 @@ struct ppc40x_timer_t {
/* Fixed interval timer */ /* Fixed interval timer */
static void cpu_4xx_fit_cb (void *opaque) static void cpu_4xx_fit_cb (void *opaque)
{ {
PowerPCCPU *cpu;
CPUPPCState *env; CPUPPCState *env;
ppc_tb_t *tb_env; ppc_tb_t *tb_env;
ppc40x_timer_t *ppc40x_timer; ppc40x_timer_t *ppc40x_timer;
uint64_t now, next; uint64_t now, next;
env = opaque; env = opaque;
cpu = ppc_env_get_cpu(env);
tb_env = env->tb_env; tb_env = env->tb_env;
ppc40x_timer = tb_env->opaque; ppc40x_timer = tb_env->opaque;
now = qemu_get_clock_ns(vm_clock); now = qemu_get_clock_ns(vm_clock);
@ -860,8 +867,9 @@ static void cpu_4xx_fit_cb (void *opaque)
next++; next++;
qemu_mod_timer(ppc40x_timer->fit_timer, next); qemu_mod_timer(ppc40x_timer->fit_timer, next);
env->spr[SPR_40x_TSR] |= 1 << 26; env->spr[SPR_40x_TSR] |= 1 << 26;
if ((env->spr[SPR_40x_TCR] >> 23) & 0x1) if ((env->spr[SPR_40x_TCR] >> 23) & 0x1) {
ppc_set_irq(env, PPC_INTERRUPT_FIT, 1); ppc_set_irq(cpu, PPC_INTERRUPT_FIT, 1);
}
LOG_TB("%s: ir %d TCR " TARGET_FMT_lx " TSR " TARGET_FMT_lx "\n", __func__, LOG_TB("%s: ir %d TCR " TARGET_FMT_lx " TSR " TARGET_FMT_lx "\n", __func__,
(int)((env->spr[SPR_40x_TCR] >> 23) & 0x1), (int)((env->spr[SPR_40x_TCR] >> 23) & 0x1),
env->spr[SPR_40x_TCR], env->spr[SPR_40x_TSR]); env->spr[SPR_40x_TCR], env->spr[SPR_40x_TSR]);
@ -897,16 +905,19 @@ static void start_stop_pit (CPUPPCState *env, ppc_tb_t *tb_env, int is_excp)
static void cpu_4xx_pit_cb (void *opaque) static void cpu_4xx_pit_cb (void *opaque)
{ {
PowerPCCPU *cpu;
CPUPPCState *env; CPUPPCState *env;
ppc_tb_t *tb_env; ppc_tb_t *tb_env;
ppc40x_timer_t *ppc40x_timer; ppc40x_timer_t *ppc40x_timer;
env = opaque; env = opaque;
cpu = ppc_env_get_cpu(env);
tb_env = env->tb_env; tb_env = env->tb_env;
ppc40x_timer = tb_env->opaque; ppc40x_timer = tb_env->opaque;
env->spr[SPR_40x_TSR] |= 1 << 27; env->spr[SPR_40x_TSR] |= 1 << 27;
if ((env->spr[SPR_40x_TCR] >> 26) & 0x1) if ((env->spr[SPR_40x_TCR] >> 26) & 0x1) {
ppc_set_irq(env, ppc40x_timer->decr_excp, 1); ppc_set_irq(cpu, ppc40x_timer->decr_excp, 1);
}
start_stop_pit(env, tb_env, 1); start_stop_pit(env, tb_env, 1);
LOG_TB("%s: ar %d ir %d TCR " TARGET_FMT_lx " TSR " TARGET_FMT_lx " " LOG_TB("%s: ar %d ir %d TCR " TARGET_FMT_lx " TSR " TARGET_FMT_lx " "
"%016" PRIx64 "\n", __func__, "%016" PRIx64 "\n", __func__,
@ -919,12 +930,14 @@ static void cpu_4xx_pit_cb (void *opaque)
/* Watchdog timer */ /* Watchdog timer */
static void cpu_4xx_wdt_cb (void *opaque) static void cpu_4xx_wdt_cb (void *opaque)
{ {
PowerPCCPU *cpu;
CPUPPCState *env; CPUPPCState *env;
ppc_tb_t *tb_env; ppc_tb_t *tb_env;
ppc40x_timer_t *ppc40x_timer; ppc40x_timer_t *ppc40x_timer;
uint64_t now, next; uint64_t now, next;
env = opaque; env = opaque;
cpu = ppc_env_get_cpu(env);
tb_env = env->tb_env; tb_env = env->tb_env;
ppc40x_timer = tb_env->opaque; ppc40x_timer = tb_env->opaque;
now = qemu_get_clock_ns(vm_clock); now = qemu_get_clock_ns(vm_clock);
@ -961,8 +974,9 @@ static void cpu_4xx_wdt_cb (void *opaque)
qemu_mod_timer(ppc40x_timer->wdt_timer, next); qemu_mod_timer(ppc40x_timer->wdt_timer, next);
ppc40x_timer->wdt_next = next; ppc40x_timer->wdt_next = next;
env->spr[SPR_40x_TSR] |= 1 << 30; env->spr[SPR_40x_TSR] |= 1 << 30;
if ((env->spr[SPR_40x_TCR] >> 27) & 0x1) if ((env->spr[SPR_40x_TCR] >> 27) & 0x1) {
ppc_set_irq(env, PPC_INTERRUPT_WDT, 1); ppc_set_irq(cpu, PPC_INTERRUPT_WDT, 1);
}
break; break;
case 0x3: case 0x3:
env->spr[SPR_40x_TSR] &= ~0x30000000; env->spr[SPR_40x_TSR] &= ~0x30000000;

View file

@ -1,4 +1,4 @@
void ppc_set_irq (CPUPPCState *env, int n_IRQ, int level); void ppc_set_irq(PowerPCCPU *cpu, int n_IRQ, int level);
/* PowerPC hardware exceptions management helpers */ /* PowerPC hardware exceptions management helpers */
typedef void (*clk_setup_cb)(void *opaque, uint32_t freq); typedef void (*clk_setup_cb)(void *opaque, uint32_t freq);

View file

@ -71,17 +71,19 @@ struct booke_timer_t {
uint32_t flags; uint32_t flags;
}; };
static void booke_update_irq(CPUPPCState *env) static void booke_update_irq(PowerPCCPU *cpu)
{ {
ppc_set_irq(env, PPC_INTERRUPT_DECR, CPUPPCState *env = &cpu->env;
ppc_set_irq(cpu, PPC_INTERRUPT_DECR,
(env->spr[SPR_BOOKE_TSR] & TSR_DIS (env->spr[SPR_BOOKE_TSR] & TSR_DIS
&& env->spr[SPR_BOOKE_TCR] & TCR_DIE)); && env->spr[SPR_BOOKE_TCR] & TCR_DIE));
ppc_set_irq(env, PPC_INTERRUPT_WDT, ppc_set_irq(cpu, PPC_INTERRUPT_WDT,
(env->spr[SPR_BOOKE_TSR] & TSR_WIS (env->spr[SPR_BOOKE_TSR] & TSR_WIS
&& env->spr[SPR_BOOKE_TCR] & TCR_WIE)); && env->spr[SPR_BOOKE_TCR] & TCR_WIE));
ppc_set_irq(env, PPC_INTERRUPT_FIT, ppc_set_irq(cpu, PPC_INTERRUPT_FIT,
(env->spr[SPR_BOOKE_TSR] & TSR_FIS (env->spr[SPR_BOOKE_TSR] & TSR_FIS
&& env->spr[SPR_BOOKE_TCR] & TCR_FIE)); && env->spr[SPR_BOOKE_TCR] & TCR_FIE));
} }
@ -154,9 +156,10 @@ static void booke_update_fixed_timer(CPUPPCState *env,
static void booke_decr_cb(void *opaque) static void booke_decr_cb(void *opaque)
{ {
CPUPPCState *env = opaque; CPUPPCState *env = opaque;
PowerPCCPU *cpu = ppc_env_get_cpu(env);
env->spr[SPR_BOOKE_TSR] |= TSR_DIS; env->spr[SPR_BOOKE_TSR] |= TSR_DIS;
booke_update_irq(env); booke_update_irq(cpu);
if (env->spr[SPR_BOOKE_TCR] & TCR_ARE) { if (env->spr[SPR_BOOKE_TCR] & TCR_ARE) {
/* Auto Reload */ /* Auto Reload */
@ -166,16 +169,18 @@ static void booke_decr_cb(void *opaque)
static void booke_fit_cb(void *opaque) static void booke_fit_cb(void *opaque)
{ {
PowerPCCPU *cpu;
CPUPPCState *env; CPUPPCState *env;
ppc_tb_t *tb_env; ppc_tb_t *tb_env;
booke_timer_t *booke_timer; booke_timer_t *booke_timer;
env = opaque; env = opaque;
cpu = ppc_env_get_cpu(env);
tb_env = env->tb_env; tb_env = env->tb_env;
booke_timer = tb_env->opaque; booke_timer = tb_env->opaque;
env->spr[SPR_BOOKE_TSR] |= TSR_FIS; env->spr[SPR_BOOKE_TSR] |= TSR_FIS;
booke_update_irq(env); booke_update_irq(cpu);
booke_update_fixed_timer(env, booke_update_fixed_timer(env,
booke_get_fit_target(env, tb_env), booke_get_fit_target(env, tb_env),
@ -185,17 +190,19 @@ static void booke_fit_cb(void *opaque)
static void booke_wdt_cb(void *opaque) static void booke_wdt_cb(void *opaque)
{ {
PowerPCCPU *cpu;
CPUPPCState *env; CPUPPCState *env;
ppc_tb_t *tb_env; ppc_tb_t *tb_env;
booke_timer_t *booke_timer; booke_timer_t *booke_timer;
env = opaque; env = opaque;
cpu = ppc_env_get_cpu(env);
tb_env = env->tb_env; tb_env = env->tb_env;
booke_timer = tb_env->opaque; booke_timer = tb_env->opaque;
/* TODO: There's lots of complicated stuff to do here */ /* TODO: There's lots of complicated stuff to do here */
booke_update_irq(env); booke_update_irq(cpu);
booke_update_fixed_timer(env, booke_update_fixed_timer(env,
booke_get_wdt_target(env, tb_env), booke_get_wdt_target(env, tb_env),
@ -205,19 +212,22 @@ static void booke_wdt_cb(void *opaque)
void store_booke_tsr(CPUPPCState *env, target_ulong val) void store_booke_tsr(CPUPPCState *env, target_ulong val)
{ {
PowerPCCPU *cpu = ppc_env_get_cpu(env);
env->spr[SPR_BOOKE_TSR] &= ~val; env->spr[SPR_BOOKE_TSR] &= ~val;
booke_update_irq(env); booke_update_irq(cpu);
} }
void store_booke_tcr(CPUPPCState *env, target_ulong val) void store_booke_tcr(CPUPPCState *env, target_ulong val)
{ {
PowerPCCPU *cpu = ppc_env_get_cpu(env);
ppc_tb_t *tb_env = env->tb_env; ppc_tb_t *tb_env = env->tb_env;
booke_timer_t *booke_timer = tb_env->opaque; booke_timer_t *booke_timer = tb_env->opaque;
tb_env = env->tb_env; tb_env = env->tb_env;
env->spr[SPR_BOOKE_TCR] = val; env->spr[SPR_BOOKE_TCR] = val;
booke_update_irq(env); booke_update_irq(cpu);
booke_update_fixed_timer(env, booke_update_fixed_timer(env,
booke_get_fit_target(env, tb_env), booke_get_fit_target(env, tb_env),