Files
xen/tools/libxc/xc_core.h
T
Julien Grall 84f2484db4 libxc: introduce a per architecture scratch pfn for temporary grant mapping
The code to initialize the grant table in libxc uses
xc_domain_maximum_gpfn() + 1 to get a guest pfn for mapping the grant
frame and to initialize it.

This solution has two major issues:
    - The check of the return of xc_domain_maximum_gpfn is buggy because
    xen_pfn_t is unsigned and in case of an error -ERRNO is returned.
    Which is never catch with ( pfn <= 0 ).
    - The guest memory layout maybe filled up to the end, i.e
    xc_domain_maximum_gpfn() + 1 gives either 0 or an invalid PFN due to
    hardware limitation.

Futhermore, on ARM, xc_domain_maximum_gpfn() is not implemented and
return -ENOSYS. This will make libxc to use always the same PFN which
may colapse with an already mapped region (see xen/include/public/arch-arm.h
for the layout).

This patch only address the problem for ARM, the x86 version use the same
behavior (ie xc_domain_maximum_gpfn() + 1), as I'm not familiar with Xen x86.

A new function xc_core_arch_get_scratch_gpfn is introduced to be able to
choose the gpfn per architecture.

For the ARM version, we use the GUEST_GNTTAB_GUEST which is the base of
the region by the guest to map the grant table. At the build time,
nothing is mapped there.

At the same time correctly check the return of xc_domain_maximum_gpfn
for x86.

Signed-off-by: Julien Grall <julien.grall@linaro.org>
Cc: Jan Beulich <jbeulich@suse.com>
Cc: Andrew Cooper <andrew.cooper3@citrix.com>
Cc: Roger Pau Monné <roger.pau@citrix.com>
Cc: Ian Jackson <ian.jackson@eu.citrix.com>
Cc: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Cc: Ian Campbell <ian.campbell@citrix.com>
Cc: Wei Liu <wei.liu2@citrix.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
(cherry picked from commit 5b5c40c0d1)
2015-02-16 14:45:56 +00:00

178 lines
5.8 KiB
C

