Browse Source

[libc] Fix and externalise memswap()

Make memswap() behave correctly if called with a length of zero.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
tags/v1.20.1
Michael Brown 11 years ago
parent
commit
53f3deee06
2 changed files with 30 additions and 15 deletions
  1. 28
    0
      src/arch/x86/core/x86_string.c
  2. 2
    15
      src/arch/x86/include/bits/string.h

+ 28
- 0
src/arch/x86/core/x86_string.c View File

@@ -105,6 +105,34 @@ void * __memmove ( void *dest, const void *src, size_t len ) {
105 105
 	}
106 106
 }
107 107
 
108
+/**
109
+ * Swap memory areas
110
+ *
111
+ * @v dest		Destination address
112
+ * @v src		Source address
113
+ * @v len		Length
114
+ * @ret dest		Destination address
115
+ */
116
+void * memswap ( void *dest, void *src, size_t len ) {
117
+	size_t discard_c;
118
+	int discard;
119
+
120
+	__asm__ __volatile__ ( "\n1:\n\t"
121
+			       "dec %2\n\t"
122
+			       "js 2f\n\t"
123
+			       "movb (%0,%2), %b3\n\t"
124
+			       "xchgb (%1,%2), %b3\n\t"
125
+			       "movb %b3, (%0,%2)\n\t"
126
+			       "jmp 1b\n\t"
127
+			       "2:\n\t"
128
+			       : "=r" ( src ), "=r" ( dest ),
129
+				 "=&c" ( discard_c ), "=&q" ( discard )
130
+			       : "0" ( src ), "1" ( dest ), "2" ( len )
131
+			       : "memory" );
132
+
133
+	return dest;
134
+}
135
+
108 136
 /**
109 137
  * Calculate length of string
110 138
  *

+ 2
- 15
src/arch/x86/include/bits/string.h View File

@@ -213,21 +213,8 @@ static inline void * memset ( void *dest, int fill, size_t len ) {
213 213
 }
214 214
 
215 215
 #define __HAVE_ARCH_MEMSWAP
216
-static inline void * memswap(void *dest, void *src, size_t n)
217
-{
218
-long d0, d1, d2, d3;
219
-__asm__ __volatile__(
220
-	"\n1:\t"
221
-	"movb (%2),%%al\n\t"
222
-	"xchgb (%1),%%al\n\t"
223
-	"inc %1\n\t"
224
-	"stosb\n\t"
225
-	"loop 1b"
226
-	: "=&c" (d0), "=&S" (d1), "=&D" (d2), "=&a" (d3)
227
-	: "0" (n), "1" (src), "2" (dest)
228
-	: "memory" );
229
-return dest;
230
-}
216
+
217
+extern void * memswap ( void *dest, void *src, size_t len );
231 218
 
232 219
 #define __HAVE_ARCH_STRNCMP
233 220
 

Loading…
Cancel
Save