diff options
Diffstat (limited to 'debian')
-rw-r--r-- | debian/patches/00_clean_gfdl.patch | 15 | ||||
-rw-r--r-- | debian/patches/kentry_data_size.patch | 21 | ||||
-rw-r--r-- | debian/patches/series | 4 | ||||
-rw-r--r-- | debian/patches/thread_terminate_release.patch | 112 | ||||
-rw-r--r-- | debian/patches/xen_clock_overflow.patch | 33 |
5 files changed, 169 insertions, 16 deletions
diff --git a/debian/patches/00_clean_gfdl.patch b/debian/patches/00_clean_gfdl.patch deleted file mode 100644 index 05e2a87..0000000 --- a/debian/patches/00_clean_gfdl.patch +++ /dev/null @@ -1,15 +0,0 @@ -Mach's GFDL documentation is not DFSG-free, we need to drop the build rules. - -Index: b/Makefile.am -=================================================================== ---- a/Makefile.am -+++ b/Makefile.am -@@ -117,7 +117,7 @@ include Makefrag.am - include tests/Makefrag.am - - # Documentation. --include doc/Makefrag.am -+#include doc/Makefrag.am - - # - # Kernel Image diff --git a/debian/patches/kentry_data_size.patch b/debian/patches/kentry_data_size.patch new file mode 100644 index 0000000..a6138eb --- /dev/null +++ b/debian/patches/kentry_data_size.patch @@ -0,0 +1,21 @@ +commit dd0989ad8e7526844fcbc2e26bbcc4cc37a010ac +Author: Richard Braun <rbraun@sceen.net> +Date: Thu Oct 10 20:21:17 2013 +0200 + + Increase kernel map entry pool size + + * vm/vm_map.h (KENTRY_DATA_SIZE): Set to 256 pages. + +diff --git a/vm/vm_map.h b/vm/vm_map.h +index 5fdac4e..1caf9ae 100644 +--- a/vm/vm_map.h ++++ b/vm/vm_map.h +@@ -55,7 +55,7 @@ + #include <kern/macro_help.h> + + /* TODO: make it dynamic */ +-#define KENTRY_DATA_SIZE (64*PAGE_SIZE) ++#define KENTRY_DATA_SIZE (256*PAGE_SIZE) + + /* + * Types defined: diff --git a/debian/patches/series b/debian/patches/series index ba1e585..8d6367b 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -3,4 +3,6 @@ 50_initrd.patch 60_bigmem.patch 70_dde.patch - +kentry_data_size.patch +thread_terminate_release.patch +xen_clock_overflow.patch diff --git a/debian/patches/thread_terminate_release.patch b/debian/patches/thread_terminate_release.patch new file mode 100644 index 0000000..bd76488 --- /dev/null +++ b/debian/patches/thread_terminate_release.patch @@ -0,0 +1,112 @@ +commit 22495036a354e209a7f2085bdd2e1fc82895208b +Author: Richard Braun <rbraun@sceen.net> +Date: Sun Nov 24 11:17:54 2013 +0100 + + New RPC for thread destruction + + A new call, thread_terminate_release, is added to support self + destruction in threading libraries. + + * include/mach/gnumach.defs (thread_terminate_release): New + simpleroutine declaration. + * kern/thread.c: Include vm/vm_user.h and ipc/mach_port.h. + (thread_terminate_release): New function. + * kern/thread.h (thread_terminate_release): New prototype. + +diff --git a/include/mach/gnumach.defs b/include/mach/gnumach.defs +index 7331334..12c4e99 100644 +--- a/include/mach/gnumach.defs ++++ b/include/mach/gnumach.defs +@@ -37,3 +37,29 @@ type vm_cache_statistics_data_t = struct[11] of integer_t; + routine vm_cache_statistics( + target_task : vm_task_t; + out vm_cache_stats : vm_cache_statistics_data_t); ++ ++/* ++ * Terminate a thread and release rights and memory. ++ * ++ * Intended to be used by threading libraries to provide a clean way for ++ * threads to terminate themselves. The resources a thread wouldn't be able ++ * to release without this call when terminating itself are its ++ * last reference to its kernel port, its reply port, and its stack. ++ * ++ * This call is semantically equivalent to : ++ * - mach_port_deallocate(task, thread_name); ++ * - if (reply_port != MACH_PORT_NULL) ++ * mach_port_destroy(task, reply_port); ++ * - if ((address != 0) || (size != 0)) ++ * vm_deallocate(task, address, size) ++ * - thread_terminate(thread) ++ * ++ * Implemented as a simple routine so a reply port isn't required. ++ */ ++simpleroutine thread_terminate_release( ++ thread : thread_t; ++ task : task_t; ++ thread_name : mach_port_name_t; ++ reply_port : mach_port_name_t; ++ address : vm_address_t; ++ size : vm_size_t); +diff --git a/kern/thread.c b/kern/thread.c +index eb8a8bb..67fd41e 100644 +--- a/kern/thread.c ++++ b/kern/thread.c +@@ -57,9 +57,11 @@ + #include <kern/slab.h> + #include <kern/mach_clock.h> + #include <vm/vm_kern.h> ++#include <vm/vm_user.h> + #include <ipc/ipc_kmsg.h> + #include <ipc/ipc_port.h> + #include <ipc/mach_msg.h> ++#include <ipc/mach_port.h> + #include <machine/machspl.h> /* for splsched */ + #include <machine/pcb.h> + #include <machine/thread.h> /* for MACHINE_STACK */ +@@ -850,6 +852,28 @@ kern_return_t thread_terminate( + return KERN_SUCCESS; + } + ++kern_return_t thread_terminate_release( ++ thread_t thread, ++ task_t task, ++ mach_port_t thread_name, ++ mach_port_t reply_port, ++ vm_offset_t address, ++ vm_size_t size) ++{ ++ if (task == NULL) ++ return KERN_INVALID_ARGUMENT; ++ ++ mach_port_deallocate(task->itk_space, thread_name); ++ ++ if (reply_port != MACH_PORT_NULL) ++ mach_port_destroy(task->itk_space, reply_port); ++ ++ if ((address != 0) || (size != 0)) ++ vm_deallocate(task->map, address, size); ++ ++ return thread_terminate(thread); ++} ++ + /* + * thread_force_terminate: + * +diff --git a/kern/thread.h b/kern/thread.h +index 3959dfc..beb2dbc 100644 +--- a/kern/thread.h ++++ b/kern/thread.h +@@ -259,6 +259,13 @@ extern kern_return_t thread_create( + thread_t *child_thread); + extern kern_return_t thread_terminate( + thread_t thread); ++extern kern_return_t thread_terminate_release( ++ thread_t thread, ++ task_t task, ++ mach_port_t thread_name, ++ mach_port_t reply_port, ++ vm_offset_t address, ++ vm_size_t size); + extern kern_return_t thread_suspend( + thread_t thread); + extern kern_return_t thread_resume( diff --git a/debian/patches/xen_clock_overflow.patch b/debian/patches/xen_clock_overflow.patch new file mode 100644 index 0000000..ce83da5 --- /dev/null +++ b/debian/patches/xen_clock_overflow.patch @@ -0,0 +1,33 @@ +commit e2dde67c3f46f5bbe7deb90e52b61977df30a52c +Author: Vladimir 'φ-coder/phcoder' Serbinenko <phcoder@gmail.com> +Date: Sat Nov 9 18:52:21 2013 +0100 + + Fix overflow in Xen clock computation + + * xen/time.c (hyp_get_stime): Split `delta` into `delta_high` and + `delta_low`, as it may overflow 4 second timing nowadays. + +diff --git a/xen/time.c b/xen/time.c +index a11e7eb..93d87d4 100644 +--- a/xen/time.c ++++ b/xen/time.c +@@ -34,6 +34,7 @@ static unsigned64_t lastnsec; + static unsigned64_t hyp_get_stime(void) { + unsigned32_t version; + unsigned64_t cpu_clock, last_cpu_clock, delta, system_time; ++ unsigned64_t delta_high, delta_low; + unsigned32_t mul; + signed8_t shift; + volatile struct vcpu_time_info *time = &hyp_shared_info.vcpu_info[0].time; +@@ -54,7 +55,10 @@ static unsigned64_t hyp_get_stime(void) { + delta >>= -shift; + else + delta <<= shift; +- return system_time + ((delta * (unsigned64_t) mul) >> 32); ++ delta_high = delta >> 32; ++ delta_low = (unsigned32_t) delta; ++ return system_time + ((delta_low * (unsigned64_t) mul) >> 32) ++ + (delta_high * (unsigned64_t) mul); + } + + unsigned64_t hyp_get_time(void) { |