Re: [Xen-devel] [PATCH v4 20/33] xen/dts: Provide an helper to get a DT node from a path provided by a guest

2015-03-31 Thread Ian Campbell
On Thu, 2015-03-19 at 19:29 +, Julien Grall wrote:
 The maximum size of the copied string has been chosen based on the value
 use by XSM in similar case.
 
 Furthermore, Linux seems to allow path up to 4096 characters. Though
 this could vary from one OS to another.
 
 Signed-off-by: Julien Grall julien.gr...@linaro.org

Acked-by: Ian Campbell ian.campb...@citrix.com



___
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel


[Xen-devel] [PATCH v4 20/33] xen/dts: Provide an helper to get a DT node from a path provided by a guest

2015-03-19 Thread Julien Grall
The maximum size of the copied string has been chosen based on the value
use by XSM in similar case.

Furthermore, Linux seems to allow path up to 4096 characters. Though
this could vary from one OS to another.

Signed-off-by: Julien Grall julien.gr...@linaro.org

---
Changes in v4:
- Drop DEVICE_TREE_MAX_PATHLEN
- Bump the value to PAGE_SIZE (i.e 4096). It's used in XSM and
this value seems sensible for Linux
- Clarify how the maximum size has been chosen

Changes in v3:
- Use the new prototype of safe_copy_string_from_guest

Changes in v2:
- guest_copy_string_from_guest has been renamed into
safe_copy_string_from_guest
---
 xen/common/device_tree.c  | 18 ++
 xen/include/xen/device_tree.h | 14 ++
 2 files changed, 32 insertions(+)

diff --git a/xen/common/device_tree.c b/xen/common/device_tree.c
index 02cae91..31f169b 100644
--- a/xen/common/device_tree.c
+++ b/xen/common/device_tree.c
@@ -13,6 +13,7 @@
 #include xen/config.h
 #include xen/types.h
 #include xen/init.h
+#include xen/guest_access.h
 #include xen/device_tree.h
 #include xen/kernel.h
 #include xen/lib.h
@@ -23,6 +24,7 @@
 #include xen/cpumask.h
 #include xen/ctype.h
 #include asm/setup.h
+#include xen/err.h
 
 const void *device_tree_flattened;
 dt_irq_xlate_func dt_irq_xlate;
@@ -277,6 +279,22 @@ struct dt_device_node *dt_find_node_by_path(const char 
*path)
 return np;
 }
 
+int dt_find_node_by_gpath(XEN_GUEST_HANDLE(char) u_path, uint32_t u_plen,
+  struct dt_device_node **node)
+{
+char *path;
+
+path = safe_copy_string_from_guest(u_path, u_plen, PAGE_SIZE);
+if ( IS_ERR(path) )
+return PTR_ERR(path);
+
+*node = dt_find_node_by_path(path);
+
+xfree(path);
+
+return (*node == NULL) ? -ESRCH : 0;
+}
+
 struct dt_device_node *dt_find_node_by_alias(const char *alias)
 {
 const struct dt_alias_prop *app;
diff --git a/xen/include/xen/device_tree.h b/xen/include/xen/device_tree.h
index 57eb3ee..e187780 100644
--- a/xen/include/xen/device_tree.h
+++ b/xen/include/xen/device_tree.h
@@ -456,6 +456,20 @@ struct dt_device_node *dt_find_node_by_alias(const char 
*alias);
  */
 struct dt_device_node *dt_find_node_by_path(const char *path);
 
+
+/**
+ * dt_find_node_by_gpath - Same as dt_find_node_by_path but retrieve the
+ * path from the guest
+ *
+ * @u_path: Xen Guest handle to the buffer containing the path
+ * @u_plen: Length of the buffer
+ * @node: TODO
+ *
+ * Return 0 if succeed otherwise -errno
+ */
+int dt_find_node_by_gpath(XEN_GUEST_HANDLE(char) u_path, uint32_t u_plen,
+  struct dt_device_node **node);
+
 /**
  * dt_get_parent - Get a node's parent if any
  * @node: Node to get parent
-- 
2.1.4


___
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel