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