All of lore.kernel.org
 help / color / mirror / Atom feed
From: Christopher Clark <christopher.w.clark@gmail.com>
To: xen-devel@lists.xenproject.org
Cc: Stefano Stabellini <sstabellini@kernel.org>,
	Wei Liu <wei.liu2@citrix.com>,
	Ross Philipson <ross.philipson@gmail.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	George Dunlap <George.Dunlap@eu.citrix.com>,
	Andrew Cooper <andrew.cooper3@citrix.com>,
	Jason Andryuk <jandryuk@gmail.com>,
	Ian Jackson <ian.jackson@eu.citrix.com>,
	Rich Persaud <persaur@gmail.com>, Tim Deegan <tim@xen.org>,
	Daniel Smith <dpsmith@apertussolutions.com>,
	Julien Grall <julien.grall@arm.com>,
	Paul Durrant <paul.durrant@citrix.com>,
	Jan Beulich <jbeulich@suse.com>,
	James McKenzie <james@bromium.com>,
	Eric Chanudet <eric.chanudet@gmail.com>,
	Roger Pau Monne <roger.pau@citrix.com>
Subject: [PATCH v2 05/18] xen: add simple errno-returning macros for copy from guest
Date: Wed, 19 Dec 2018 22:39:02 -0800	[thread overview]
Message-ID: <1545287955-27684-6-git-send-email-christopher.w.clark@gmail.com> (raw)
In-Reply-To: <1545287955-27684-1-git-send-email-christopher.w.clark@gmail.com>

Adds: copy_from_guest_errno(ptr, hnd, nr)
 and: copy_from_guest_offset_errno(ptr, hnd, off, nr)

Inputs are identical to copy_from_guest and copy_from_guest_offset:

    - ptr: pointer to local memory to write into
    - hnd: guest handle to read from
    -  nr: number of records to copy
    - off: offset from the source handle to start the copy from.

The new versions perform the same work as the existing copy_from_guest and
copy_from_guest_offset, but differ in return value when the function does
not succeed in performing a complete copy: the new functions return an errno
value on error, rather than the number of bytes that could not be copied.

This is to allow for improvements in tidy error handling flow at call sites
in the common case.
eg. to enable this sequence:

    ret = copy_from_guest_errno(&iov, iovs, 1);
    if ( ret )
        goto out;
    ...

instead of the prior:

    if ( copy_from_guest(&iov, iovs, 1) )
    {
        ret = -EFAULT;
        goto out;
    }
        ...

or assigning ret a default value of -EFAULT at point of declaration.

In (almost?) all cases the result of copy_from_guest must be checked
and the error code if one is to be generated is (always?) EFAULT.
This change moves that check and error code translation into common code.

This errno-returning function interface originates from Bromium's uxen and
an additional motivation for introducing this is to simplify comparison and
maintenance of common code between argo and v4v.

Applied to both x86 and ARM headers.

Signed-off-by: Christopher Clark <christopher.clark6@baesystems.com>

---
v1 #7 feedback, Paul: corrected and significantly simplified implementation

The need for this interface was questioned during the first series review,
(which wasn't much helped by the implementation or commit message that was
provided in that patch, sorry) -- it wasn't the primary focus of the series,
so wasn't forefront in attention beforehand. However, I maintain that this
interface is better for nearly all the call sites using the guest access
macros, and will simplify code using them -- that plus easing work across
the uxen and Xen codebases together provides reasonable justification for
inclusion in the common code.

 xen/include/asm-arm/guest_access.h | 3 +++
 xen/include/asm-x86/guest_access.h | 3 +++
 xen/include/xen/guest_access.h     | 3 +++
 3 files changed, 9 insertions(+)

diff --git a/xen/include/asm-arm/guest_access.h b/xen/include/asm-arm/guest_access.h
index 224d2a0..8722858 100644
--- a/xen/include/asm-arm/guest_access.h
+++ b/xen/include/asm-arm/guest_access.h
@@ -97,6 +97,9 @@ int access_guest_memory_by_ipa(struct domain *d, paddr_t ipa, void *buf,
     typeof(*(ptr)) *_d = (ptr);                         \
     raw_copy_from_guest(_d, _s+(off), sizeof(*_d)*(nr));\
 })
+#define copy_from_guest_offset_errno(ptr, hnd, off, nr)  \
+    (copy_from_guest_offset((ptr), (hnd), (off), (nr)) ? \
+        -EFAULT : 0)
 
 /* Copy sub-field of a structure to guest context via a guest handle. */
 #define copy_field_to_guest(hnd, ptr, field) ({         \
diff --git a/xen/include/asm-x86/guest_access.h b/xen/include/asm-x86/guest_access.h
index ca700c9..9399480 100644
--- a/xen/include/asm-x86/guest_access.h
+++ b/xen/include/asm-x86/guest_access.h
@@ -100,6 +100,9 @@
     typeof(*(ptr)) *_d = (ptr);                         \
     raw_copy_from_guest(_d, _s+(off), sizeof(*_d)*(nr));\
 })
