Module Name:    src
Committed By:   bouyer
Date:           Mon Nov 30 17:06:02 UTC 2020

Modified Files:
        src/sys/arch/x86/x86: pmap.c
        src/sys/arch/xen/xen: hypervisor.c privcmd.c xenevt.c

Log Message:
Work in progress on dom0 PVH support. kernel boots and xl info works,
but we can't start a domU yet.


To generate a diff of this commit:
cvs rdiff -u -r1.407 -r1.408 src/sys/arch/x86/x86/pmap.c
cvs rdiff -u -r1.89 -r1.90 src/sys/arch/xen/xen/hypervisor.c
cvs rdiff -u -r1.59 -r1.60 src/sys/arch/xen/xen/privcmd.c
cvs rdiff -u -r1.60 -r1.61 src/sys/arch/xen/xen/xenevt.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/x86/x86/pmap.c
diff -u src/sys/arch/x86/x86/pmap.c:1.407 src/sys/arch/x86/x86/pmap.c:1.408
--- src/sys/arch/x86/x86/pmap.c:1.407	Sun Sep  6 02:18:53 2020
+++ src/sys/arch/x86/x86/pmap.c	Mon Nov 30 17:06:02 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap.c,v 1.407 2020/09/06 02:18:53 riastradh Exp $	*/
+/*	$NetBSD: pmap.c,v 1.408 2020/11/30 17:06:02 bouyer Exp $	*/
 
 /*
  * Copyright (c) 2008, 2010, 2016, 2017, 2019, 2020 The NetBSD Foundation, Inc.
@@ -130,7 +130,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.407 2020/09/06 02:18:53 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.408 2020/11/30 17:06:02 bouyer Exp $");
 
 #include "opt_user_ldt.h"
 #include "opt_lockdebug.h"
@@ -175,6 +175,7 @@ __KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.4
 #ifdef XEN
 #include <xen/include/public/xen.h>
 #include <xen/hypervisor.h>
+#include <xen/xenpmap.h>
 #endif
 
 /*
@@ -5233,7 +5234,9 @@ pmap_enter_gnt(struct pmap *pmap, vaddr_
 	idx = (va - pgnt->pd_gnt_sva) / PAGE_SIZE;
 	op = &pgnt->pd_gnt_ops[idx];
 
+#ifdef XENPV /* XXX */
 	op->host_addr = xpmap_ptetomach(ptep);
+#endif
 	op->dev_bus_addr = 0;
 	op->status = GNTST_general_error;
 	ret = HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, op, 1);
