From c2fa7bf46d6480b2379de17194f675d804047009 Mon Sep 17 00:00:00 2001 From: longjin Date: Thu, 20 Oct 2022 20:50:50 +0800 Subject: [PATCH] =?UTF-8?q?new:=20memcmp=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/common/string.h | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/kernel/common/string.h b/kernel/common/string.h index 0eadc258..b2417c2e 100644 --- a/kernel/common/string.h +++ b/kernel/common/string.h @@ -51,3 +51,28 @@ long strncpy_from_user(char *dst, const char *src, unsigned long size); * @return long */ long strnlen_user(const char *src, unsigned long maxlen); + +/** + * @brief 逐字节比较指定内存区域的值,并返回s1、s2的第一个不相等的字节i处的差值(s1[i]-s2[i])。 + * 若两块内存区域的内容相同,则返回0 + * + * @param s1 内存区域1 + * @param s2 内存区域2 + * @param len 要比较的内存区域长度 + * @return int s1、s2的第一个不相等的字节i处的差值(s1[i]-s2[i])。若两块内存区域的内容相同,则返回0 + */ +static inline int memcmp(const void *s1, const void *s2, size_t len) +{ + int diff; + + asm("cld \n\t" // 复位DF,确保s1、s2指针是自增的 + "repz; cmpsb\n\t" CC_SET(nz) + : CC_OUT(nz)(diff), "+D"(s1), "+S"(s2) + : "c"(len) + : "memory"); + + if (diff) + diff = *(const unsigned char *)(s1 - 1) - *(const unsigned char *)(s2 - 1); + + return diff; +} \ No newline at end of file