blob: cadda8628a86b23773760645ef9855d14ed48f5a [file] [log] [blame]
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +01001#include "vm.h"
2
3#include "cpu.h"
Wedson Almeida Filho2f94ec12018-07-26 16:00:48 +01004#include "std.h"
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +01005
Wedson Almeida Filho84a30a02018-07-23 20:05:05 +01006bool vm_init(struct vm *vm, uint32_t id, uint32_t vcpu_count)
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +01007{
Wedson Almeida Filho87009642018-07-02 10:20:07 +01008 uint32_t i;
9
Wedson Almeida Filho2f94ec12018-07-26 16:00:48 +010010 memset(vm, 0, sizeof(*vm));
11
Wedson Almeida Filho87009642018-07-02 10:20:07 +010012 vm->vcpu_count = vcpu_count;
Wedson Almeida Filho2f94ec12018-07-26 16:00:48 +010013 vm->rpc.state = rpc_state_idle;
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +010014
15 /* Do basic initialization of vcpus. */
Andrew Scull7364a8e2018-07-19 15:39:29 +010016 for (i = 0; i < vcpu_count; i++) {
Wedson Almeida Filho87009642018-07-02 10:20:07 +010017 vcpu_init(vm->vcpus + i, vm);
Andrew Scull7364a8e2018-07-19 15:39:29 +010018 }
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +010019
Wedson Almeida Filho84a30a02018-07-23 20:05:05 +010020 return mm_ptable_init(&vm->ptable, id, 0);
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +010021}
22
23/* TODO: Shall we use index or id here? */
Wedson Almeida Filho87009642018-07-02 10:20:07 +010024void vm_start_vcpu(struct vm *vm, size_t index, size_t entry, size_t arg,
25 bool is_primary)
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +010026{
27 struct vcpu *vcpu = vm->vcpus + index;
Wedson Almeida Filho87009642018-07-02 10:20:07 +010028 if (index < vm->vcpu_count) {
29 arch_regs_init(&vcpu->regs, entry, arg, is_primary);
30 vcpu_on(vcpu);
31 }
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +010032}
Wedson Almeida Filho84a30a02018-07-23 20:05:05 +010033
34void vm_set_current(struct vm *vm)
35{
36 arch_mm_set_vm(vm->ptable.id, (paddr_t)vm->ptable.table);
37}