|
@@ -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
|
*
|