s390-virtio: Let s390_cpu_addr2state() return S390CPU

Convert ipi_states to S390CPU**.

Needed for s390_cpu_restart() in handle_sigp().

Signed-off-by: Andreas Färber <afaerber@suse.de>
This commit is contained in:
Andreas Färber 2012-05-03 04:28:14 +02:00
parent 6fc150de80
commit 45fa769b32
4 changed files with 13 additions and 9 deletions

View File

@ -140,7 +140,8 @@ static int s390_virtio_device_init(VirtIOS390Device *dev, VirtIODevice *vdev)
s390_virtio_device_sync(dev); s390_virtio_device_sync(dev);
s390_virtio_reset_idx(dev); s390_virtio_reset_idx(dev);
if (dev->qdev.hotplugged) { if (dev->qdev.hotplugged) {
CPUS390XState *env = s390_cpu_addr2state(0); S390CPU *cpu = s390_cpu_addr2state(0);
CPUS390XState *env = &cpu->env;
s390_virtio_irq(env, VIRTIO_PARAM_DEV_ADD, dev->dev_offs); s390_virtio_irq(env, VIRTIO_PARAM_DEV_ADD, dev->dev_offs);
} }
@ -354,7 +355,8 @@ static void virtio_s390_notify(void *opaque, uint16_t vector)
{ {
VirtIOS390Device *dev = (VirtIOS390Device*)opaque; VirtIOS390Device *dev = (VirtIOS390Device*)opaque;
uint64_t token = s390_virtio_device_vq_token(dev, vector); uint64_t token = s390_virtio_device_vq_token(dev, vector);
CPUS390XState *env = s390_cpu_addr2state(0); S390CPU *cpu = s390_cpu_addr2state(0);
CPUS390XState *env = &cpu->env;
s390_virtio_irq(env, 0, token); s390_virtio_irq(env, 0, token);
} }

View File

@ -61,9 +61,9 @@
#define MAX_BLK_DEVS 10 #define MAX_BLK_DEVS 10
static VirtIOS390Bus *s390_bus; static VirtIOS390Bus *s390_bus;
static CPUS390XState **ipi_states; static S390CPU **ipi_states;
CPUS390XState *s390_cpu_addr2state(uint16_t cpu_addr) S390CPU *s390_cpu_addr2state(uint16_t cpu_addr)
{ {
if (cpu_addr >= smp_cpus) { if (cpu_addr >= smp_cpus) {
return NULL; return NULL;
@ -206,7 +206,7 @@ static void s390_init(ram_addr_t my_ram_size,
cpu_model = "host"; cpu_model = "host";
} }
ipi_states = g_malloc(sizeof(CPUS390XState *) * smp_cpus); ipi_states = g_malloc(sizeof(S390CPU *) * smp_cpus);
for (i = 0; i < smp_cpus; i++) { for (i = 0; i < smp_cpus; i++) {
S390CPU *cpu; S390CPU *cpu;
@ -217,7 +217,7 @@ static void s390_init(ram_addr_t my_ram_size,
if (!env) { if (!env) {
env = tmp_env; env = tmp_env;
} }
ipi_states[i] = tmp_env; ipi_states[i] = cpu;
tmp_env->halted = 1; tmp_env->halted = 1;
tmp_env->exception_index = EXCP_HLT; tmp_env->exception_index = EXCP_HLT;
tmp_env->storage_keys = storage_keys; tmp_env->storage_keys = storage_keys;

View File

@ -316,7 +316,7 @@ static inline void kvm_s390_interrupt_internal(CPUS390XState *env, int type,
{ {
} }
#endif #endif
CPUS390XState *s390_cpu_addr2state(uint16_t cpu_addr); S390CPU *s390_cpu_addr2state(uint16_t cpu_addr);
void s390_add_running_cpu(CPUS390XState *env); void s390_add_running_cpu(CPUS390XState *env);
unsigned s390_del_running_cpu(CPUS390XState *env); unsigned s390_del_running_cpu(CPUS390XState *env);

View File

@ -333,6 +333,7 @@ static int handle_sigp(CPUS390XState *env, struct kvm_run *run, uint8_t ipa1)
uint16_t cpu_addr; uint16_t cpu_addr;
uint8_t t; uint8_t t;
int r = -1; int r = -1;
S390CPU *target_cpu;
CPUS390XState *target_env; CPUS390XState *target_env;
cpu_synchronize_state(env); cpu_synchronize_state(env);
@ -353,10 +354,11 @@ static int handle_sigp(CPUS390XState *env, struct kvm_run *run, uint8_t ipa1)
parameter = env->regs[t] & 0x7ffffe00; parameter = env->regs[t] & 0x7ffffe00;
cpu_addr = env->regs[ipa1 & 0x0f]; cpu_addr = env->regs[ipa1 & 0x0f];
target_env = s390_cpu_addr2state(cpu_addr); target_cpu = s390_cpu_addr2state(cpu_addr);
if (!target_env) { if (target_cpu == NULL) {
goto out; goto out;
} }
target_env = &target_cpu->env;
switch (order_code) { switch (order_code) {
case SIGP_RESTART: case SIGP_RESTART: