All of lore.kernel.org
 help / color / mirror / Atom feed
From: Anastasiia Lukianenko <vicooodin@gmail.com>
To: u-boot@lists.denx.de
Subject: [RESEND PATCH v2 11/18] xen: Port Xen grant table driver from mini-os
Date: Thu,  6 Aug 2020 12:42:54 +0300	[thread overview]
Message-ID: <20200806094301.4999-12-vicooodin@gmail.com> (raw)
In-Reply-To: <20200806094301.4999-1-vicooodin@gmail.com>

From: Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com>

Make required updates to run on u-boot.

Signed-off-by: Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com>
Signed-off-by: Anastasiia Lukianenko <anastasiia_lukianenko@epam.com>
---

Changes since v1:
 - remove gnttab_grant_transfer and gnttab_end_transfer functions as it
   is not possible to transfer grant on Arm
 - remove HYPERVISOR_grant_table_op as it is not needed on Arm
 - add comments
 - correct code style

 board/xen/xenguest_arm64/xenguest_arm64.c |  13 ++
 drivers/xen/Makefile                      |   1 +
 drivers/xen/gnttab.c                      | 216 ++++++++++++++++++++++
 drivers/xen/hypervisor.c                  |   2 +
 include/xen.h                             |   3 +-
 include/xen/gnttab.h                      |  24 +++
 6 files changed, 258 insertions(+), 1 deletion(-)
 create mode 100644 drivers/xen/gnttab.c
 create mode 100644 include/xen/gnttab.h

diff --git a/board/xen/xenguest_arm64/xenguest_arm64.c b/board/xen/xenguest_arm64/xenguest_arm64.c
index 18e12c404e..9861edac33 100644
--- a/board/xen/xenguest_arm64/xenguest_arm64.c
+++ b/board/xen/xenguest_arm64/xenguest_arm64.c
@@ -21,6 +21,7 @@
 
 #include <linux/compiler.h>
 
+#include <xen/gnttab.h>
 #include <xen/hvm.h>
 
 DECLARE_GLOBAL_DATA_PTR;
@@ -63,6 +64,8 @@ static int setup_mem_map(void)
 	struct fdt_resource res;
 	const void *blob = gd->fdt_blob;
 	u64 gfn;
