X86_PAT_ENTRY(6, X86_PAT_UCM) | \
X86_PAT_ENTRY(7, X86_PAT_UC))
-#ifndef CONFIG_PARAVIRT
+#ifndef XEN_PARAVIRT
#ifndef __ASSEMBLY__
static inline int ukarch_pte_read(__vaddr_t pt_vaddr, unsigned int lvl,
unsigned int idx, __pte_t *pte)
ukarch_pt_write_base(ukarch_pt_read_base());
}
#endif /* !__ASSEMBLY__ */
-#endif /* !CONFIG_PARAVIRT */
+#endif /* !XEN_PARAVIRT */
$(eval $(call addlib_s,lib9pfront,$(CONFIG_LIB9PFRONT)))
-# FIXME: Extra includes should be removed
-LIB9PFRONT_CFLAGS-y += $(LIBXENPLAT_CFLAGS-y)
-LIB9PFRONT_CINCLUDES-y += $(LIBXENPLAT_CINCLUDES-y)
LIB9PFRONT_SRCS-y += $(LIB9PFRONT_BASE)/9pfront.c
LIB9PFRONT_SRCS-y += $(LIB9PFRONT_BASE)/9pfront_xs.c
$(eval $(call addlib_s,libblkfront,$(CONFIG_LIBBLKFRONT)))
-# FIXME: Extra includes should be removed
-LIBBLKFRONT_CFLAGS-y += $(LIBXENPLAT_CFLAGS-y)
-LIBBLKFRONT_CINCLUDES-y += $(LIBXENPLAT_CINCLUDES-y)
LIBBLKFRONT_SRCS-y += $(LIBBLKFRONT_BASE)/blkfront.c
LIBBLKFRONT_SRCS-y += $(LIBBLKFRONT_BASE)/blkfront_xs.c
$(eval $(call addlib_s,libnetfront,$(CONFIG_LIBNETFRONT)))
-# FIXME: Extra includes should be removed
-LIBNETFRONT_CFLAGS-y += $(LIBXENPLAT_CFLAGS-y)
-LIBNETFRONT_CINCLUDES-y += $(LIBXENPLAT_CINCLUDES-y)
LIBNETFRONT_SRCS-y += $(LIBNETFRONT_BASE)/netfront.c
LIBNETFRONT_SRCS-y += $(LIBNETFRONT_BASE)/netfront_xs.c
$(eval $(call addlib_s,libxenbus,$(CONFIG_LIBXENBUS)))
CINCLUDES-$(CONFIG_LIBXENBUS) += -I$(LIBXENBUS_BASE)/include
-LIBXENBUS_CINCLUDES-y += $(LIBXENPLAT_CINCLUDES-y)
-LIBXENBUS_CFLAGS-y += $(LIBXENPLAT_CFLAGS-y)
LIBXENBUS_SRCS-y += $(LIBXENBUS_BASE)/xenbus.c
LIBXENBUS_SRCS-y += $(LIBXENBUS_BASE)/client.c
LIBXENBUS_SRCS-y += $(LIBXENBUS_BASE)/xs_comms.c
CINCLUDES-$(CONFIG_LIBXENCONS) += -I$(LIBXENCONS_BASE)/include
-# FIXME: Extra includes should be removed
-LIBXENCONS_CFLAGS-y += $(LIBXENPLAT_CFLAGS-y)
-LIBXENCONS_CINCLUDES-y += $(LIBXENPLAT_CINCLUDES-y)
LIBXENCONS_SRCS-y += $(LIBXENCONS_BASE)/console.c|isr
static struct uk_console console_dev;
-#ifdef CONFIG_PARAVIRT
+#ifdef XEN_PARAVIRT
static int hv_console_prepare(struct ukplat_bootinfo *bi __unused)
{
console_ring = mfn_to_virt(HYPERVISOR_start_info->console.domU.mfn);
$(eval $(call addlib_s,libxenemgcon,$(CONFIG_LIBXENEMGCONS)))
-LIBXENEMGCONS_CFLAGS-y += $(LIBXENPLAT_CFLAGS-y)
-LIBXENEMGCONS_CINCLUDES-y += $(LIBXENPLAT_CINCLUDES-y)
-
LIBXENEMGCONS_SRCS-y += $(LIBXENEMGCONS_BASE)/emg_console.c|isr
##
## Xen platform compilation settings
##
-LIBXENPLAT_ASFLAGS-y += -DXENPLAT -D__XEN_INTERFACE_VERSION__=$(XEN_INTERFACE_VERSION)
-LIBXENPLAT_CFLAGS-y += -DXENPLAT -D__XEN_INTERFACE_VERSION__=$(XEN_INTERFACE_VERSION)
-LIBXENPLAT_CXXFLAGS-y += -DXENPLAT -D__XEN_INTERFACE_VERSION__=$(XEN_INTERFACE_VERSION)
+# TODO: For now, we set the Xen interface options here. These options are
+# picked up by `libxenheaders` and thereby have an influence on the
+# Xen drivers (e.g., XenBus, netfront).
+# With the re-structuring of the Xen platform library, we should find a
+# a better place for this: probably with a Xen boot/entry driver.
+ASFLAGS-$(CONFIG_PLAT_XEN) += -D__XEN_INTERFACE_VERSION__=$(XEN_INTERFACE_VERSION)
+CFLAGS-$(CONFIG_PLAT_XEN) += -D__XEN_INTERFACE_VERSION__=$(XEN_INTERFACE_VERSION)
+CXXFLAGS-$(CONFIG_PLAT_XEN) += -D__XEN_INTERFACE_VERSION__=$(XEN_INTERFACE_VERSION)
+ifeq ($(CONFIG_ARCH_ARM_64), y)
+CFLAGS-$(CONFIG_PLAT_XEN) += -DXEN_HAVE_PV_GUEST_ENTRY
+endif
+
+LIBXENPLAT_ASFLAGS-y += -DXENPLAT
+LIBXENPLAT_CFLAGS-y += -DXENPLAT
+LIBXENPLAT_CXXFLAGS-y += -DXENPLAT
LIBXENPLAT_ASFLAGS-y += -DUK_USE_SECTION_SEGMENTS
LIBXENPLAT_CFLAGS-y += -DUK_USE_SECTION_SEGMENTS
LIBXENPLAT_CXXFLAGS-y += -DUK_USE_SECTION_SEGMENTS
-ifeq ($(CONFIG_ARCH_ARM_64), y)
-LIBXENPLAT_CFLAGS-y += -DXEN_HAVE_PV_GUEST_ENTRY
-endif
##
## Default Linker script
ifeq ($(CONFIG_ARCH_X86_64),y)
##
## Platform library definitions
##
-LIBXENPLAT_ASINCLUDES-y += -I$(LIBXENPLAT_BASE)/include
-LIBXENPLAT_ASINCLUDES-y += -I$(UK_PLAT_COMMON_BASE)/include
-LIBXENPLAT_CINCLUDES-y += -I$(LIBXENPLAT_BASE)/include
-LIBXENPLAT_CINCLUDES-y += -I$(UK_PLAT_COMMON_BASE)/include
-LIBXENPLAT_CINCLUDES-y += -I$(UK_PLAT_DRIVERS_BASE)/include
+# TODO: We intend to decompose(re-arch) the `libxenplat` library into
+# individual driver libraries (e.g., CPU, memory). With this in place
+# we aim a cleaner organization of these headers.
+# NOTE: We globally export these header includes because they are currently
+# forming the API of `libxenplat`.
+ASINCLUDES-$(CONFIG_PLAT_XEN) += -I$(LIBXENPLAT_BASE)/include
+ASINCLUDES-$(CONFIG_PLAT_XEN) += -I$(UK_PLAT_COMMON_BASE)/include
+CINCLUDES-$(CONFIG_PLAT_XEN) += -I$(LIBXENPLAT_BASE)/include
+CINCLUDES-$(CONFIG_PLAT_XEN) += -I$(UK_PLAT_COMMON_BASE)/include
+CINCLUDES-$(CONFIG_PLAT_XEN) += -I$(UK_PLAT_DRIVERS_BASE)/include
LIBXENPLAT_SRCS-y += $(UK_PLAT_XEN_DEF_LDS)
LIBXENPLAT_SRCS-y += $(LIBXENPLAT_BASE)/hypervisor.c
LIBXENPLAT_SRCS-$(CONFIG_ARCH_X86_64) += $(LIBXENPLAT_BASE)/x86/arch_time.c
ifneq ($(CONFIG_XEN_HVMLITE),y)
-LIBXENPLAT_ASFLAGS-y += -DCONFIG_PARAVIRT
-LIBXENPLAT_CFLAGS-y += -DCONFIG_PARAVIRT
+# NOTE: Compile flag needed for being able to correctly use `libxenplat`
+# headers: xen-x86/irq.h, xen-x86/mm.h
+ASFLAGS-$(CONFIG_PLAT_XEN) += -DXEN_PARAVIRT
+CFLAGS-$(CONFIG_PLAT_XEN) += -DXEN_PARAVIRT
LIBXENPLAT_SRCS-$(CONFIG_ARCH_X86_64) += $(LIBXENPLAT_BASE)/x86/cpu_pv.c
else
LIBXENPLAT_SRCS-$(CONFIG_ARCH_X86_64) += $(UK_PLAT_COMMON_BASE)/x86/cpu_native.c
#ifndef PLAT_XEN_INCLUDE_XEN_X86_IRQ_H_
#define PLAT_XEN_INCLUDE_XEN_X86_IRQ_H_
-#ifdef CONFIG_PARAVIRT
+#ifdef XEN_PARAVIRT
#include <common/hypervisor.h>
#include <xen-x86/smp.h>
#define CONST(x) x
#endif
-#ifdef CONFIG_PARAVIRT
+#ifdef XEN_PARAVIRT
#include <xen-x86/mm_pv.h>
#endif
typedef unsigned long maddr_t;
extern pgentry_t *pt_base;
-#ifdef CONFIG_PARAVIRT
+#ifdef XEN_PARAVIRT
extern unsigned long *phys_to_machine_mapping;
#endif
4:.align 4 ; \
.popsection
-#ifdef CONFIG_PARAVIRT
+#ifdef XEN_PARAVIRT
ELFNOTE(Xen, XEN_ELFNOTE_GUEST_OS, .asciz "Unikraft")
ELFNOTE(Xen, XEN_ELFNOTE_LOADER, .asciz "generic")
ELFNOTE(Xen, XEN_ELFNOTE_HYPERCALL_PAGE, _WORD hypercall_page)
/* Macros */
.macro SAVE_PARAVIRT
-#ifdef CONFIG_PARAVIRT
+#ifdef XEN_PARAVIRT
pop %rcx
pop %r11 /* rsp points to the error code */
#endif
.endm
.macro HYPERVISOR_IRET
-#ifdef CONFIG_PARAVIRT
+#ifdef XEN_PARAVIRT
testl $NMI_MASK,2*8(%rsp)
jnz 2f
#endif
iretq
-#ifdef CONFIG_PARAVIRT
+#ifdef XEN_PARAVIRT
2: /* Slow iret via hypervisor. */
andl $~NMI_MASK, 16(%rsp)
pushq $0
jmp error_exit
-#ifdef CONFIG_PARAVIRT
+#ifdef XEN_PARAVIRT
/*
* Xen event (virtual interrupt) entry point.
*/
#endif
ENTRY(asm_failsafe_callback)
-#ifdef CONFIG_PARAVIRT
+#ifdef XEN_PARAVIRT
popq %rcx
popq %r11
#endif
#include <uk/print.h>
#include <uk/assert.h>
-#ifdef CONFIG_PARAVIRT
+#ifdef XEN_PARAVIRT
#include <xen-x86/mm_pv.h>
unsigned long *phys_to_machine_mapping;
#endif
{
pgentry_t *tab;
unsigned long pt_page = (unsigned long)pfn_to_virt(*pt_pfn);
-#ifdef CONFIG_PARAVIRT
+#ifdef XEN_PARAVIRT
mmu_update_t mmu_updates[1];
int rc;
#endif
UK_ASSERT(level >= 1 && level <= PAGETABLE_LEVELS);
-#ifdef CONFIG_PARAVIRT
+#ifdef XEN_PARAVIRT
/* Make PFN a page table page */
tab = pt_base;
#if defined(__x86_64__)
pgentry_t *tab = pt_base, page;
unsigned long pt_mfn = pfn_to_mfn(virt_to_pfn(pt_base));
unsigned long offset;
-#ifdef CONFIG_PARAVIRT
+#ifdef XEN_PARAVIRT
static mmu_update_t mmu_updates[L1_PAGETABLE_ENTRIES + 1];
int count = 0;
int rc;
mapped, start the loop at the very beginning. */
pfn_to_map = *start_pfn;
-#ifdef CONFIG_PARAVIRT
+#ifdef XEN_PARAVIRT
if ( *max_pfn >= virt_to_pfn(HYPERVISOR_VIRT_START) )
{
uk_pr_warn("Trying to use Xen virtual space. "
pt_mfn = pte_to_mfn(page);
tab = to_virt(mfn_to_pfn(pt_mfn) << PAGE_SHIFT);
offset = l2_table_offset(start_address);
-#ifdef CONFIG_PARAVIRT
+#ifdef XEN_PARAVIRT
/* Need new L1 pt frame */
if ( !(tab[offset] & _PAGE_PRESENT) )
new_pt_frame(&pt_pfn, pt_mfn, offset, L1_FRAME);
memset(err, 0, n * sizeof(int));
while (mapped < n) {
-#ifdef CONFIG_PARAVIRT
+#ifdef XEN_PARAVIRT
unsigned long i;
int rc;
unsigned long batched;
#define UNMAP_BATCH ((STACK_SIZE / 4) / sizeof(multicall_entry_t))
int unmap_frames(unsigned long va, unsigned long num_frames)
{
-#ifdef CONFIG_PARAVIRT
+#ifdef XEN_PARAVIRT
unsigned long i, n = UNMAP_BATCH;
multicall_entry_t call[n];
int ret;
(void *) va, num_frames);
while (num_frames) {
-#ifdef CONFIG_PARAVIRT
+#ifdef XEN_PARAVIRT
if (n > num_frames)
n = num_frames;
unsigned long mfn;
unsigned long offset;
unsigned long page_size = PAGE_SIZE;
-#ifdef CONFIG_PARAVIRT
+#ifdef XEN_PARAVIRT
static mmu_update_t mmu_updates[L1_PAGETABLE_ENTRIES + 1];
int count = 0;
int rc;
if ( start_address != (unsigned long)&_libxenplat_shared_info )
{
-#ifdef CONFIG_PARAVIRT
+#ifdef XEN_PARAVIRT
mmu_updates[count].ptr =
((pgentry_t)mfn << PAGE_SHIFT) + sizeof(pgentry_t) * offset;
mmu_updates[count].val = tab[offset] & ~_PAGE_RW;
start_address += page_size;
-#ifdef CONFIG_PARAVIRT
+#ifdef XEN_PARAVIRT
if ( count == L1_PAGETABLE_ENTRIES ||
start_address + page_size > end_address )
{
#endif
}
-#ifdef CONFIG_PARAVIRT
+#ifdef XEN_PARAVIRT
{
mmuext_op_t op = {
.cmd = MMUEXT_TLB_FLUSH_ALL,
*/
void _init_mem_clear_bootstrap(void)
{
-#ifdef CONFIG_PARAVIRT
+#ifdef XEN_PARAVIRT
pte_t nullpte = { };
int rc;
#endif
/* Use first page as the CoW zero page */
memset((void *)__TEXT, 0, PAGE_SIZE);
mfn_zero = virt_to_mfn(__TEXT);
-#ifdef CONFIG_PARAVIRT
+#ifdef XEN_PARAVIRT
if ( (rc = HYPERVISOR_update_va_mapping(0, nullpte, UVMF_INVLPG)) )
uk_pr_err("Unable to unmap NULL page. rc=%d\n", rc);
#endif
void _init_mem_prepare(unsigned long *start_pfn, unsigned long *max_pfn)
{
-#ifdef CONFIG_PARAVIRT
+#ifdef XEN_PARAVIRT
phys_to_machine_mapping = (unsigned long *)HYPERVISOR_start_info->mfn_list;
pt_base = (pgentry_t *)HYPERVISOR_start_info->pt_base;
*start_pfn = PFN_UP(to_phys(pt_base)) + HYPERVISOR_start_info->nr_pt_frames;
DECLARE_TRAP (spurious_int, "spurious interrupt bug", NULL)
-#ifdef CONFIG_PARAVIRT
+#ifdef XEN_PARAVIRT
#define TRAP_TABLE_ENTRY(trapname, pl) \
{ TRAP_##trapname, pl, __KERNEL_CS, (unsigned long) ASM_TRAP_SYM(trapname) }