1 // Copyright 2017 The Fuchsia Authors
2 //
3 // Use of this source code is governed by a MIT-style
4 // license that can be found in the LICENSE file or at
5 // https://opensource.org/licenses/MIT
6 
7 #pragma once
8 
9 #include <object/dispatcher.h>
10 #include <zircon/rights.h>
11 
12 class GuestDispatcher;
13 class Vcpu;
14 class VmObject;
15 
16 typedef struct zx_port_packet zx_port_packet_t;
17 
18 class VcpuDispatcher final : public SoloDispatcher<VcpuDispatcher, ZX_DEFAULT_VCPU_RIGHTS> {
19 public:
20     static zx_status_t Create(fbl::RefPtr<GuestDispatcher> guest_dispatcher, zx_vaddr_t entry,
21                               fbl::RefPtr<Dispatcher>* dispatcher, zx_rights_t* rights);
22     ~VcpuDispatcher();
23 
get_type()24     zx_obj_type_t get_type() const { return ZX_OBJ_TYPE_VCPU; }
guest()25     const fbl::RefPtr<GuestDispatcher>& guest() const { return guest_; }
26 
27     zx_status_t Resume(zx_port_packet_t* packet);
28     // Adds an interrupt vector to the list of pending interrupts. If the VCPU
29     // is running, this returns a CPU mask that can be used to interrupt it.
30     cpu_mask_t PhysicalInterrupt(uint32_t vector);
31     void VirtualInterrupt(uint32_t vector);
32     zx_status_t ReadState(uint32_t kind, void* buffer, size_t len) const;
33     zx_status_t WriteState(uint32_t kind, const void* buffer, size_t len);
34 
35 private:
36     fbl::Canary<fbl::magic("VCPD")> canary_;
37     fbl::RefPtr<GuestDispatcher> guest_;
38     ktl::unique_ptr<Vcpu> vcpu_;
39 
40     explicit VcpuDispatcher(fbl::RefPtr<GuestDispatcher> guest, ktl::unique_ptr<Vcpu> vcpu);
41 };
42