diff --git a/arch/sparc/kernel/ttable.S b/arch/sparc/kernel/ttable.S
index 6d8648114d08f2d9125812fe62177f72fde69217..ececfbb3818b9db00be506d356e5d4592385b6bf 100644
--- a/arch/sparc/kernel/ttable.S
+++ b/arch/sparc/kernel/ttable.S
@@ -145,8 +145,6 @@ hw_div0_trap_handler:
 nmi_entry:
 	.global reg_access_trap_handler
 reg_access_trap_handler:
-	.global strchr
-strchr:
 	.global syscall_tbl
 syscall_tbl:
 	.global syscall_trap
@@ -159,4 +157,4 @@ syscall_trap:
 unimpl_flush_trap_handler:
 	.global watchpoint_det_trap_handler
 watchpoint_det_trap_handler:
-	ta 0
+	ta 3
diff --git a/include/kernel/string.h b/include/kernel/string.h
index b5a18adfac2e3f9229d98f5338bc3cb79f2068e6..4296a80ee967029aa9ba67ab1058dc1e80841e51 100644
--- a/include/kernel/string.h
+++ b/include/kernel/string.h
@@ -20,6 +20,8 @@ char *strpbrk(const char *s, const char *accept);
 char *strsep(char **stringp, const char *delim);
 char *strdup(const char *s);
 
+char *strchr(const char *s, int c);
+
 char *strstr(const char *haystack, const char *needle);
 size_t strlen(const char *s);
 int memcmp(const void *s1, const void *s2, size_t n);
diff --git a/lib/string.c b/lib/string.c
index 271190181c553240f51a4ae4ef78b24e0c4efc10..6a50f1c8c4ab6634df43eb64ebd1f8387614880c 100644
--- a/lib/string.c
+++ b/lib/string.c
@@ -172,6 +172,33 @@ char *strdup(const char *s)
 EXPORT_SYMBOL(strdup);
 
 
+/**
+ * @brief locate a character in string
+ *
+ * @param s the string to search in
+ * @param c the character to search for
+ *
+ * @returns a pointer to the first matched character or NULL if not found
+ *
+ * @note the terminating null byte is considered part of the string, so that if
+ *	 c is given as '\0', the function returns a pointer to the terminator
+ */
+
+char *strchr(const char *s, int c)
+{
+	while ((*s) != (char) c) {
+
+		if ((*s) == '\0')
+			return NULL;
+
+		s++;
+	}
+
+	return (char *) s;
+}
+EXPORT_SYMBOL(strchr);
+
+
 /**
  * @brief calculate the length of a string
  *