/*
* Copyright (c) 2006 Isaku Yamahata <yamahata at valinux co jp>
* VA Linux Systems Japan K.K.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
#ifndef XC_CORE_H
#define XC_CORE_H
#include "xen/version.h"
#include "xg_private.h"
#include "xen/libelf/elfstructs.h"
/* section names */
#define XEN_DUMPCORE_SEC_NOTE ".note.Xen"
#define XEN_DUMPCORE_SEC_PRSTATUS ".xen_prstatus"
#define XEN_DUMPCORE_SEC_SHARED_INFO ".xen_shared_info"
#define XEN_DUMPCORE_SEC_P2M ".xen_p2m"
#define XEN_DUMPCORE_SEC_PFN ".xen_pfn"
#define XEN_DUMPCORE_SEC_PAGES ".xen_pages"
/* elf note name */
#define XEN_DUMPCORE_ELFNOTE_NAME "Xen"
/* note numbers are defined in xen/elfnote.h */
struct elfnote {
uint32_t namesz; /* Elf_Note note; */
uint32_t descsz;
uint32_t type;
char name[4]; /* sizeof("Xen") = 4
* Fotunately this is 64bit aligned so that
* we can use same structore for both 32/64bit
*/
};
struct xen_dumpcore_elfnote_none_desc {
/* nothing */
};
struct xen_dumpcore_elfnote_header_desc {
uint64_t xch_magic;
uint64_t xch_nr_vcpus;
uint64_t xch_nr_pages;
uint64_t xch_page_size;
};
struct xen_dumpcore_elfnote_xen_version_desc {
uint64_t major_version;
uint64_t minor_version;
xen_extraversion_t extra_version;
xen_compile_info_t compile_info;
xen_capabilities_info_t capabilities;
xen_changeset_info_t changeset;
xen_platform_parameters_t platform_parameters;
uint64_t pagesize;
};
#define XEN_DUMPCORE_FORMAT_VERSION(major, minor) \
((major) << 32) | ((minor) & 0xffffffff)
#define XEN_DUMPCORE_FORMAT_MAJOR(version) ((major) >> 32)
#define XEN_DUMPCORE_FORMAT_MINOR(version) ((minor) & 0xffffffff)
#define XEN_DUMPCORE_FORMAT_MAJOR_CURRENT ((uint64_t)0)
#define XEN_DUMPCORE_FORMAT_MINOR_CURRENT ((uint64_t)1)
#define XEN_DUMPCORE_FORMAT_VERSION_CURRENT \
XEN_DUMPCORE_FORMAT_VERSION(XEN_DUMPCORE_FORMAT_MAJOR_CURRENT, \
XEN_DUMPCORE_FORMAT_MINOR_CURRENT)
struct xen_dumpcore_elfnote_format_version_desc {
uint64_t version;
};
struct xen_dumpcore_elfnote_none {
struct elfnote elfnote;
struct xen_dumpcore_elfnote_none_desc none;
};
struct xen_dumpcore_elfnote_header {
struct elfnote elfnote;
struct xen_dumpcore_elfnote_header_desc header;
};
struct xen_dumpcore_elfnote_xen_version {
struct elfnote elfnote;
struct xen_dumpcore_elfnote_xen_version_desc xen_version;
};
struct xen_dumpcore_elfnote_format_version {
struct elfnote elfnote;
struct xen_dumpcore_elfnote_format_version_desc format_version;
};
#define XC_CORE_INVALID_PFN (~(uint64_t)0)
#define XC_CORE_INVALID_GMFN (~(uint64_t)0)
struct xen_dumpcore_p2m {
uint64_t pfn;
uint64_t gmfn;
};
struct xc_core_strtab;
struct xc_core_section_headers;
Elf64_Shdr*
xc_core_shdr_get(xc_interface *xch,
struct xc_core_section_headers *sheaders);
int
xc_core_shdr_set(xc_interface *xch,
Elf64_Shdr *shdr,
struct xc_core_strtab *strtab,
const char *name, uint32_t type,
uint64_t offset, uint64_t size,
uint64_t addralign, uint64_t entsize);
struct xc_core_memory_map {
uint64_t addr;
uint64_t size;
};
typedef struct xc_core_memory_map xc_core_memory_map_t;
int xc_core_arch_auto_translated_physmap(const xc_dominfo_t *info);
struct xc_core_arch_context;
int xc_core_arch_memory_map_get(xc_interface *xch,
struct xc_core_arch_context *arch_ctxt,
xc_dominfo_t *info, shared_info_any_t *live_shinfo,
xc_core_memory_map_t **mapp,
unsigned int *nr_entries);
int xc_core_arch_map_p2m(xc_interface *xch, unsigned int guest_width,
xc_dominfo_t *info, shared_info_any_t *live_shinfo,
xen_pfn_t **live_p2m, unsigned long *pfnp);
int xc_core_arch_map_p2m_writable(xc_interface *xch, unsigned int guest_width,
xc_dominfo_t *info,
shared_info_any_t *live_shinfo,
xen_pfn_t **live_p2m, unsigned long *pfnp);
int xc_core_arch_get_scratch_gpfn(xc_interface *xch, domid_t domid,
xen_pfn_t *gpfn);
#if defined (__i386__) || defined (__x86_64__)
# include "xc_core_x86.h"
#elif defined (__arm__) || defined(__aarch64__)
# include "xc_core_arm.h"
#else
# error "unsupported architecture"
#endif
#ifndef ELF_CORE_EFLAGS
# define ELF_CORE_EFLAGS 0
#endif
#endif /* XC_CORE_H */
/*
* Local variables:
* mode: C
* c-file-style: "BSD"
* c-basic-offset: 4
* tab-width: 4
* indent-tabs-mode: nil
* End:
*/