Add get_val() and set_val() to help getting and setting a natural
sized variable pointed by a void ptr.

Signed-off-by: Sasha Levin <levinsasha...@gmail.com>
---
 virt/kvm/eventfd.c |   57 ++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 42 insertions(+), 15 deletions(-)

diff --git a/virt/kvm/eventfd.c b/virt/kvm/eventfd.c
index 5fb09b4..a1a3f66 100644
--- a/virt/kvm/eventfd.c
+++ b/virt/kvm/eventfd.c
@@ -444,23 +444,10 @@ ioeventfd_release(struct _ioeventfd *p)
        kfree(p);
 }
 
-static bool
-ioeventfd_in_range(struct _ioeventfd *p, gpa_t addr, int len, const void *val)
+static u64 get_val(const void *val, int len)
 {
        u64 _val;
 
-       if (!((addr >= p->addr) && ((addr + len) <= (p->addr + p->length))))
-               /* the entire address-range must be within the ioeventfd */
-               return false;
-
-       if (p->wildcard)
-               /* all else equal, wildcard is always a hit */
-               return true;
-
-       /* otherwise, we have to actually compare the data */
-
-       BUG_ON(!IS_ALIGNED((unsigned long)val, len));
-
        switch (len) {
        case 1:
                _val = *(u8 *)val;
@@ -475,8 +462,48 @@ ioeventfd_in_range(struct _ioeventfd *p, gpa_t addr, int 
len, const void *val)
                _val = *(u64 *)val;
                break;
        default:
-               return false;
+               return 0;
+       }
+
+       return _val;
+}
+
+static void set_val(void *val, int len, u64 new_val)
+{
+       switch (len) {
+       case 1:
+               *(u8 *)val = new_val;
+               break;
+       case 2:
+               *(u16 *)val = new_val;
+               break;
+       case 4:
+               *(u32 *)val = new_val;
+               break;
+       case 8:
+               *(u64 *)val = new_val;
+               break;
        }
+}
+
+static bool
+ioeventfd_in_range(struct _ioeventfd *p, gpa_t addr, int len, const void *val)
+{
+       u64 _val;
+
+       if (!((addr >= p->addr) && ((addr + len) <= (p->addr + p->length))))
+               /* the entire address-range must be within the ioeventfd */
+               return false;
+
+       if (p->wildcard)
+               /* all else equal, wildcard is always a hit */
+               return true;
+
+       /* otherwise, we have to actually compare the data */
+
+       BUG_ON(!IS_ALIGNED((unsigned long)val, len));
+
+       _val = get_val(val, len);
 
        return _val == p->datamatch ? true : false;
 }
-- 
1.7.6

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to