Implement the hypercall that retrieves the state of a specific CPU.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
case JAILHOUSE_HC_CELL_GET_STATE:
guest_regs->rax = cell_get_state(cpu_data, guest_regs->rdi);
break;
+ case JAILHOUSE_HC_CPU_GET_STATE:
+ guest_regs->rax = cpu_get_state(cpu_data, guest_regs->rdi);
+ break;
default:
printk("CPU %d: Unknown vmcall %d, RIP: %p\n",
cpu_data->cpu_id, guest_regs->rax,
return ret;
}
+int cpu_get_state(struct per_cpu *cpu_data, unsigned long cpu_id)
+{
+ if (!cpu_id_valid(cpu_id))
+ return -EINVAL;
+
+ if (cpu_data->cell != &linux_cell &&
+ (cpu_id > cpu_data->cell->cpu_set->max_cpu_id ||
+ !test_bit(cpu_id, cpu_data->cell->cpu_set->bitmap)))
+ return -EPERM;
+
+ return per_cpu(cpu_id)->failed ? JAILHOUSE_CPU_FAILED :
+ JAILHOUSE_CPU_RUNNING;
+}
+
void panic_stop(struct per_cpu *cpu_data)
{
panic_printk("Stopping CPU");
int shutdown(struct per_cpu *cpu_data);
+int cpu_get_state(struct per_cpu *cpu_data, unsigned long id);
+
void __attribute__((noreturn)) panic_stop(struct per_cpu *cpu_data);
void panic_halt(struct per_cpu *cpu_data);
#define JAILHOUSE_HC_CELL_CREATE 1
#define JAILHOUSE_HC_CELL_DESTROY 2
#define JAILHOUSE_HC_CELL_GET_STATE 4
+#define JAILHOUSE_HC_CPU_GET_STATE 5
+
+/* CPU state */
+#define JAILHOUSE_CPU_RUNNING 0
+#define JAILHOUSE_CPU_FAILED 2 /* terminal state */
#define JAILHOUSE_MSG_NONE 0