summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustus Winter <4winter@informatik.uni-hamburg.de>2014-02-01 02:36:38 +0100
committerJustus Winter <4winter@informatik.uni-hamburg.de>2014-02-01 02:36:38 +0100
commit9324f444e1ec98ac24b5126bf2ffd8b6f1fbf666 (patch)
tree23b4d3238b3f20e5a32310c03bbd37217285d513
parenta6ab8f2b53b77a08bed687dc8707e76baf00a597 (diff)
add feature-task-name.patch
-rw-r--r--debian/patches/feature-task-name.patch256
-rw-r--r--debian/patches/series1
2 files changed, 257 insertions, 0 deletions
diff --git a/debian/patches/feature-task-name.patch b/debian/patches/feature-task-name.patch
new file mode 100644
index 0000000..36fc784
--- /dev/null
+++ b/debian/patches/feature-task-name.patch
@@ -0,0 +1,256 @@
+diff --git a/include/mach/debug.defs b/include/mach/debug.defs
+new file mode 100644
+index 0000000..49959ba
+--- /dev/null
++++ b/include/mach/debug.defs
+@@ -0,0 +1,23 @@
++/*
++ * Copyright (c) 2014 Free Software Foundation.
++ *
++ * This program is free software: you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation, either version 3 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program. If not, see <http://www.gnu.org/licenses/>.
++ */
++
++#ifndef _KERN_DEBUG_DEFS_
++#define _KERN_DEBUG_DEFS_
++
++type kernel_debug_name_t = c_string[*: 64];
++
++#endif /* _KERN_DEBUG_DEFS_ */
+diff --git a/include/mach/debug.h b/include/mach/debug.h
+new file mode 100644
+index 0000000..149d800
+--- /dev/null
++++ b/include/mach/debug.h
+@@ -0,0 +1,32 @@
++/*
++ * Copyright (c) 2014 Free Software Foundation.
++ *
++ * This program is free software: you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation, either version 3 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program. If not, see <http://www.gnu.org/licenses/>.
++ */
++
++#ifndef _KERN_DEBUG_H_
++#define _KERN_DEBUG_H_
++
++/*
++ * A fixed-length string data type intended for names given to
++ * kernel objects.
++ *
++ * Note that it is not guaranteed that the in-kernel data
++ * structure will hold KERNEL_DEBUG_NAME_MAX bytes. The given
++ * name will be truncated to fit into the target data structure.
++ */
++#define KERNEL_DEBUG_NAME_MAX (64)
++typedef char kernel_debug_name_t[KERNEL_DEBUG_NAME_MAX];
++
++#endif /* _KERN_DEBUG_H_ */
+diff --git a/include/mach/gnumach.defs b/include/mach/gnumach.defs
+index 12c4e99..273e30b 100644
+--- a/include/mach/gnumach.defs
++++ b/include/mach/gnumach.defs
+@@ -27,6 +27,7 @@ subsystem
+
+ #include <mach/std_types.defs>
+ #include <mach/mach_types.defs>
++#include <mach/debug.defs>
+
+ type vm_cache_statistics_data_t = struct[11] of integer_t;
+
+@@ -63,3 +64,11 @@ simpleroutine thread_terminate_release(
+ reply_port : mach_port_name_t;
+ address : vm_address_t;
+ size : vm_size_t);
++
++/*
++ * Set the name of task TASK to NAME. This is a debugging aid.
++ * NAME will be used in error messages printed by the kernel.
++ */
++simpleroutine task_set_name(
++ task : task_t;
++ name : kernel_debug_name_t);
+diff --git a/ipc/mach_port.c b/ipc/mach_port.c
+index fbc5e69..891d2f2 100644
+--- a/ipc/mach_port.c
++++ b/ipc/mach_port.c
+@@ -571,7 +571,7 @@ mach_port_destroy(
+ kr = ipc_right_lookup_write(space, name, &entry);
+ if (kr != KERN_SUCCESS) {
+ if (name != MACH_PORT_NULL && name != MACH_PORT_DEAD && space == current_space()) {
+- printf("task %p destroying an invalid port %lu, most probably a bug.\n", current_task(), name);
++ printf("task %.*s destroying an invalid port %lu, most probably a bug.\n", TASK_NAME_SIZE, current_task()->name, name);
+ if (mach_port_deallocate_debug)
+ SoftDebugger("mach_port_deallocate");
+ }
+@@ -615,7 +615,7 @@ mach_port_deallocate(
+ kr = ipc_right_lookup_write(space, name, &entry);
+ if (kr != KERN_SUCCESS) {
+ if (name != MACH_PORT_NULL && name != MACH_PORT_DEAD && space == current_space()) {
+- printf("task %p deallocating an invalid port %lu, most probably a bug.\n", current_task(), name);
++ printf("task %.*s deallocating an invalid port %lu, most probably a bug.\n", TASK_NAME_SIZE, current_task()->name, name);
+ if (mach_port_deallocate_debug)
+ SoftDebugger("mach_port_deallocate");
+ }
+diff --git a/kern/printf.c b/kern/printf.c
+index af59d5a..ea78d48 100644
+--- a/kern/printf.c
++++ b/kern/printf.c
+@@ -615,6 +615,16 @@ vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
+ return cookie.index;
+ }
+
++int
++snprintf(char *buf, size_t size, const char *fmt, ...)
++{
++ int written;
++ va_list listp;
++ va_start(listp, fmt);
++ written = vsnprintf(buf, size, fmt, listp);
++ va_end(listp);
++ return written;
++}
+
+ void safe_gets(str, maxlen)
+ char *str;
+diff --git a/kern/printf.h b/kern/printf.h
+index 8b4e760..0f8b328 100644
+--- a/kern/printf.h
++++ b/kern/printf.h
+@@ -40,6 +40,7 @@ extern void printnum (unsigned long u, int base,
+ vm_offset_t putc_arg);
+
+ extern int sprintf (char *buf, const char *fmt, ...);
++extern int snprintf (char *buf, size_t size, const char *fmt, ...);
+ extern int vsnprintf (char *buf, size_t size, const char *fmt, va_list args);
+
+ extern int printf (const char *fmt, ...);
+diff --git a/kern/slab.c b/kern/slab.c
+index d1e3632..3fc95b6 100644
+--- a/kern/slab.c
++++ b/kern/slab.c
+@@ -662,7 +662,8 @@ static void kmem_cache_error(struct kmem_cache *cache, void *buf, int error,
+ {
+ struct kmem_buftag *buftag;
+
+- kmem_error("cache: %s, buffer: %p", cache->name, (void *)buf);
++ kmem_error("cache: %.*s, buffer: %p", KMEM_CACHE_NAME_SIZE, cache->name,
++ (void *)buf);
+
+ switch(error) {
+ case KMEM_ERR_INVALID:
+diff --git a/kern/task.c b/kern/task.c
+index 13b3c76..0c45d43 100644
+--- a/kern/task.c
++++ b/kern/task.c
+@@ -37,6 +37,7 @@
+ #include <mach/vm_param.h>
+ #include <mach/task_info.h>
+ #include <mach/task_special_ports.h>
++#include <mach/debug.h>
+ #include <ipc/ipc_space.h>
+ #include <ipc/ipc_types.h>
+ #include <kern/debug.h>
+@@ -45,6 +46,7 @@
+ #include <kern/slab.h>
+ #include <kern/kalloc.h>
+ #include <kern/processor.h>
++#include <kern/printf.h>
+ #include <kern/sched_prim.h> /* for thread_wakeup */
+ #include <kern/ipc_tt.h>
+ #include <kern/syscall_emulation.h>
+@@ -164,6 +166,8 @@ kern_return_t task_create(
+ }
+ #endif /* FAST_TAS */
+
++ snprintf (new_task->name, TASK_NAME_SIZE, "%p", new_task);
++
+ ipc_task_enable(new_task);
+
+ *child_task = new_task;
+@@ -1068,6 +1072,21 @@ task_priority(
+ }
+
+ /*
++ * task_set_name
++ *
++ * Set the name of task TASK to NAME. This is a debugging aid.
++ * NAME will be used in error messages printed by the kernel.
++ */
++kern_return_t
++task_set_name(
++ task_t task,
++ kernel_debug_name_t name)
++{
++ strncpy(task->name, name, sizeof task->name);
++ return KERN_SUCCESS;
++}
++
++/*
+ * task_collect_scan:
+ *
+ * Attempt to free resources owned by tasks.
+diff --git a/kern/task.h b/kern/task.h
+index e852033..bf5bb53 100644
+--- a/kern/task.h
++++ b/kern/task.h
+@@ -39,6 +39,7 @@
+ #include <mach/time_value.h>
+ #include <mach/mach_param.h>
+ #include <mach/task_info.h>
++#include <mach/debug.h>
+ #include <kern/kern_types.h>
+ #include <kern/lock.h>
+ #include <kern/queue.h>
+@@ -48,6 +49,13 @@
+ #include <vm/vm_types.h>
+ #include <machine/task.h>
+
++/*
++ * Task name buffer size. The size is chosen so that struct task fits
++ * into three cache lines. The size of a cache line on a typical CPU
++ * is 64 bytes.
++ */
++#define TASK_NAME_SIZE 32
++
+ struct task {
+ /* Synchronization/destruction information */
+ decl_simple_lock_data(,lock) /* Task's lock */
+@@ -113,6 +121,8 @@ struct task {
+ natural_t cow_faults; /* copy-on-write faults counter */
+ natural_t messages_sent; /* messages sent counter */
+ natural_t messages_received; /* messages received counter */
++
++ char name[TASK_NAME_SIZE];
+ };
+
+ #define task_lock(task) simple_lock(&(task)->lock)
+@@ -160,6 +170,9 @@ extern kern_return_t task_assign(
+ extern kern_return_t task_assign_default(
+ task_t task,
+ boolean_t assign_threads);
++extern kern_return_t task_set_name(
++ task_t task,
++ kernel_debug_name_t name);
+ extern void consider_task_collect(void);
+
+ /*
diff --git a/debian/patches/series b/debian/patches/series
index 3296a83..99269dc 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -4,3 +4,4 @@
60_bigmem.patch
70_dde.patch
protected_payload.patch
+feature-task-name.patch