Don't use kmalloc in get_fn_name()

Back in commit 290962da6e27 ("Reflects symbol table into the kernel"), we
changed from using the old debuginfo to a autogenerated table of strings.
Those new strings are null-terminated.  The old debuginfo wasn't.
get_fn_name() needed to add the trailing \0, but we don't need to anymore.

The end result is that debug code that looks up a function name for a given
symbol, such as backtrace(), won't need to kmalloc.  This will help when we
are trying to backtrace failures in the allocator.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
diff --git a/kern/include/kdebug.h b/kern/include/kdebug.h
index f8744c1..7b482aa 100644
--- a/kern/include/kdebug.h
+++ b/kern/include/kdebug.h
@@ -7,7 +7,7 @@
 /* for includes */ struct proc;
 
 struct symtab_entry {
-	char *name;
+	const char *name;
 	uintptr_t addr;
 };
 
@@ -49,8 +49,8 @@
 static inline uintptr_t get_caller_pc(void);
 
 /* Returns a null-terminated string with the function name for a given PC /
- * instruction pointer.  kfree() the result. */
-char *get_fn_name(uintptr_t pc);
+ * instruction pointer.  Returns NULL on failure. */
+const char *get_fn_name(uintptr_t pc);
 
 /* Returns the address of sym, or 0 if it does not exist */
 uintptr_t get_symbol_addr(char *sym);
diff --git a/kern/src/alarm.c b/kern/src/alarm.c
index 52e21d3..b147095 100644
--- a/kern/src/alarm.c
+++ b/kern/src/alarm.c
@@ -460,16 +460,13 @@
 	       tchain->latest_time);
 	TAILQ_FOREACH(i, &tchain->waiters, next) {
 		uintptr_t f;
-		char *f_name;
 
 		if (i->irq_ok)
 			f = (uintptr_t)i->func_irq;
 		else
 			f = (uintptr_t)i->func;
-		f_name = get_fn_name(f);
 		printk("\tWaiter %p, time %llu, func %p (%s)\n", i,
-		       i->wake_up_time, f, f_name);
-		kfree(f_name);
+		       i->wake_up_time, f, get_fn_name(f));
 	}
 	spin_unlock_irqsave(&tchain->lock);
 }
diff --git a/kern/src/atomic.c b/kern/src/atomic.c
index 5669baa..7af4cfb 100644
--- a/kern/src/atomic.c
+++ b/kern/src/atomic.c
@@ -102,17 +102,14 @@
 void spinlock_debug(spinlock_t *lock)
 {
 	uintptr_t pc = lock->call_site;
-	char *func_name;
 
 	if (!pc) {
 		printk("Lock %p: never locked\n", lock);
 		return;
 	}
-	func_name = get_fn_name(pc);
-	printk("Lock %p: currently %slocked.  Last locked at [<%p>] in %s on "
-	       "core %d\n", lock, spin_locked(lock) ? "" : "un", pc, func_name,
+	printk("Lock %p: currently %slocked.  Last locked at [<%p>] in %s on core %d\n",
+	       lock, spin_locked(lock) ? "" : "un", pc, get_fn_name(pc),
 	       lock->calling_core);
-	kfree(func_name);
 }
 
 #endif /* CONFIG_SPINLOCK_DEBUG */
diff --git a/kern/src/kdebug.c b/kern/src/kdebug.c
index 787de72..6937d6d 100644
--- a/kern/src/kdebug.c
+++ b/kern/src/kdebug.c
@@ -12,13 +12,13 @@
 
 struct symtab_entry gbl_symtab[1] __attribute__((weak)) = {{0, 0}};
 
-/* Returns a null-terminated string with the function name for a given PC /
- * instruction pointer.  kfree() the result. */
-char *get_fn_name(uintptr_t pc)
+/* Returns a null-terminated string from the reflected symbol table with the
+ * function name for a given PC / instruction pointer.  Returns NULL on
+ * failure. */
+const char *get_fn_name(uintptr_t pc)
 {
 	struct symtab_entry *i, *prev = 0, *found = 0;
-	char *buf;
-	size_t name_len;
+
 	/* Table is in ascending order.  As soon as we get to an entry greater than
 	 * us, we were in the previous one.  This is only true if we were given a
 	 * good PC.  Random addresses will just find the previous symbol. */
@@ -30,14 +30,9 @@
 		prev = i;
 	}
 	if (!found)
-		return 0;
+		return NULL;
 	assert(found->name);
-	name_len = strlen(found->name) + 1;
-	buf = kmalloc(name_len, 0);
-	if (!buf)
-		return 0;
-	strlcpy(buf, found->name, name_len);
-	return buf;
+	return found->name;
 }
 
 uintptr_t get_symbol_addr(char *sym)
