1 /*- 2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 3 * 4 * Copyright 2020 Conrad Meyer <cem@FreeBSD.org>. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 */ 27 #include <sys/cdefs.h> 28 __FBSDID("$FreeBSD$"); 29 30 #include <sys/param.h> 31 #include <sys/errno.h> 32 #include <sys/tree.h> 33 34 #include <amd64/include/vmm.h> 35 #include <x86/include/apicreg.h> 36 struct vm; 37 struct vm_hpet_cap; 38 #include <vmm/io/vioapic.h> 39 #include <vmm/io/vhpet.h> 40 41 #include <err.h> 42 #include <errno.h> 43 #include <vmmapi.h> 44 45 #include "kernemu_dev.h" 46 #include "mem.h" 47 48 static int 49 apic_handler(struct vmctx *ctx, int vcpu, int dir, uint64_t addr, int size, 50 uint64_t *val, void *arg1 __unused, long arg2 __unused) 51 { 52 if (vm_readwrite_kernemu_device(ctx, vcpu, addr, (dir == MEM_F_WRITE), 53 size, val) != 0) 54 return (errno); 55 return (0); 56 } 57 58 static struct mem_range lapic_mmio = { 59 .name = "kern-lapic-mmio", 60 .base = DEFAULT_APIC_BASE, 61 .size = PAGE_SIZE, 62 .flags = MEM_F_RW | MEM_F_IMMUTABLE, 63 .handler = apic_handler, 64 65 }; 66 static struct mem_range ioapic_mmio = { 67 .name = "kern-ioapic-mmio", 68 .base = VIOAPIC_BASE, 69 .size = VIOAPIC_SIZE, 70 .flags = MEM_F_RW | MEM_F_IMMUTABLE, 71 .handler = apic_handler, 72 }; 73 static struct mem_range hpet_mmio = { 74 .name = "kern-hpet-mmio", 75 .base = VHPET_BASE, 76 .size = VHPET_SIZE, 77 .flags = MEM_F_RW | MEM_F_IMMUTABLE, 78 .handler = apic_handler, 79 }; 80 81 void 82 kernemu_dev_init(void) 83 { 84 int rc; 85 86 rc = register_mem(&lapic_mmio); 87 if (rc != 0) 88 errc(4, rc, "register_mem: LAPIC (0x%08x)", 89 (unsigned)lapic_mmio.base); 90 rc = register_mem(&ioapic_mmio); 91 if (rc != 0) 92 errc(4, rc, "register_mem: IOAPIC (0x%08x)", 93 (unsigned)ioapic_mmio.base); 94 rc = register_mem(&hpet_mmio); 95 if (rc != 0) 96 errc(4, rc, "register_mem: HPET (0x%08x)", 97 (unsigned)hpet_mmio.base); 98 } 99