Path: blob/main/usr.sbin/bhyve/aarch64/mem_aarch64.c
108119 views
/*-1* SPDX-License-Identifier: BSD-2-Clause2*3* Copyright (c) 2025 The FreeBSD Foundation4*5* This software was developed by Konstantin Belousov <[email protected]>6* under sponsorship from the FreeBSD Foundation.7*8* Redistribution and use in source and binary forms, with or without9* modification, are permitted provided that the following conditions10* are met:11* 1. Redistributions of source code must retain the above copyright12* notice, this list of conditions and the following disclaimer.13* 2. Redistributions in binary form must reproduce the above copyright14* notice, this list of conditions and the following disclaimer in the15* documentation and/or other materials provided with the distribution.16*17* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND18* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE19* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE20* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE21* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL22* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS23* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)24* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT25* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY26* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF27* SUCH DAMAGE.28*/2930#include <sys/types.h>31#define _WANT_KERNEL_ERRNO 132#include <sys/errno.h>33#include <sys/tree.h>34#include <machine/armreg.h>35#include <machine/vmm.h>36#include <machine/vmm_instruction_emul.h>37#include <vmmapi.h>3839#include "mem.h"4041int42mmio_handle_non_backed_mem(struct vcpu *vcpu, uint64_t paddr,43struct mem_range **mr_paramp __unused)44{45int err;46uint64_t spsr, esr;4748if (vm_get_register(vcpu, VM_REG_GUEST_CPSR, &spsr) == -1)49return (errno);50if ((spsr & PSR_M_MASK) == PSR_M_EL0t)51esr = EXCP_DATA_ABORT_L << ESR_ELx_EC_SHIFT;52else53esr = EXCP_DATA_ABORT << ESR_ELx_EC_SHIFT;54esr |= ESR_ELx_IL | ISS_DATA_DFSC_EXT;55err = vm_inject_exception(vcpu, esr, paddr);56return (err != 0 ? err : EJUSTRETURN);57}585960