Module Name:    src
Committed By:   bouyer
Date:           Thu Sep  1 12:26:00 UTC 2022

Modified Files:
        src/sys/arch/xen/xen: privcmd.c

Log Message:
Adjust privcmd_notify() so it has a chance to work in a PVH environnement too.


To generate a diff of this commit:
cvs rdiff -u -r1.63 -r1.64 src/sys/arch/xen/xen/privcmd.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/xen/xen/privcmd.c
diff -u src/sys/arch/xen/xen/privcmd.c:1.63 src/sys/arch/xen/xen/privcmd.c:1.64
--- src/sys/arch/xen/xen/privcmd.c:1.63	Wed Aug 31 14:00:44 2022
+++ src/sys/arch/xen/xen/privcmd.c	Thu Sep  1 12:26:00 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: privcmd.c,v 1.63 2022/08/31 14:00:44 bouyer Exp $ */
+/* $NetBSD: privcmd.c,v 1.64 2022/09/01 12:26:00 bouyer Exp $ */
 
 /*-
  * Copyright (c) 2004 Christian Limpach.
@@ -27,7 +27,9 @@
 
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: privcmd.c,v 1.63 2022/08/31 14:00:44 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: privcmd.c,v 1.64 2022/09/01 12:26:00 bouyer Exp $");
+
+#include "opt_xen.h"
 
 #include "opt_xen.h"
 
@@ -927,11 +929,19 @@ privcmd_notify(struct ioctl_gntdev_grant
 		int i = notify->offset / PAGE_SIZE;
 		int o = notify->offset % PAGE_SIZE;
 		int err;
+#ifndef XENPV
+		paddr_t base_paddr;
+		base_paddr = xenmem_alloc_pa(PAGE_SIZE, PAGE_SIZE, true);
+#endif
 
 		KASSERT(gmops != NULL);
 		va = uvm_km_alloc(kernel_map, PAGE_SIZE, PAGE_SIZE,
 		    UVM_KMF_VAONLY | UVM_KMF_WAITVA);
+#ifndef XENPV
+		op.host_addr = base_paddr;
+#else
 		op.host_addr = va;
+#endif
 		op.dev_bus_addr = 0;
 		op.ref = gmops[i].ref;
 		op.dom = gmops[i].dom;
@@ -939,15 +949,27 @@ privcmd_notify(struct ioctl_gntdev_grant
 		op.flags = GNTMAP_host_map;
 		err = HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1);
 		if (err == 0 && op.status == GNTST_okay) {
+#ifndef XENPV
+			pmap_kenter_pa(va, base_paddr,
+			    VM_PROT_READ | VM_PROT_WRITE, 0);
+#endif
 			char *n = (void *)(va + o);
 			*n = 0;
+#ifndef XENPV
+			pmap_kremove(va, PAGE_SIZE);
+			uop.host_addr = base_paddr;
+#else
 			uop.host_addr = va;
+#endif
 			uop.handle = op.handle;
 			uop.dev_bus_addr = 0;
 			(void)HYPERVISOR_grant_table_op(
 			    GNTTABOP_unmap_grant_ref, &uop, 1);
 		}
 		uvm_km_free(kernel_map, va, PAGE_SIZE, UVM_KMF_VAONLY);
+#ifndef XENPV
+		xenmem_free_pa(base_paddr, PAGE_SIZE);
+#endif
 	} else {
 		KASSERT(gmops == NULL);
 		char *n = (void *)(va + notify->offset);

Reply via email to