Changeset View
Standalone View
sys/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. | |||||
mhorne: If you are moving code around, you need to retain the original copyright holders' names. It is… | |||||
ehem_freebsd_m5p.comAuthorUnsubmitted Done Inline ActionsSee below. ehem_freebsd_m5p.com: See below. | |||||
* | |||||
* 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/cdefs.h> | |||||
__FBSDID("$FreeBSD$"); | |||||
mhorneUnsubmitted Done Inline ActionsFYI, there's not much reason to add these for new files that won't be merged back to stable/12. It is a relic of SVN. mhorne: FYI, there's not much reason to add these for new files that won't be merged back to stable/12. | |||||
#include <sys/types.h> | |||||
#include <sys/param.h> /* required by xen/xen-os.h */ | |||||
mhorneUnsubmitted Done Inline ActionsThe include of sys/types.h is not needed when you include sys/param.h, described in style(9). mhorne: The include of `sys/types.h` is not needed when you include `sys/param.h`, described in `style… | |||||
mhorneUnsubmitted Done Inline ActionsYou can drop this blank line. mhorne: You can drop this blank line. | |||||
#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; | |||||
if (!xen_hvm_domain()) { | |||||
/* | |||||
* Already setup in the PV case, shared_info is passed inside | |||||
* of the start_info struct at start of day. | |||||
*/ | |||||
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(NULL, 0, VM_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); | |||||
mhorneUnsubmitted Not Done Inline ActionsSo, why has this allocation changed? Before it was just a malloc(). Please make semantic changes as separate commits from code moves, when possible. I almost did not see it. mhorne: So, why has this allocation changed? Before it was just a `malloc()`. Please make semantic… | |||||
ehem_freebsd_m5p.comAuthorUnsubmitted Done Inline ActionsWhile it might look at first glance like a move, it is not a move. This is a reimplementation more based on one done by @julien_xen.org, but adjusted to function on x86 (the original was part of the xen-dt.c file and ARM64-only). Most error messages come from @julien_xen.org's implementation, though I did retain the comment from xen_hvm_init_shared_info_page(). Also note xen_pv_domain() was replaced with !xen_hvm_domain() since on ARM64 this is always called during SI_SUB_HYPERVISOR/SI_ORDER_SECOND. As such it needs to cope with being called when Xen is absent (hmm, should modify the comment). ehem_freebsd_m5p.com: While it might look at first glance like a move, it is **not** a move. This is a… | |||||
} | |||||
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"); | |||||
} | |||||
Done Inline ActionsThis function will now be called twice; as part of the SI_SUB_HYPERVISOR sysinit and in xen_hvm_init(). Is this intentional? mhorne: This function will now be called twice; as part of the `SI_SUB_HYPERVISOR` sysinit and in… | |||||
Done Inline ActionsI'm aware. This is less than optimal, but it felt like optimizing things would degrade the implementation. In particular this is likely to be required for all !x86, but as you've noticed it is redundant for x86. xen_hvm_init() needs to function even if called multiple times anyway, so removing the redundant call didn't seem worthwhile. Otherwise the C_SYSINIT() is going to need to be dumped into another !x86 file somewhere and that may mean it is hard to find (right now the candidate which comes to mind is xen-dt.c). Though on second thought this might well be the way to go since the detection of Xen in xen-dt.c is what means this needs to be SI_ORDER_SECOND. ehem_freebsd_m5p.com: I'm aware. This is less than optimal, but it felt like optimizing things would degrade the… | |||||
Done Inline ActionsHaving spent some more time thinking, I'm finding my argument rather compelling. Mainly perhaps xen_dt_probe() really should be calling this. ehem_freebsd_m5p.com: Having spent some more time thinking, I'm finding //my// argument rather compelling. Mainly… | |||||
Done Inline ActionsI agree, best if some other initialization function calls this, rather than the SYSINIT. mhorne: I agree, best if some other initialization function calls this, rather than the SYSINIT. | |||||
Done Inline ActionsProblem with doing the call during xen_dt_probe() is it ends up looking quite ugly. For aarch64 SI_SUB_HYPERVISOR/SI_ORDER_SECOND really looks like the best approach to me. There is a decent argument for the SYSINIT being in xen-dt.c as that avoids a redundant call on x86, but this means the invocation ends up in an almost completely unrelated place strictly for this reason. I'm up for this, but I dislike the separation. ehem_freebsd_m5p.com: Problem with doing the call during xen_dt_probe() is it ends up looking //quite ugly//. For… |
If you are moving code around, you need to retain the original copyright holders' names. It is dubious whether you can claim new copyright here, there is almost no new code.