Changeset View
Changeset View
Standalone View
Standalone View
sys/xen/xen_common.c
- This file was added.
/*- | |||||
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD | |||||
* | |||||
* Copyright (c) 2021 Elliott Mitchell | |||||
* Copyright (c) 2014 Julien Grall | |||||
* All rights reserved. | |||||
* | |||||
* Redistribution and use in source and binary forms, with or without | |||||
* modification, are permitted provided that the following conditions | |||||
* are met: | |||||
* 1. Redistributions of source code must retain the above copyright | |||||
* notice, this list of conditions and the following disclaimer. | |||||
* 2. Redistributions in binary form must reproduce the above copyright | |||||
* notice, this list of conditions and the following disclaimer in the | |||||
* documentation and/or other materials provided with the distribution. | |||||
* | |||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND | |||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE | |||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
* SUCH DAMAGE. | |||||
*/ | |||||
#include <sys/param.h> /* required by xen/xen-os.h */ | |||||
#include <sys/kernel.h> | |||||
#include <vm/vm.h> | |||||
#include <vm/vm_page.h> | |||||
#include <machine/atomic.h> /* required by xen/xen-os.h */ | |||||
#include <xen/xen-os.h> | |||||
#include <xen/hvm.h> | |||||
#include <xen/interface/event_channel.h> | |||||
#include <xen/interface/hvm/params.h> | |||||
/*-------------------------------- Global Data -------------------------------*/ | |||||
enum xen_domain_type xen_domain_type = XEN_NATIVE; | |||||
/** | |||||
* Start info flags. ATM this only used to store the initial domain flag for | |||||
* PVHv2, and it's always empty for HVM guests. | |||||
*/ | |||||
uint32_t hvm_start_flags; | |||||
/*------------------ Hypervisor Access Shared Memory Regions -----------------*/ | |||||
shared_info_t *HYPERVISOR_shared_info = NULL; | |||||
void | |||||
xen_handle_shared_info(void) | |||||
{ | |||||
struct xen_add_to_physmap xatp; | |||||
vm_page_t shared_info; | |||||
/* | |||||
* Already setup in the PV case, shared_info is passed inside of the | |||||
* start_info struct at start of day. Also, don't try to initialize if | |||||
* not running on Xen. | |||||
*/ | |||||
if (!xen_hvm_domain()) | |||||
return; | |||||
/* | |||||
* We expect to be called multiple times, the shared info page needs | |||||
* to be re-registered on resume. | |||||
*/ | |||||
if (HYPERVISOR_shared_info == NULL) { | |||||
shared_info = vm_page_alloc_noobj(VM_ALLOC_ZERO); | |||||
if (shared_info == NULL) | |||||
panic("Unable to allocate Xen shared info page\n"); | |||||
HYPERVISOR_shared_info = pmap_mapdev_attr( | |||||
VM_PAGE_TO_PHYS(shared_info), PAGE_SIZE, VM_MEMATTR_XEN); | |||||
} | |||||
xatp.domid = DOMID_SELF; | |||||
xatp.idx = 0; | |||||
xatp.space = XENMAPSPACE_shared_info; | |||||
xatp.gpfn = vtophys(HYPERVISOR_shared_info) >> PAGE_SHIFT; | |||||
if (HYPERVISOR_memory_op(XENMEM_add_to_physmap, &xatp)) | |||||
panic("Unable to map shared info\n"); | |||||
} |