Fixes memset() bug
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 9 Jan 2013 02:54:46 +0000 (18:54 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 9 Jan 2013 02:54:46 +0000 (18:54 -0800)
When you cast an int such as 0xfe to a char, you get 0xfffffffe, and not
0x000000fe.

kern/src/string.c
kern/src/testing.c

index 4e3db1e..86ad8cb 100644 (file)
@@ -139,7 +139,7 @@ memsetw(long* _v, long c, size_t n)
        start = _v;
        end = _v + n/sizeof(long);
        v = _v;
-       c = (char)c;
+       c = c & 0xff;
        c = c | c<<8;
        c = c | c<<16;
        #if NUM_ADDR_BITS == 64
index aeb7658..e83ec17 100644 (file)
@@ -1573,3 +1573,42 @@ void test_cv(void)
        }
        printk("test_cv: single sender/receiver complete\n");
 }
+
+/* Based on a bug I noticed.  TODO: actual memset test... */
+void test_memset(void)
+{
+       #define ARR_SZ 256
+       
+       void print_array(char *c, size_t len)
+       {
+               for (int i = 0; i < len; i++)
+                       printk("%04d: %02x\n", i, *c++);
+       }
+       
+       void check_array(char *c, char x, size_t len)
+       {
+               for (int i = 0; i < len; i++) {
+                       if (*c != x) {
+                               printk("Char %d is %c (%02x), should be %c (%02x)\n", i, *c,
+                                      *c, x, x);
+                               break;
+                       }
+                       c++;
+               }
+       }
+       
+       void run_check(char *arr, int ch, size_t len)
+       {
+               char *c = arr;
+               for (int i = 0; i < ARR_SZ; i++)
+                       *c++ = 0x0;
+               memset(arr, ch, len - 4);
+               check_array(arr, ch, len - 4);
+               check_array(arr + len - 4, 0x0, 4);
+       }
+
+       char bytes[ARR_SZ];
+       run_check(bytes, 0xfe, 20);
+       run_check(bytes, 0xc0fe, 20);
+       printk("Done!\n");
+}