@@ -5354,7 +5357,9 @@ pmap_remove_gnt(struct pmap *pmap, vaddr
 			KASSERT(pmap_valid_entry(ptes[pl1_i(va)]));
 			unmap_op.handle = op->handle;
 			unmap_op.dev_bus_addr = 0;
+#ifdef XENPV /* XXX */
 			unmap_op.host_addr = xpmap_ptetomach(&ptes[pl1_i(va)]);
+#endif
 			ret = HYPERVISOR_grant_table_op(
 			    GNTTABOP_unmap_grant_ref, &unmap_op, 1);
 			if (ret) {

Index: src/sys/arch/xen/xen/hypervisor.c
diff -u src/sys/arch/xen/xen/hypervisor.c:1.89 src/sys/arch/xen/xen/hypervisor.c:1.90
--- src/sys/arch/xen/xen/hypervisor.c:1.89	Tue Sep 15 10:58:02 2020
+++ src/sys/arch/xen/xen/hypervisor.c	Mon Nov 30 17:06:02 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: hypervisor.c,v 1.89 2020/09/15 10:58:02 bouyer Exp $ */
+/* $NetBSD: hypervisor.c,v 1.90 2020/11/30 17:06:02 bouyer Exp $ */
 
 /*
  * Copyright (c) 2005 Manuel Bouyer.
@@ -53,7 +53,7 @@
 
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: hypervisor.c,v 1.89 2020/09/15 10:58:02 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: hypervisor.c,v 1.90 2020/11/30 17:06:02 bouyer Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -682,7 +682,9 @@ hypervisor_attach(device_t parent, devic
 		config_found_ia(self, "xendevbus", &hac.hac_xencons, hypervisor_print);
 	}
 #endif
-#if defined(XENPV) && defined(DOM0OPS)
+
+#if defined(DOM0OPS)
+#if defined(XENPV)
 #if NPCI > 0
 #if NACPICA > 0
 	if (acpi_present) {
@@ -743,11 +745,12 @@ hypervisor_attach(device_t parent, devic
 	}
 #endif /* NISA */
 #endif /* NPCI */
+#endif /* XENPV */
 
 	if (xendomain_is_privileged()) {
 		xenprivcmd_init();
 	}
-#endif /* XENPV && DOM0OPS */
+#endif /* DOM0OPS */
 
 	hypervisor_machdep_attach();
 

Index: src/sys/arch/xen/xen/privcmd.c
diff -u src/sys/arch/xen/xen/privcmd.c:1.59 src/sys/arch/xen/xen/privcmd.c:1.60
--- src/sys/arch/xen/xen/privcmd.c:1.59	Tue May 26 10:37:25 2020
+++ src/sys/arch/xen/xen/privcmd.c	Mon Nov 30 17:06:02 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: privcmd.c,v 1.59 2020/05/26 10:37:25 bouyer Exp $ */
+/* $NetBSD: privcmd.c,v 1.60 2020/11/30 17:06:02 bouyer Exp $ */
 
 /*-
  * Copyright (c) 2004 Christian Limpach.
@@ -27,7 +27,7 @@
 
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: privcmd.c,v 1.59 2020/05/26 10:37:25 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: privcmd.c,v 1.60 2020/11/30 17:06:02 bouyer Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -47,6 +47,7 @@ __KERNEL_RCSID(0, "$NetBSD: privcmd.c,v 
 #include <xen/hypervisor.h>
 #include <xen/xen.h>
 #include <xen/xenio.h>
+#include <xen/xenpmap.h>
 #include <xen/granttables.h>
 
 #define	PRIVCMD_MODE	(S_IRUSR)
@@ -741,6 +742,10 @@ privcmd_ioctl(void *v)
 			: "=a" (error) : "0" (ap->a_data) : "memory" );
 #endif /* __i386__ */
 #if defined(__x86_64__)
+#ifndef XENPV
+		/* hypervisor can't access user memory if SMAP is enabled */
+		smap_disable();
+#endif
 		{
 		long i1, i2, i3;
 		__asm volatile (
@@ -758,6 +763,9 @@ privcmd_ioctl(void *v)
 			  "g" (hc->arg[4])
 			: "r8", "r10", "memory" );
 		}
+#ifndef XENPV
+		smap_enable();
+#endif
 #endif /* __x86_64__ */
 		if (ap->a_command == IOCTL_PRIVCMD_HYPERCALL) {
 			if (error >= 0) {
@@ -915,6 +923,12 @@ privpgop_fault(struct uvm_faultinfo *ufi
 			continue;
 		switch(pobj->type) {
 		case PTYPE_PRIVCMD:
+		{
+			u_int pm_flags = PMAP_CANFAIL | ufi->entry->protection;
+#ifdef XENPV
+			if (pobj->u.pc.no_translate)
+				pm_flags |= PMAP_MD_XEN_NOTR;
+#endif
 			if (pobj->u.pc.maddr[maddr_i] == INVALID_PAGE) {
 				/* This has already been flagged as error. */
 				error = EFAULT;
@@ -922,9 +936,7 @@ privpgop_fault(struct uvm_faultinfo *ufi
 			}
 			error = pmap_enter_ma(ufi->orig_map->pmap, vaddr,
 			    pobj->u.pc.maddr[maddr_i], 0,
-			    ufi->entry->protection,
-			    PMAP_CANFAIL | ufi->entry->protection |
-			    (pobj->u.pc.no_translate ? PMAP_MD_XEN_NOTR : 0),
+			    ufi->entry->protection, pm_flags,
 			    pobj->u.pc.domid);
 			if (error == ENOMEM) {
 				goto out;
@@ -934,6 +946,7 @@ privpgop_fault(struct uvm_faultinfo *ufi
 				error = EFAULT;
 			}
 			break;
+		}
 		case PTYPE_GNTDEV_REF:
 		{
 			struct pmap *pmap = ufi->orig_map->pmap;

Index: src/sys/arch/xen/xen/xenevt.c
diff -u src/sys/arch/xen/xen/xenevt.c:1.60 src/sys/arch/xen/xen/xenevt.c:1.61
--- src/sys/arch/xen/xen/xenevt.c:1.60	Thu May  7 19:52:50 2020
+++ src/sys/arch/xen/xen/xenevt.c	Mon Nov 30 17:06:02 2020
@@ -1,4 +1,4 @@
-/*      $NetBSD: xenevt.c,v 1.60 2020/05/07 19:52:50 bouyer Exp $      */
+/*      $NetBSD: xenevt.c,v 1.61 2020/11/30 17:06:02 bouyer Exp $      */
 
 /*
  * Copyright (c) 2005 Manuel Bouyer.
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: xenevt.c,v 1.60 2020/05/07 19:52:50 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: xenevt.c,v 1.61 2020/11/30 17:06:02 bouyer Exp $");
 
 #include "opt_xen.h"
 #include <sys/param.h>
@@ -46,7 +46,11 @@ __KERNEL_RCSID(0, "$NetBSD: xenevt.c,v 1
 #include <uvm/uvm_extern.h>
 
 #include <xen/hypervisor.h>
+#include <xen/evtchn.h>
+#include <xen/intr.h>
+#ifdef XENPV
 #include <xen/xenpmap.h>
+#endif
 #include <xen/xenio.h>
 #include <xen/xenio3.h>
 #include <xen/xen.h>
@@ -165,6 +169,13 @@ xenevtattach(int n)
 {
 	int level = IPL_HIGH;
 
+	if (!xendomain_is_privileged())
+		return;
+#ifndef XENPV
+	if (vm_guest != VM_GUEST_XENPVH)
+		return;
+#endif
+
 	mutex_init(&devevent_lock, MUTEX_DEFAULT, IPL_HIGH);
 	STAILQ_INIT(&devevent_pending);
 

Reply via email to