Wedson Almeida Filho | 987c0ff | 2018-06-20 16:34:38 +0100 | [diff] [blame] | 1 | #include "vm.h" |
| 2 | |
| 3 | #include "cpu.h" |
Wedson Almeida Filho | 2f94ec1 | 2018-07-26 16:00:48 +0100 | [diff] [blame^] | 4 | #include "std.h" |
Wedson Almeida Filho | 987c0ff | 2018-06-20 16:34:38 +0100 | [diff] [blame] | 5 | |
Wedson Almeida Filho | 84a30a0 | 2018-07-23 20:05:05 +0100 | [diff] [blame] | 6 | bool vm_init(struct vm *vm, uint32_t id, uint32_t vcpu_count) |
Wedson Almeida Filho | 987c0ff | 2018-06-20 16:34:38 +0100 | [diff] [blame] | 7 | { |
Wedson Almeida Filho | 8700964 | 2018-07-02 10:20:07 +0100 | [diff] [blame] | 8 | uint32_t i; |
| 9 | |
Wedson Almeida Filho | 2f94ec1 | 2018-07-26 16:00:48 +0100 | [diff] [blame^] | 10 | memset(vm, 0, sizeof(*vm)); |
| 11 | |
Wedson Almeida Filho | 8700964 | 2018-07-02 10:20:07 +0100 | [diff] [blame] | 12 | vm->vcpu_count = vcpu_count; |
Wedson Almeida Filho | 2f94ec1 | 2018-07-26 16:00:48 +0100 | [diff] [blame^] | 13 | vm->rpc.state = rpc_state_idle; |
Wedson Almeida Filho | 987c0ff | 2018-06-20 16:34:38 +0100 | [diff] [blame] | 14 | |
| 15 | /* Do basic initialization of vcpus. */ |
Andrew Scull | 7364a8e | 2018-07-19 15:39:29 +0100 | [diff] [blame] | 16 | for (i = 0; i < vcpu_count; i++) { |
Wedson Almeida Filho | 8700964 | 2018-07-02 10:20:07 +0100 | [diff] [blame] | 17 | vcpu_init(vm->vcpus + i, vm); |
Andrew Scull | 7364a8e | 2018-07-19 15:39:29 +0100 | [diff] [blame] | 18 | } |
Wedson Almeida Filho | 987c0ff | 2018-06-20 16:34:38 +0100 | [diff] [blame] | 19 | |
Wedson Almeida Filho | 84a30a0 | 2018-07-23 20:05:05 +0100 | [diff] [blame] | 20 | return mm_ptable_init(&vm->ptable, id, 0); |
Wedson Almeida Filho | 987c0ff | 2018-06-20 16:34:38 +0100 | [diff] [blame] | 21 | } |
| 22 | |
| 23 | /* TODO: Shall we use index or id here? */ |
Wedson Almeida Filho | 8700964 | 2018-07-02 10:20:07 +0100 | [diff] [blame] | 24 | void vm_start_vcpu(struct vm *vm, size_t index, size_t entry, size_t arg, |
| 25 | bool is_primary) |
Wedson Almeida Filho | 987c0ff | 2018-06-20 16:34:38 +0100 | [diff] [blame] | 26 | { |
| 27 | struct vcpu *vcpu = vm->vcpus + index; |
Wedson Almeida Filho | 8700964 | 2018-07-02 10:20:07 +0100 | [diff] [blame] | 28 | if (index < vm->vcpu_count) { |
| 29 | arch_regs_init(&vcpu->regs, entry, arg, is_primary); |
| 30 | vcpu_on(vcpu); |
| 31 | } |
Wedson Almeida Filho | 987c0ff | 2018-06-20 16:34:38 +0100 | [diff] [blame] | 32 | } |
Wedson Almeida Filho | 84a30a0 | 2018-07-23 20:05:05 +0100 | [diff] [blame] | 33 | |
| 34 | void vm_set_current(struct vm *vm) |
| 35 | { |
| 36 | arch_mm_set_vm(vm->ptable.id, (paddr_t)vm->ptable.table); |
| 37 | } |