+	phys_addr_t gnttab_base;
+	phys_size_t gnttab_sz;
 
 	/*
 	 * Add "magic" region which is used by Xen to provide some essentials
@@ -96,6 +99,16 @@ static int setup_mem_map(void)
 				PTE_BLOCK_INNER_SHARE);
 	i++;
 
+	/* Get Xen's suggested physical page assignments for the grant table. */
+	get_gnttab_base(&gnttab_base, &gnttab_sz);
+
+	xen_mem_map[i].virt = gnttab_base;
+	xen_mem_map[i].phys = gnttab_base;
+	xen_mem_map[i].size = gnttab_sz;
+	xen_mem_map[i].attrs = (PTE_BLOCK_MEMTYPE(MT_NORMAL) |
+				PTE_BLOCK_INNER_SHARE);
+	i++;
+
 	mem = get_next_memory_node(blob, -1);
 	if (mem < 0) {
 		printf("%s: Missing /memory node\n", __func__);
diff --git a/drivers/xen/Makefile b/drivers/xen/Makefile
index 9d0f604aaa..243b13277a 100644
--- a/drivers/xen/Makefile
+++ b/drivers/xen/Makefile
@@ -5,3 +5,4 @@
 obj-y += hypervisor.o
 obj-y += events.o
 obj-y += xenbus.o
+obj-y += gnttab.o
diff --git a/drivers/xen/gnttab.c b/drivers/xen/gnttab.c
new file mode 100644
index 0000000000..becf7a79fb
--- /dev/null
+++ b/drivers/xen/gnttab.c
@@ -0,0 +1,216 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * (C) 2006 - Cambridge University
+ * (C) 2020 - EPAM Systems Inc.
+ *
+ * File: gnttab.c [1]
+ * Author: Steven Smith (sos22 at cam.ac.uk)
+ * Changes: Grzegorz Milos (gm281@cam.ac.uk)
+ *
+ * Date: July 2006
+ *
+ * Description: Simple grant tables implementation. About as stupid as it's
+ * possible to be and still work.
+ *
+ * [1] - http://xenbits.xen.org/gitweb/?p=mini-os.git;a=summary
+ */
+#include <common.h>
+#include <linux/compiler.h>
+#include <log.h>
+#include <malloc.h>
+
+#include <asm/armv8/mmu.h>
+#include <asm/io.h>
+#include <asm/xen/system.h>
+
+#include <linux/bug.h>
+
+#include <xen/gnttab.h>
+#include <xen/hvm.h>
+
+#include <xen/interface/memory.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define NR_RESERVED_ENTRIES 8
+
+/* NR_GRANT_FRAMES must be less than or equal to that configured in Xen */
+#define NR_GRANT_FRAMES 1
+#define NR_GRANT_ENTRIES (NR_GRANT_FRAMES * PAGE_SIZE / sizeof(struct grant_entry_v1))
+
+static struct grant_entry_v1 *gnttab_table;
+static grant_ref_t gnttab_list[NR_GRANT_ENTRIES];
+
+static void put_free_entry(grant_ref_t ref)
+{
+	unsigned long flags;
+
+	local_irq_save(flags);
+	gnttab_list[ref] = gnttab_list[0];
+	gnttab_list[0]  = ref;
+	local_irq_restore(flags);
+}
+
+static grant_ref_t get_free_entry(void)
+{
+	unsigned int ref;
+	unsigned long flags;
+
+	local_irq_save(flags);
+	ref = gnttab_list[0];
+	BUG_ON(ref < NR_RESERVED_ENTRIES || ref >= NR_GRANT_ENTRIES);
+	gnttab_list[0] = gnttab_list[ref];
+	local_irq_restore(flags);
+	return ref;
+}
+
+/**
+ * gnttab_grant_access() - Allow access to the given frame.
+ * The function creates an entry in the grant table according
+ * to the specified parameters.
+ * @domid: the id of the domain for which access is allowed
+ * @frame: the number of the shared frame
+ * @readonly: determines whether the frame is shared read-only or read-write
+ *
+ * Return: relevant grant reference
+ */
+grant_ref_t gnttab_grant_access(domid_t domid, unsigned long frame, int readonly)
+{
+	grant_ref_t ref;
+
+	ref = get_free_entry();
+	gnttab_table[ref].frame = frame;
+	gnttab_table[ref].domid = domid;
+	wmb();
+	readonly *= GTF_readonly;
+	gnttab_table[ref].flags = GTF_permit_access | readonly;
+
+	return ref;
+}
+
+/**
+ * gnttab_end_access() - End of memory sharing. The function invalidates
+ * the entry in the grant table.
+ */
+int gnttab_end_access(grant_ref_t ref)
+{
+	u16 flags, nflags;
+
+	BUG_ON(ref >= NR_GRANT_ENTRIES || ref < NR_RESERVED_ENTRIES);
+
+	nflags = gnttab_table[ref].flags;
+	do {
+		if ((flags = nflags) & (GTF_reading | GTF_writing)) {
+			printf("WARNING: g.e. still in use! (%x)\n", flags);
+			return 0;
+		}
+	} while ((nflags = synch_cmpxchg(&gnttab_table[ref].flags, flags, 0)) !=
+		 flags);
+
+	put_free_entry(ref);
+	return 1;
+}
+
+grant_ref_t gnttab_alloc_and_grant(void **map)
+{
+	unsigned long mfn;
+	grant_ref_t gref;
+
+	*map = (void *)memalign(PAGE_SIZE, PAGE_SIZE);
+	mfn = virt_to_mfn(*map);
+	gref = gnttab_grant_access(0, mfn, 0);
+	return gref;
+}
+
+static const char * const gnttabop_error_msgs[] = GNTTABOP_error_msgs;
+
+const char *gnttabop_error(int16_t status)
+{
+	status = -status;
+	if (status < 0 || status >= ARRAY_SIZE(gnttabop_error_msgs))
+		return "bad status";
+	else
+		return gnttabop_error_msgs[status];
+}
+
+/* Get Xen's suggested physical page assignments for the grant table. */
+void get_gnttab_base(phys_addr_t *gnttab_base, phys_size_t *gnttab_sz)
+{
+	const void *blob = gd->fdt_blob;
+	struct fdt_resource res;
+	int mem;
+
+	mem = fdt_node_offset_by_compatible(blob, -1, "xen,xen");
+	if (mem < 0) {
+		printf("No xen,xen compatible found\n");
+		BUG();
+	}
+
+	mem = fdt_get_resource(blob, mem, "reg", 0, &res);
+	if (mem == -FDT_ERR_NOTFOUND) {
+		printf("No grant table base in the device tree\n");
+		BUG();
+	}
+
+	*gnttab_base = (phys_addr_t)res.start;
+	if (gnttab_sz)
+		*gnttab_sz = (phys_size_t)(res.end - res.start + 1);
+
+	debug("FDT suggests grant table base@%llx\n",
+	      *gnttab_base);
+}
+
+void init_gnttab(void)
+{
+	struct xen_add_to_physmap xatp;
+	struct gnttab_setup_table setup;
+	xen_pfn_t frames[NR_GRANT_FRAMES];
+	int i, rc;
+
+	debug("%s\n", __func__);
+
+	for (i = NR_RESERVED_ENTRIES; i < NR_GRANT_ENTRIES; i++)
+		put_free_entry(i);
+
+	get_gnttab_base((phys_addr_t *)&gnttab_table, NULL);
+
+	for (i = 0; i < NR_GRANT_FRAMES; i++) {
+		xatp.domid = DOMID_SELF;
+		xatp.size = 0;
+		xatp.space = XENMAPSPACE_grant_table;
+		xatp.idx = i;
+		xatp.gpfn = PFN_DOWN((unsigned long)gnttab_table) + i;
+		rc = HYPERVISOR_memory_op(XENMEM_add_to_physmap, &xatp);
+		if (rc)
+			printf("XENMEM_add_to_physmap failed; status = %d\n",
+			       rc);
+		BUG_ON(rc != 0);
+	}
+
+	setup.dom = DOMID_SELF;
+	setup.nr_frames = NR_GRANT_FRAMES;
+	set_xen_guest_handle(setup.frame_list, frames);
+}
+
+void fini_gnttab(void)
+{
+	struct xen_remove_from_physmap xrtp;
+	struct gnttab_setup_table setup;
+	int i, rc;
+
+	debug("%s\n", __func__);
+
+	for (i = 0; i < NR_GRANT_FRAMES; i++) {
+		xrtp.domid = DOMID_SELF;
+		xrtp.gpfn = PFN_DOWN((unsigned long)gnttab_table) + i;
+		rc = HYPERVISOR_memory_op(XENMEM_remove_from_physmap, &xrtp);
+		if (rc)
+			printf("XENMEM_remove_from_physmap failed; status = %d\n",
+			       rc);
+		BUG_ON(rc != 0);
+	}
+
+	setup.dom = DOMID_SELF;
+	setup.nr_frames = 0;
+}
+
diff --git a/drivers/xen/hypervisor.c b/drivers/xen/hypervisor.c
index 1c7ae94bdf..58b0865e6a 100644
--- a/drivers/xen/hypervisor.c
+++ b/drivers/xen/hypervisor.c
@@ -21,6 +21,7 @@
 
 #include <xen/hvm.h>
 #include <xen/events.h>
+#include <xen/gnttab.h>
 #include <xen/xenbus.h>
 #include <xen/interface/memory.h>
 
@@ -238,5 +239,6 @@ void xen_init(void)
 	map_shared_info(NULL);
 	init_events();
 	init_xenbus();
+	init_gnttab();
 }
 
