@@ -54,13 +54,26 @@
static VirtIOS390Bus *s390_bus;
static S390CPU **ipi_states;
+void s390_cpu_set_state(uint16_t cpu_addr, S390CPU *state)
+{
+ ipi_states[cpu_addr] = state;
+}
+
S390CPU *s390_cpu_addr2state(uint16_t cpu_addr)
{
- if (cpu_addr >= smp_cpus) {
- return NULL;
+ return ipi_states[cpu_addr];
+}
+
+uint16_t s390_cpu_get_free_state_idx(void)
+{
+ int i;
+ for (i = 0; i < max_cpus; i++)
+ if (ipi_states[i] == NULL) {
+ return i;
}
- return ipi_states[cpu_addr];
+ assert(0); /* BUG! */
+ return -1;
}
static int s390_virtio_hcall_notify(const uint64_t *args)
@@ -388,6 +388,8 @@ static inline void kvm_s390_interrupt_internal(S390CPU *cpu, int type,
}
#endif
S390CPU *s390_cpu_addr2state(uint16_t cpu_addr);
+void s390_cpu_set_state(uint16_t cpu_addr, S390CPU *state);
+uint16_t s390_cpu_get_free_state_idx(void);
void s390_add_running_cpu(S390CPU *cpu);
unsigned s390_del_running_cpu(S390CPU *cpu);