+#define copy_from_guest_offset_errno(ptr, hnd, off, nr)  \
+    (copy_from_guest_offset((ptr), (hnd), (off), (nr)) ? \
+        -EFAULT : 0)                                     \
 
 #define clear_guest_offset(hnd, off, nr) ({    \
     void *_d = (hnd).p;                        \
diff --git a/xen/include/xen/guest_access.h b/xen/include/xen/guest_access.h
index 09989df..4a8ea1f 100644
--- a/xen/include/xen/guest_access.h
+++ b/xen/include/xen/guest_access.h
@@ -17,6 +17,9 @@
 #define copy_from_guest(ptr, hnd, nr)                   \
     copy_from_guest_offset(ptr, hnd, 0, nr)
 
+#define copy_from_guest_errno(ptr, hnd, nr)             \
+    (copy_from_guest_offset(ptr, hnd, 0, nr) ? -EFAULT : 0)
+
 #define clear_guest(hnd, nr)                            \
     clear_guest_offset(hnd, 0, nr)
 
-- 
2.7.4


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

  parent reply	other threads:[~2018-12-20  6:39 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-12-20  6:38 [PATCH v2 00/18] Argo: hypervisor-mediated interdomain communication Christopher Clark
2018-12-20  6:38 ` [PATCH v2 01/18] argo: Introduce the Kconfig option to govern inclusion of Argo Christopher Clark
2018-12-20  9:00   ` Jan Beulich
2018-12-20  6:38 ` [PATCH v2 02/18] argo: introduce the argo_message_op hypercall boilerplate Christopher Clark
2018-12-20 15:18   ` Jan Beulich
2018-12-20  6:39 ` [PATCH v2 03/18] argo: define argo_dprintk for subsystem debugging Christopher Clark
2018-12-20 15:20   ` Jan Beulich
2018-12-20  6:39 ` [PATCH v2 04/18] argo: init, destroy and soft-reset, with enable command line opt Christopher Clark
2018-12-20 14:41   ` Lars Kurth
2018-12-20  6:39 ` Christopher Clark [this message]
2018-12-20  6:39 ` [PATCH v2 06/18] xen: add XEN_GUEST_HANDLE_NULL macros for null XEN_GUEST_HANDLE Christopher Clark
2018-12-20  6:39 ` [PATCH v2 07/18] errno: add POSIX error codes EMSGSIZE, ECONNREFUSED to the ABI Christopher Clark
2018-12-20 15:22   ` Jan Beulich
2018-12-20  6:39 ` [PATCH v2 08/18] xen/arm: introduce guest_handle_for_field() Christopher Clark
2018-12-20  6:39 ` [PATCH v2 09/18] xsm, argo: XSM control for argo register; add argo_mac bootparam Christopher Clark
2018-12-20 15:29   ` Jan Beulich
2018-12-20  6:39 ` [PATCH v2 10/18] xsm, argo: XSM control for argo message send operation Christopher Clark
2018-12-20  6:39 ` [PATCH v2 11/18] argo: implement the register op Christopher Clark
2018-12-20 11:20   ` Julien Grall
2018-12-21  1:17     ` Christopher Clark
2018-12-21 12:21       ` Julien Grall
2018-12-20  6:39 ` [PATCH v2 12/18] argo: implement the unregister op Christopher Clark
2018-12-20  6:39 ` [PATCH v2 13/18] argo: implement the sendv op; evtchn: expose send_guest_global_virq Christopher Clark
2018-12-20  6:39 ` [PATCH v2 14/18] argo: implement the notify op Christopher Clark
2018-12-20  6:39 ` [PATCH v2 15/18] xsm, argo: XSM control for any access to argo by a domain Christopher Clark
2018-12-20  6:39 ` [PATCH v2 16/18] xsm, argo: notify: don't describe rings that cannot be sent to Christopher Clark
2018-12-20  6:39 ` [PATCH v2 17/18] argo: validate hypercall arg structures via compat machinery Christopher Clark
2018-12-20  6:39 ` [PATCH v2 18/18] argo: unmap rings on suspend; signal ring-owners on resume Christopher Clark

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=1545287955-27684-6-git-send-email-christopher.w.clark@gmail.com \
    --to=christopher.w.clark@gmail.com \
    --cc=George.Dunlap@eu.citrix.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=dpsmith@apertussolutions.com \
    --cc=eric.chanudet@gmail.com \
    --cc=ian.jackson@eu.citrix.com \
    --cc=james@bromium.com \
    --cc=jandryuk@gmail.com \
    --cc=jbeulich@suse.com \
    --cc=julien.grall@arm.com \
    --cc=konrad.wilk@oracle.com \
    --cc=paul.durrant@citrix.com \
    --cc=persaur@gmail.com \
    --cc=roger.pau@citrix.com \
    --cc=ross.philipson@gmail.com \
    --cc=sstabellini@kernel.org \
    --cc=tim@xen.org \
    --cc=wei.liu2@citrix.com \
    --cc=xen-devel@lists.xenproject.org \
    /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.