Index: uspace/lib/libc/generic/string.c
===================================================================
--- uspace/lib/libc/generic/string.c	(revision 47acd58dbd0d6c4823899e3ac530dfeecf0f4457)
+++ uspace/lib/libc/generic/string.c	(revision 6b080e5478f25a6f57a8d5267a82dcefca28be36)
@@ -43,14 +43,54 @@
 #include <malloc.h>
 
-/* Dummy implementation of mem/ functions */
-
-void *memset(void *s, int c, size_t n)
-{
-	char *os = s;
-	
-	while (n--)
-		*(os++) = c;
-	
-	return s;
+/** Fill memory block with a constant value. */
+void *memset(void *dest, int b, size_t n)
+{
+	char *pb;
+	unsigned long *pw;
+	size_t word_size;
+	size_t n_words;
+
+	unsigned long pattern;
+	size_t i;
+	size_t fill;
+
+	/* Fill initial segment. */
+	word_size = sizeof(unsigned long);
+	fill = word_size - ((uintptr_t) dest & (word_size - 1));
+	if (fill > n) fill = n;
+
+	pb = dest;
+
+	i = fill;
+	while (i-- != 0)
+		*pb++ = b;
+
+	/* Compute remaining size. */
+	n -= fill;
+	if (n == 0) return dest;
+
+	n_words = n / word_size;
+	n = n % word_size;
+	pw = (unsigned long *) pb;
+
+	/* Create word-sized pattern for aligned segment. */
+	pattern = 0;
+	i = word_size;
+	while (i-- != 0)
+		pattern = (pattern << 8) | (uint8_t) b;
+
+	/* Fill aligned segment. */
+	i = n_words;
+	while (i-- != 0)
+		*pw++ = pattern;
+
+	pb = (char *) pw;
+
+	/* Fill final segment. */
+	i = n;
+	while (i-- != 0)
+		*pb++ = b;
+
+	return dest;
 }
 
@@ -115,5 +155,5 @@
 
 	i = fill;
-	while (i-- > 0)
+	while (i-- != 0)
 		*dstb++ = *srcb++;
 
@@ -133,5 +173,5 @@
 	/* "Fast" copy. */
 	i = n_words;
-	while (i-- > 0)
+	while (i-- != 0)
 		*dstw++ = *srcw++;
 
@@ -144,5 +184,5 @@
 
 	i = n;
-	while (i-- > 0)
+	while (i-- != 0)
 		*dstb++ = *srcb++;
 
