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