summaryrefslogtreecommitdiffstats
path: root/src/include
diff options
context:
space:
mode:
Diffstat (limited to 'src/include')
-rw-r--r--src/include/ipxe/efi/efi_uaccess.h7
-rw-r--r--src/include/ipxe/linux/linux_uaccess.h6
-rw-r--r--src/include/ipxe/uaccess.h30
3 files changed, 43 insertions, 0 deletions
diff --git a/src/include/ipxe/efi/efi_uaccess.h b/src/include/ipxe/efi/efi_uaccess.h
index 79c18972e..870a089b2 100644
--- a/src/include/ipxe/efi/efi_uaccess.h
+++ b/src/include/ipxe/efi/efi_uaccess.h
@@ -76,6 +76,13 @@ UACCESS_INLINE ( efi, memmove_user ) ( userptr_t dest, off_t dest_off,
trivial_memmove_user ( dest, dest_off, src, src_off, len );
}
+static inline __always_inline int
+UACCESS_INLINE ( efi, memcmp_user ) ( userptr_t first, off_t first_off,
+ userptr_t second, off_t second_off,
+ size_t len ) {
+ return trivial_memcmp_user ( first, first_off, second, second_off, len);
+}
+
static inline __always_inline void
UACCESS_INLINE ( efi, memset_user ) ( userptr_t buffer, off_t offset,
int c, size_t len ) {
diff --git a/src/include/ipxe/linux/linux_uaccess.h b/src/include/ipxe/linux/linux_uaccess.h
index e4dfdd357..e4d16d9e0 100644
--- a/src/include/ipxe/linux/linux_uaccess.h
+++ b/src/include/ipxe/linux/linux_uaccess.h
@@ -89,6 +89,12 @@ UACCESS_INLINE(linux, memmove_user)(userptr_t dest, off_t dest_off, userptr_t sr
trivial_memmove_user(dest, dest_off, src, src_off, len);
}
+static inline __always_inline int
+UACCESS_INLINE(linux, memcmp_user)(userptr_t first, off_t first_off, userptr_t second, off_t second_off, size_t len)
+{
+ return trivial_memcmp_user(first, first_off, second, second_off, len);
+}
+
static inline __always_inline void
UACCESS_INLINE(linux, memset_user)(userptr_t buffer, off_t offset, int c, size_t len)
{
diff --git a/src/include/ipxe/uaccess.h b/src/include/ipxe/uaccess.h
index 95e943675..055bb2ca7 100644
--- a/src/include/ipxe/uaccess.h
+++ b/src/include/ipxe/uaccess.h
@@ -127,6 +127,23 @@ trivial_memmove_user ( userptr_t dest, off_t dest_off,
}
/**
+ * Compare data between user buffers
+ *
+ * @v first First buffer
+ * @v first_off First buffer offset
+ * @v second Second buffer
+ * @v second_off Second buffer offset
+ * @v len Length
+ * @ret diff Difference
+ */
+static inline __always_inline int
+trivial_memcmp_user ( userptr_t first, off_t first_off,
+ userptr_t second, off_t second_off, size_t len ) {
+ return memcmp ( ( ( void * ) first + first_off ),
+ ( ( void * ) second + second_off ), len );
+}
+
+/**
* Fill user buffer with a constant byte
*
* @v buffer User buffer
@@ -334,6 +351,19 @@ void memmove_user ( userptr_t dest, off_t dest_off,
userptr_t src, off_t src_off, size_t len );
/**
+ * Compare data between user buffers
+ *
+ * @v first First buffer
+ * @v first_off First buffer offset
+ * @v second Second buffer
+ * @v second_off Second buffer offset
+ * @v len Length
+ * @ret diff Difference
+ */
+int memcmp_user ( userptr_t first, off_t first_off,
+ userptr_t second, off_t second_off, size_t len );
+
+/**
* Fill user buffer with a constant byte
*
* @v userptr User buffer