blob: eb5fd2a7ff6a113bc24a82898b35b8b9173ed150 [file] [log] [blame]
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +01001#ifndef _VM_H
2#define _VM_H
3
4#include "cpu.h"
Wedson Almeida Filho84a30a02018-07-23 20:05:05 +01005#include "mm.h"
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +01006
Wedson Almeida Filho2f94ec12018-07-26 16:00:48 +01007enum rpc_state {
8 rpc_state_idle,
9 rpc_state_pending,
10 rpc_state_inflight,
11};
12
13struct rpc {
14 enum rpc_state state;
15 int16_t recv_bytes;
16 void *recv;
17 const void *send;
18 struct vcpu *recv_waiter;
19};
20
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +010021struct vm {
Wedson Almeida Filho2f94ec12018-07-26 16:00:48 +010022 struct spinlock lock;
23 struct rpc rpc;
Wedson Almeida Filho84a30a02018-07-23 20:05:05 +010024 struct mm_ptable ptable;
Wedson Almeida Filho87009642018-07-02 10:20:07 +010025 uint32_t vcpu_count;
Wedson Almeida Filho84a30a02018-07-23 20:05:05 +010026 struct vcpu vcpus[MAX_CPUS];
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +010027};
28
Wedson Almeida Filho84a30a02018-07-23 20:05:05 +010029bool vm_init(struct vm *vm, uint32_t id, uint32_t vcpu_count);
Andrew Scull1b8d0442018-08-06 15:47:04 +010030void vm_start_vcpu(struct vm *vm, size_t index, ipaddr_t entry, size_t arg,
Wedson Almeida Filho87009642018-07-02 10:20:07 +010031 bool is_primary);
Wedson Almeida Filho84a30a02018-07-23 20:05:05 +010032void vm_set_current(struct vm *vm);
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +010033
Andrew Scull4f170f52018-07-19 12:58:20 +010034#endif /* _VM_H */