Wedson Almeida Filho | 987c0ff | 2018-06-20 16:34:38 +0100 | [diff] [blame] | 1 | #include "vm.h" |
| 2 | |
| 3 | #include "cpu.h" |
| 4 | |
Wedson Almeida Filho | 8700964 | 2018-07-02 10:20:07 +0100 | [diff] [blame] | 5 | void vm_init(struct vm *vm, uint32_t vcpu_count) |
Wedson Almeida Filho | 987c0ff | 2018-06-20 16:34:38 +0100 | [diff] [blame] | 6 | { |
Wedson Almeida Filho | 8700964 | 2018-07-02 10:20:07 +0100 | [diff] [blame] | 7 | uint32_t i; |
| 8 | |
| 9 | vm->vcpu_count = vcpu_count; |
Wedson Almeida Filho | 987c0ff | 2018-06-20 16:34:38 +0100 | [diff] [blame] | 10 | |
| 11 | /* Do basic initialization of vcpus. */ |
Andrew Scull | 7364a8e | 2018-07-19 15:39:29 +0100 | [diff] [blame^] | 12 | for (i = 0; i < vcpu_count; i++) { |
Wedson Almeida Filho | 8700964 | 2018-07-02 10:20:07 +0100 | [diff] [blame] | 13 | vcpu_init(vm->vcpus + i, vm); |
Andrew Scull | 7364a8e | 2018-07-19 15:39:29 +0100 | [diff] [blame^] | 14 | } |
Wedson Almeida Filho | 987c0ff | 2018-06-20 16:34:38 +0100 | [diff] [blame] | 15 | |
| 16 | arch_vptable_init(&vm->page_table); |
| 17 | } |
| 18 | |
| 19 | /* TODO: Shall we use index or id here? */ |
Wedson Almeida Filho | 8700964 | 2018-07-02 10:20:07 +0100 | [diff] [blame] | 20 | void vm_start_vcpu(struct vm *vm, size_t index, size_t entry, size_t arg, |
| 21 | bool is_primary) |
Wedson Almeida Filho | 987c0ff | 2018-06-20 16:34:38 +0100 | [diff] [blame] | 22 | { |
| 23 | struct vcpu *vcpu = vm->vcpus + index; |
Wedson Almeida Filho | 8700964 | 2018-07-02 10:20:07 +0100 | [diff] [blame] | 24 | if (index < vm->vcpu_count) { |
| 25 | arch_regs_init(&vcpu->regs, entry, arg, is_primary); |
| 26 | vcpu_on(vcpu); |
| 27 | } |
Wedson Almeida Filho | 987c0ff | 2018-06-20 16:34:38 +0100 | [diff] [blame] | 28 | } |