| // Copyright 2018 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "src/virtualization/bin/vmm/io.h" |
| |
| #include <lib/syslog/cpp/macros.h> |
| #include <lib/zx/port.h> |
| #include <zircon/syscalls/hypervisor.h> |
| |
| #include "src/virtualization/bin/vmm/guest.h" |
| |
| static constexpr IoValue kBellValue = {}; |
| |
| IoMapping::IoMapping(uint32_t kind, zx_gpaddr_t base, size_t size, zx_gpaddr_t off, |
| IoHandler* handler) |
| : kind_(kind), base_(base), size_(size), off_(off), handler_(handler), async_trap_(this) {} |
| |
| zx_status_t IoMapping::SetTrap(Guest* guest, async_dispatcher_t* dispatcher) { |
| if (kind_ == ZX_GUEST_TRAP_BELL) { |
| return async_trap_.SetTrap(dispatcher, guest->object(), base_, size_); |
| } else { |
| uintptr_t key = reinterpret_cast<uintptr_t>(this); |
| return guest->object().set_trap(kind_, base_, size_, zx::port(), key); |
| } |
| } |
| |
| void IoMapping::CallIoHandlerAsync(async_dispatcher_t* dispatcher, async::GuestBellTrapBase* trap, |
| zx_status_t status, const zx_packet_guest_bell_t* bell) { |
| FX_CHECK(Write(bell->addr, kBellValue) == ZX_OK) << "Failed to handle async IO"; |
| } |