]> rtime.felk.cvut.cz Git - jailhouse.git/commitdiff
core: Add "CPU Get State" hypercall
authorJan Kiszka <jan.kiszka@siemens.com>
Wed, 5 Mar 2014 07:57:50 +0000 (08:57 +0100)
committerJan Kiszka <jan.kiszka@siemens.com>
Wed, 5 Mar 2014 09:25:55 +0000 (10:25 +0100)
Implement the hypercall that retrieves the state of a specific CPU.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
hypervisor/arch/x86/vmx.c
hypervisor/control.c
hypervisor/include/jailhouse/control.h
hypervisor/include/jailhouse/hypercall.h

index 582f3e5d4fe4d1b87e09302ce6daec48dafca385..4feb5a2eed4e7669a0554834145beca63c89d4f3 100644 (file)
@@ -897,6 +897,9 @@ static void vmx_handle_hypercall(struct registers *guest_regs,
        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,
index 3a08dbbcf34b38ae6cdf05cd7361aea5fe20a4f9..470d9792f24abe9c96d3835c44ac3fe3339cfb0b 100644 (file)
@@ -466,6 +466,20 @@ int shutdown(struct per_cpu *cpu_data)
        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");
index 6cce5184edb232499e589e6a5fa88d8b14078f25..5eb0b9caf01923ccaf8edc0e70183687c9cce533 100644 (file)
@@ -45,6 +45,8 @@ int cell_get_state(struct per_cpu *cpu_data, unsigned long id);
 
 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);
 
index ac225a5d7611e399e7fe3f20c25ea9cd2d667603..4957aa46b52fcb343111f0dc1a6dfce5c9d83fd1 100644 (file)
 #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