Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch Introduce Xen PVH support in GENERIC.
details: https://anonhg.NetBSD.org/src/rev/e06a939c79eb
branches: trunk
changeset: 932224:e06a939c79eb
user: bouyer <bouyer%NetBSD.org@localhost>
date: Sat May 02 16:44:34 2020 +0000
description:
Introduce Xen PVH support in GENERIC.
This is compiled in with
options XENPVHVM
x86 changes:
- add Xen section and xen pvh entry points to locore.S. Set vm_guest
to VM_GUEST_XENPVH in this entry point.
Most of the boot procedure (especially page table setup and switch to
paged mode) is shared with native.
- change some x86_delay() to delay_func(), which points to x86_delay() for
native/HVM, and xen_delay() for PVH
Xen changes:
- remove Xen bits from init_x86_64_ksyms() and init386_ksyms()
and move to xen_init_ksyms(), used for both PV and PVH
- set ISA no-legacy-devices property for PVH
- factor out code from Xen's cpu_bootconf() to xen_bootconf()
in xen_machdep.c
- set up a specific pvh_consinit() which starts with printk()
(which uses a simple hypercall that is available early) and switch to
xencons when we can use pmap_kenter_pa().
diffstat:
sys/arch/amd64/amd64/autoconf.c | 11 +-
sys/arch/amd64/amd64/genassym.cf | 6 +-
sys/arch/amd64/amd64/locore.S | 89 +++++++++++-
sys/arch/amd64/amd64/machdep.c | 31 ++-
sys/arch/amd64/conf/GENERIC | 5 +-
sys/arch/i386/i386/autoconf.c | 11 +-
sys/arch/i386/i386/genassym.cf | 6 +-
sys/arch/i386/i386/locore.S | 140 +++++++++++++++---
sys/arch/i386/i386/machdep.c | 28 +++-
sys/arch/x86/acpi/acpi_machdep.c | 15 +-
sys/arch/x86/include/cpu.h | 14 +-
sys/arch/x86/isa/clock.c | 9 +-
sys/arch/x86/isa/isa_machdep.c | 7 +-
sys/arch/x86/x86/consinit.c | 15 +-
sys/arch/x86/x86/cpu.c | 18 +-
sys/arch/x86/x86/lapic.c | 8 +-
sys/arch/x86/x86/pmap.c | 10 +-
sys/arch/x86/x86/x86_autoconf.c | 12 +-
sys/arch/x86/x86/x86_machdep.c | 30 +++-
sys/arch/xen/conf/Makefile.xen | 4 +-
sys/arch/xen/conf/files.xen | 4 +-
sys/arch/xen/include/hypervisor.h | 10 +-
sys/arch/xen/include/xen.h | 6 +-
sys/arch/xen/x86/autoconf.c | 85 +-----------
sys/arch/xen/x86/hypervisor_machdep.c | 36 ++++-
sys/arch/xen/x86/pvh_consinit.c | 115 +++++++++++++++
sys/arch/xen/x86/x86_xpmap.c | 5 +-
sys/arch/xen/x86/xen_mainbus.c | 5 +-
sys/arch/xen/xen/hypervisor.c | 249 +++++++++++++++++++++------------
sys/arch/xen/xen/xen_clock.c | 37 ++--
sys/arch/xen/xen/xen_machdep.c | 114 ++++++++++++++-
31 files changed, 827 insertions(+), 308 deletions(-)
diffs (truncated from 2151 to 300 lines):
diff -r 92e3d8df2606 -r e06a939c79eb sys/arch/amd64/amd64/autoconf.c
--- a/sys/arch/amd64/amd64/autoconf.c Sat May 02 16:28:37 2020 +0000
+++ b/sys/arch/amd64/amd64/autoconf.c Sat May 02 16:44:34 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: autoconf.c,v 1.29 2019/12/27 12:51:56 ad Exp $ */
+/* $NetBSD: autoconf.c,v 1.30 2020/05/02 16:44:34 bouyer Exp $ */
/*-
* Copyright (c) 1990 The Regents of the University of California.
@@ -46,7 +46,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.29 2019/12/27 12:51:56 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.30 2020/05/02 16:44:34 bouyer Exp $");
#include "opt_multiprocessor.h"
#include "opt_intrdebug.h"
@@ -92,7 +92,14 @@
void
cpu_configure(void)
{
+#ifdef XEN
+ if (vm_guest == VM_GUEST_XENPVH)
+ xen_startrtclock();
+ else
+ startrtclock();
+#else
startrtclock();
+#endif
#if NBIOS32 > 0
efi_init();
diff -r 92e3d8df2606 -r e06a939c79eb sys/arch/amd64/amd64/genassym.cf
--- a/sys/arch/amd64/amd64/genassym.cf Sat May 02 16:28:37 2020 +0000
+++ b/sys/arch/amd64/amd64/genassym.cf Sat May 02 16:44:34 2020 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: genassym.cf,v 1.83 2020/04/25 15:26:16 bouyer Exp $
+# $NetBSD: genassym.cf,v 1.84 2020/05/02 16:44:34 bouyer Exp $
#
# Copyright (c) 1998, 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -120,6 +120,7 @@
ifdef XEN
include <xen/include/public/xen.h>
+include <xen/include/public/arch-x86/hvm/start_info.h>
endif
include <sys/bus.h>
@@ -361,6 +362,7 @@
define BST_TYPE offsetof(struct bus_space_tag, bst_type)
define VM_GUEST_XENPV VM_GUEST_XENPV
+define VM_GUEST_XENPVH VM_GUEST_XENPVH
ifdef XEN
define CPU_INFO_VCPU offsetof(struct cpu_info, ci_vcpu)
@@ -373,7 +375,7 @@
define XEN_NR_PT_FRAMES offsetof(struct start_info, nr_pt_frames)
define __HYPERVISOR_iret __HYPERVISOR_iret
endif /* XENPV */
-endif
+endif /* XEN */
define NKL4_KIMG_ENTRIES NKL4_KIMG_ENTRIES
define NKL3_KIMG_ENTRIES NKL3_KIMG_ENTRIES
diff -r 92e3d8df2606 -r e06a939c79eb sys/arch/amd64/amd64/locore.S
--- a/sys/arch/amd64/amd64/locore.S Sat May 02 16:28:37 2020 +0000
+++ b/sys/arch/amd64/amd64/locore.S Sat May 02 16:44:34 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: locore.S,v 1.205 2020/05/02 16:28:37 maxv Exp $ */
+/* $NetBSD: locore.S,v 1.206 2020/05/02 16:44:34 bouyer Exp $ */
/*
* Copyright-o-rama!
@@ -279,9 +279,7 @@
#define __ASSEMBLY__
#include <xen/include/public/elfnote.h>
#include <xen/include/public/xen.h>
-#endif /* XEN */
-#ifdef XENPV
#define ELFNOTE(name, type, desctype, descdata...) \
.pushsection .note.name ; \
.align 4 ; \
@@ -302,11 +300,16 @@
ELFNOTE(Xen, XEN_ELFNOTE_GUEST_VERSION, .asciz, "4.99")
ELFNOTE(Xen, XEN_ELFNOTE_XEN_VERSION, .asciz, "xen-3.0")
ELFNOTE(Xen, XEN_ELFNOTE_VIRT_BASE, .quad, KERNBASE)
+#ifdef XENPV
ELFNOTE(Xen, XEN_ELFNOTE_PADDR_OFFSET, .quad, KERNBASE)
ELFNOTE(Xen, XEN_ELFNOTE_ENTRY, .quad, start)
+#else
+ ELFNOTE(Xen, XEN_ELFNOTE_PADDR_OFFSET, .quad, 0)
+ ELFNOTE(Xen, XEN_ELFNOTE_PHYS32_ENTRY, .long, RELOC(start_xen32))
+#endif /* XENPV */
ELFNOTE(Xen, XEN_ELFNOTE_HYPERCALL_PAGE, .quad, hypercall_page)
ELFNOTE(Xen, XEN_ELFNOTE_HV_START_LOW, .quad, HYPERVISOR_VIRT_START)
- ELFNOTE(Xen, XEN_ELFNOTE_FEATURES, .asciz, "")
+ ELFNOTE(Xen, XEN_ELFNOTE_FEATURES, .asciz, "writable_descriptor_tables|auto_translated_physmap|supervisor_mode_kernel|hvm_callback_vector")
ELFNOTE(Xen, XEN_ELFNOTE_PAE_MODE, .asciz, "yes")
ELFNOTE(Xen, XEN_ELFNOTE_L1_MFN_VALID, .long, PTE_P, PTE_P)\
ELFNOTE(Xen, XEN_ELFNOTE_LOADER, .asciz, "generic")
@@ -314,7 +317,7 @@
#if NKSYMS > 0 || defined(DDB) || defined(MODULAR)
ELFNOTE(Xen, XEN_ELFNOTE_BSD_SYMTAB, .asciz, "yes")
#endif
-#endif /* XENPV */
+#endif /* XEN */
/*
* Initialization
@@ -418,6 +421,21 @@
.word GSEL(GCODE_SEL, SEL_KPL)
END(farjmp64)
+#ifdef XEN
+/* 32bit GDT */
+gdtdesc32:
+ .word gdt32end - gdt32
+ .long RELOC(gdt32)
+ .long 0
+gdt32:
+ .long 0 # null descriptor
+ .long 0
+ .long 0x0000ffff # %cs
+ .long 0x00cf9a00
+ .long 0x0000ffff # %ds, %es, %ss
+ .long 0x00cf9200
+gdt32end:
+#endif /* XEN */
#endif /* !XENPV */
/* Space for the temporary stack */
@@ -973,6 +991,9 @@
#endif /* XENPV */
pushq %rdi
+#if defined(XEN) && !defined(XENPV)
+ call _C_LABEL(init_xen_early)
+#endif
call _C_LABEL(init_bootspace)
#ifdef KASAN
movq _C_LABEL(lwp0uarea)(%rip),%rdi
@@ -984,6 +1005,64 @@
call _C_LABEL(main)
END(start)
+#ifndef XENPV
+/* entry point for Xen PVH */
+ .code32
+ENTRY(start_xen32)
+ /* Xen doesn't start us with a valid gdt */
+ movl $RELOC(gdtdesc32), %eax
+ lgdt (%eax)
+ jmp $GSEL(GCODE_SEL, SEL_KPL), $RELOC(.Lreload_cs)
+
+.Lreload_cs:
+ movw $GSEL(GDATA_SEL, SEL_KPL), %ax
+ movw %ax, %ds
+ movw %ax, %es
+ movw %ax, %ss
+
+ /* we need a valid stack */
+ movl $RELOC(tmpstk),%esp
+
+ /* clear BSS */
+ xorl %eax,%eax
+ movl $RELOC(__bss_start),%edi
+ movl $RELOC(_end),%ecx
+ subl %edi,%ecx
+ rep
+ stosb
+
+ /*
+ * save addr of the hvm_start_info structure. This is also the end
+ * of the symbol table
+ */
+ movl %ebx, RELOC(hvm_start_paddr)
+ movl %ebx, %eax
+ addl $KERNBASE_LO,%eax
+ movl $RELOC(esym),%ebp
+ movl %eax,(%ebp)
+ movl $KERNBASE_HI,4(%ebp)
+ /* get a page for HYPERVISOR_shared_info */
+ addl $PAGE_SIZE, %ebx
+ addl $PGOFSET,%ebx
+ andl $~PGOFSET,%ebx
+ movl $RELOC(HYPERVISOR_shared_info_pa),%ebp
+ movl %ebx,(%ebp)
+ movl $0,4(%ebp)
+ /* XXX assume hvm_start_info+dependant struture fits in a single page */
+ addl $PAGE_SIZE, %ebx
+ addl $PGOFSET,%ebx
+ andl $~PGOFSET,%ebx
+ addl $KERNBASE_LO,%ebx
+ movl $RELOC(eblob),%ebp
+ movl %ebx,(%ebp)
+ movl $KERNBASE_HI,4(%ebp)
+
+ /* annouce ourself */
+ movl $VM_GUEST_XENPVH, RELOC(vm_guest)
+ jmp .Lbiosbasemem_finished
+END(start_xen32)
+ .code64
+#endif /* XENPV */
#if defined(XEN)
/* space for the hypercall call page */
#define HYPERCALL_PAGE_OFFSET 0x1000
diff -r 92e3d8df2606 -r e06a939c79eb sys/arch/amd64/amd64/machdep.c
--- a/sys/arch/amd64/amd64/machdep.c Sat May 02 16:28:37 2020 +0000
+++ b/sys/arch/amd64/amd64/machdep.c Sat May 02 16:44:34 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.351 2020/05/02 16:28:37 maxv Exp $ */
+/* $NetBSD: machdep.c,v 1.352 2020/05/02 16:44:34 bouyer Exp $ */
/*
* Copyright (c) 1996, 1997, 1998, 2000, 2006, 2007, 2008, 2011
@@ -110,7 +110,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.351 2020/05/02 16:28:37 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.352 2020/05/02 16:44:34 bouyer Exp $");
#include "opt_modular.h"
#include "opt_user_ldt.h"
@@ -1483,22 +1483,20 @@
extern vector IDTVEC(osyscall);
extern vector *x86_exceptions[];
+#ifndef XENPV
static void
init_x86_64_ksyms(void)
{
#if NKSYMS || defined(DDB) || defined(MODULAR)
extern int end;
extern int *esym;
-#ifndef XENPV
struct btinfo_symtab *symtab;
vaddr_t tssym, tesym;
-#endif
#ifdef DDB
db_machine_init();
#endif
-#ifndef XENPV
symtab = lookup_bootinfo(BTINFO_SYMTAB);
if (symtab) {
#ifdef KASLR
@@ -1512,15 +1510,9 @@
} else
ksyms_addsyms_elf(*(long *)(void *)&end,
((long *)(void *)&end) + 1, esym);
-#else /* XENPV */
- esym = xen_start_info.mod_start ?
- (void *)xen_start_info.mod_start :
- (void *)xen_start_info.mfn_list;
- ksyms_addsyms_elf(*(int *)(void *)&end,
- ((int *)(void *)&end) + 1, esym);
-#endif /* XENPV */
#endif
}
+#endif /* XENPV */
void __noasan
init_bootspace(void)
@@ -1676,6 +1668,10 @@
cpu_info_primary.ci_vcpu = &HYPERVISOR_shared_info->vcpu_info[0];
#endif
+#ifdef XEN
+ if (vm_guest == VM_GUEST_XENPVH)
+ xen_parse_cmdline(XEN_PARSE_BOOTFLAGS, NULL);
+#endif
init_pte();
uvm_lwp_setuarea(&lwp0, lwp0uarea);
@@ -1903,7 +1899,16 @@
cpu_init_idt();
- init_x86_64_ksyms();
+#ifdef XENPV
+ xen_init_ksyms();
+#else /* XENPV */
+#ifdef XEN
+ if (vm_guest == VM_GUEST_XENPVH)
+ xen_init_ksyms();
+ else
+#endif /* XEN */
+ init_x86_64_ksyms();
+#endif /* XENPV */
#ifndef XENPV
intr_default_setup();
diff -r 92e3d8df2606 -r e06a939c79eb sys/arch/amd64/conf/GENERIC
--- a/sys/arch/amd64/conf/GENERIC Sat May 02 16:28:37 2020 +0000
Home |
Main Index |
Thread Index |
Old Index