@@ -204,15 +199,12 @@
 void print_backtrace_list(uintptr_t *pcs, size_t nr_pcs,
 						  void (*pfunc)(void *, const char *), void *opaque)
 {
-	char *func_name;
 	char bt_line[128];
 
 	for (size_t i = 0; i < nr_pcs; i++) {
-		func_name = get_fn_name(pcs[i]);
 		snprintf(bt_line, sizeof(bt_line), "#%02d [<%p>] in %s\n", i + 1,
-				 pcs[i], func_name);
+				 pcs[i], get_fn_name(pcs[i]));
 		pfunc(opaque, bt_line);
-		kfree(func_name);
 	}
 }
 
diff --git a/kern/src/monitor.c b/kern/src/monitor.c
index 3465872..6a5fcaf 100644
--- a/kern/src/monitor.c
+++ b/kern/src/monitor.c
@@ -680,16 +680,12 @@
 
 static void emit_hwtf_backtrace(struct hw_trapframe *hw_tf)
 {
-	char *fn_name;
-
 	if (mon_verbose_trace) {
 		print_trapframe(hw_tf);
 		backtrace_hwtf(hw_tf);
 	}
-	fn_name = get_fn_name(get_hwtf_pc(hw_tf));
 	printk("Core %d is at %p (%s)\n", core_id(), get_hwtf_pc(hw_tf),
-	       fn_name);
-	kfree(fn_name);
+	       get_fn_name(get_hwtf_pc(hw_tf)));
 }
 
 static void emit_vmtf_backtrace(struct vm_trapframe *vm_tf)
diff --git a/kern/src/smp.c b/kern/src/smp.c
index d11083c..43ba748 100644
--- a/kern/src/smp.c
+++ b/kern/src/smp.c
@@ -175,19 +175,18 @@
 static void pcpui_trace_kmsg_handler(void *event, void *data)
 {
 	struct pcpu_trace_event *te = (struct pcpu_trace_event*)event;
-	char *func_name;
 	uintptr_t addr;
+
 	addr = te->arg1;
-	func_name = get_fn_name(addr);
-	printk("\tKMSG %p: %s\n", addr, func_name);
-	kfree(func_name);
+	printk("\tKMSG %p: %s\n", addr, get_fn_name(addr));
 }
 
 static void pcpui_trace_locks_handler(void *event, void *data)
 {
 	struct pcpu_trace_event *te = (struct pcpu_trace_event*)event;
-	char *func_name;
+	const char *func_name;
 	uintptr_t lock_addr = te->arg1;
+
 	if (lock_addr > KERN_LOAD_ADDR)
 		func_name = get_fn_name(lock_addr);
 	else
@@ -195,8 +194,6 @@
 	printk("Time %uus, lock %p (%s)\n", te->arg0, lock_addr, func_name);
 	printk("\t");
 	spinlock_debug((spinlock_t*)lock_addr);
-	if (lock_addr > KERN_LOAD_ADDR)
-		kfree(func_name);
 }
 
 /* Add specific trace handlers here: */
diff --git a/kern/src/trap.c b/kern/src/trap.c
index c29ad8e..a854866 100644
--- a/kern/src/trap.c
+++ b/kern/src/trap.c
@@ -268,14 +268,13 @@
 	struct per_cpu_info *pcpui = &per_cpu_info[coreid];
 	void __print_kmsgs(struct kernel_msg_list *list, char *type)
 	{
-		char *fn_name;
 		struct kernel_message *kmsg_i;
+
 		STAILQ_FOREACH(kmsg_i, list, link) {
-			fn_name = get_fn_name((long)kmsg_i->pc);
 			printk("%s KMSG on %d from %d to run %p(%s)(%p, %p, %p)\n", type,
-			       kmsg_i->dstid, kmsg_i->srcid, kmsg_i->pc, fn_name,
+			       kmsg_i->dstid, kmsg_i->srcid, kmsg_i->pc,
+			       get_fn_name((long)kmsg_i->pc),
 			       kmsg_i->arg0, kmsg_i->arg1, kmsg_i->arg2);
-			kfree(fn_name);
 		}
 	}
 	__print_kmsgs(&pcpui->immed_amsgs, "Immedte");