blob: 66be66e2a33a87459a95c758824b364535f07d0f [file] [log] [blame]
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +01001#include "vm.h"
2
Wedson Almeida Filho52bb3f92018-07-30 15:52:38 +01003#include "api.h"
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +01004#include "cpu.h"
Wedson Almeida Filho2f94ec12018-07-26 16:00:48 +01005#include "std.h"
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +01006
Wedson Almeida Filho84a30a02018-07-23 20:05:05 +01007bool vm_init(struct vm *vm, uint32_t id, uint32_t vcpu_count)
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +01008{
Wedson Almeida Filho87009642018-07-02 10:20:07 +01009 uint32_t i;
10
Wedson Almeida Filho2f94ec12018-07-26 16:00:48 +010011 memset(vm, 0, sizeof(*vm));
12
Wedson Almeida Filho87009642018-07-02 10:20:07 +010013 vm->vcpu_count = vcpu_count;
Wedson Almeida Filho2f94ec12018-07-26 16:00:48 +010014 vm->rpc.state = rpc_state_idle;
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +010015
16 /* Do basic initialization of vcpus. */
Andrew Scull7364a8e2018-07-19 15:39:29 +010017 for (i = 0; i < vcpu_count; i++) {
Wedson Almeida Filho87009642018-07-02 10:20:07 +010018 vcpu_init(vm->vcpus + i, vm);
Andrew Scull7364a8e2018-07-19 15:39:29 +010019 }
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +010020
Wedson Almeida Filho84a30a02018-07-23 20:05:05 +010021 return mm_ptable_init(&vm->ptable, id, 0);
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +010022}
23
24/* TODO: Shall we use index or id here? */
Wedson Almeida Filho87009642018-07-02 10:20:07 +010025void vm_start_vcpu(struct vm *vm, size_t index, size_t entry, size_t arg,
26 bool is_primary)
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +010027{
28 struct vcpu *vcpu = vm->vcpus + index;
Wedson Almeida Filho87009642018-07-02 10:20:07 +010029 if (index < vm->vcpu_count) {
30 arch_regs_init(&vcpu->regs, entry, arg, is_primary);
31 vcpu_on(vcpu);
32 }
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +010033}
Wedson Almeida Filho84a30a02018-07-23 20:05:05 +010034
35void vm_set_current(struct vm *vm)
36{
Wedson Almeida Filho52bb3f92018-07-30 15:52:38 +010037 arch_cpu_update(vm == &primary_vm);
Andrew Scull265ada92018-07-30 15:19:01 +010038 arch_mm_set_vm(vm->ptable.id, vm->ptable.table);
Wedson Almeida Filho84a30a02018-07-23 20:05:05 +010039}