/* * \brief Gicv2 with virtualization extensions * \author Stefan Kalkowski * \date 2019-09-02 */ /* * Copyright (C) 2019 Genode Labs GmbH * * This file is part of the Genode OS framework, which is distributed * under the terms of the GNU Affero General Public License version 3. */ #include #include #include using Board::Pic; Pic::Gich::Gich() : Genode::Mmio(Genode::Platform::mmio_to_virt(Board::Cpu_mmio::IRQ_CONTROLLER_VT_CTRL_BASE)) { } bool Pic::ack_virtual_irq(Pic::Virtual_context & c) { c.misr = _gich.read(); c.vmcr = _gich.read(); c.apr = _gich.read(); c.eisr = _gich.read(); c.elrsr = _gich.read(); c.lr = _gich.read(); _gich.write(0); if (c.eisr & 1) { c.lr = 0; c.elrsr = 0xffffffff; c.misr = 0; c.eisr = 0; return true; } return false; } void Pic::insert_virtual_irq(Pic::Virtual_context & c, unsigned irq) { enum { SPURIOUS = 1023 }; if (irq != SPURIOUS && !c.lr) { c.elrsr &= 0x7ffffffe; c.lr = irq | 1 << 28 | 1 << 19; } _gich.write(c.misr); _gich.write(c.vmcr); _gich.write(c.apr); _gich.write(c.elrsr); _gich.write(c.lr); _gich.write(0b1); }