diff --git a/include/xen.h b/include/xen.h
index 6fe30b83a2..686b7148b5 100644
--- a/include/xen.h
+++ b/include/xen.h
@@ -8,7 +8,8 @@
 /**
  * xen_init() - Xen initialization
  *
- * Map Xen memory pages, initialize event handler and xenbus.
+ * Map Xen memory pages, initialize event handler and xenbus,
+ * setup the grant table.
  */
 void xen_init(void);
 
diff --git a/include/xen/gnttab.h b/include/xen/gnttab.h
new file mode 100644
index 0000000000..db1d5361fe
--- /dev/null
+++ b/include/xen/gnttab.h
@@ -0,0 +1,24 @@
+/*
+ * SPDX-License-Identifier: GPL-2.0
+ *
+ * (C) 2006, Steven Smith <sos22@cam.ac.uk>
+ * (C) 2006, Grzegorz Milos <gm281@cam.ac.uk>
+ * (C) 2020, EPAM Systems Inc.
+ */
+#ifndef __GNTTAB_H__
+#define __GNTTAB_H__
+
+#include <xen/interface/grant_table.h>
+
+void init_gnttab(void);
+void fini_gnttab(void);
+
+grant_ref_t gnttab_alloc_and_grant(void **map);
+grant_ref_t gnttab_grant_access(domid_t domid, unsigned long frame,
+				int readonly);
+int gnttab_end_access(grant_ref_t ref);
+const char *gnttabop_error(int16_t status);
+
+void get_gnttab_base(phys_addr_t *gnttab_base, phys_size_t *gnttab_sz);
+
+#endif /* !__GNTTAB_H__ */
-- 
2.17.1

  parent reply	other threads:[~2020-08-06  9:42 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-08-06  9:42 [RESEND PATCH v2 00/18] Add new board: Xen guest for ARM64 Anastasiia Lukianenko
2020-08-06  9:42 ` [RESEND PATCH v2 01/18] Add MIT License Anastasiia Lukianenko
2020-08-14 19:49   ` Tom Rini
2020-08-06  9:42 ` [RESEND PATCH v2 02/18] Kconfig: Introduce CONFIG_XEN Anastasiia Lukianenko
2020-08-14 19:50   ` Tom Rini
2020-08-06  9:42 ` [RESEND PATCH v2 03/18] xen: Add essential and required interface headers Anastasiia Lukianenko
2020-08-14 19:50   ` Tom Rini
2020-08-06  9:42 ` [RESEND PATCH v2 04/18] board: Introduce xenguest_arm64 board Anastasiia Lukianenko
2020-08-14 19:50   ` Tom Rini
2020-08-06  9:42 ` [RESEND PATCH v2 05/18] xen: Port Xen hypervisor related code from mini-os Anastasiia Lukianenko
2020-08-14 19:50   ` Tom Rini
2020-08-06  9:42 ` [RESEND PATCH v2 06/18] xen: Port Xen event channel driver " Anastasiia Lukianenko
2020-08-14 19:50   ` Tom Rini
2020-08-06  9:42 ` [RESEND PATCH v2 07/18] serial: serial_xen: Add Xen PV serial driver Anastasiia Lukianenko
2020-08-14 19:50   ` Tom Rini
2020-08-06  9:42 ` [RESEND PATCH v2 08/18] linux/compat.h: Add wait_event_timeout macro Anastasiia Lukianenko
2020-08-14 19:50   ` Tom Rini
2020-08-06  9:42 ` [RESEND PATCH v2 09/18] lib: sscanf: add sscanf implementation Anastasiia Lukianenko
2020-08-14 19:50   ` Tom Rini
2020-08-16  8:23   ` Andy Shevchenko
     [not found]     ` <999cf014-ac1b-51b6-0522-f75e5ac3a3ed@epam.com>
2020-08-17 12:12       ` Artem Mygaiev
2020-08-17 14:19         ` Tom Rini
2020-08-06  9:42 ` [RESEND PATCH v2 10/18] xen: Port Xen bus driver from mini-os Anastasiia Lukianenko
2020-08-14 19:50   ` Tom Rini
2020-08-06  9:42 ` Anastasiia Lukianenko [this message]
2020-08-14 19:50   ` [RESEND PATCH v2 11/18] xen: Port Xen grant table " Tom Rini
2020-08-06  9:42 ` [RESEND PATCH v2 12/18] xen: pvblock: Add initial support for para-virtualized block driver Anastasiia Lukianenko
2020-08-14 19:50   ` Tom Rini
2020-08-06  9:42 ` [RESEND PATCH v2 13/18] xen: pvblock: Enumerate virtual block devices Anastasiia Lukianenko
2020-08-14 19:51   ` Tom Rini
2020-08-06  9:42 ` [RESEND PATCH v2 14/18] xen: pvblock: Read XenStore configuration and initialize Anastasiia Lukianenko
2020-08-14 19:51   ` Tom Rini
2020-08-06  9:42 ` [RESEND PATCH v2 15/18] xen: pvblock: Implement front-back protocol and do IO Anastasiia Lukianenko
2020-08-14 19:51   ` Tom Rini
2020-08-06  9:42 ` [RESEND PATCH v2 16/18] xen: pvblock: Print found devices indices Anastasiia Lukianenko
2020-08-14 19:51   ` Tom Rini
2020-08-06  9:43 ` [RESEND PATCH v2 17/18] board: xen: De-initialize before jumping to Linux Anastasiia Lukianenko
2020-08-14 19:51   ` Tom Rini
2020-08-06  9:43 ` [RESEND PATCH v2 18/18] doc: xen: Add Xen guest ARM64 board documentation Anastasiia Lukianenko
2020-08-14 19:51   ` Tom Rini
2020-08-13  7:57 ` [RESEND PATCH v2 00/18] Add new board: Xen guest for ARM64 Oleksandr Andrushchenko

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200806094301.4999-12-vicooodin@gmail.com \
    --to=vicooodin@gmail.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.