diff options
Diffstat (limited to 'debian')
| -rw-r--r-- | debian/patches/0001-kern-improve-assert.patch | 35 | ||||
| -rw-r--r-- | debian/patches/0002-i386-specialize-copyinmsg-and-copyoutmsg.patch | 147 | ||||
| -rw-r--r-- | debian/patches/0003-linux-fix-compiler-warning.patch | 29 | ||||
| -rw-r--r-- | debian/patches/series | 3 |
4 files changed, 214 insertions, 0 deletions
diff --git a/debian/patches/0001-kern-improve-assert.patch b/debian/patches/0001-kern-improve-assert.patch new file mode 100644 index 0000000..6ac9d9b --- /dev/null +++ b/debian/patches/0001-kern-improve-assert.patch @@ -0,0 +1,35 @@ +From 435c679a45948f31fb6cb5bd8b9b6b7d2d055cc3 Mon Sep 17 00:00:00 2001 +From: Justus Winter <4winter@informatik.uni-hamburg.de> +Date: Fri, 19 Dec 2014 01:49:09 +0100 +Subject: [PATCH gnumach 1/3] kern: improve assert + +Use the ternary operator to implement `assert' like it is done in the +glibc. The glibcs changelog does not mention the rationale behind +this change, but it does improve our IPC performance. + +* kern/assert.h (assert): Define macro using the ternary operator. +--- + kern/assert.h | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +diff --git a/kern/assert.h b/kern/assert.h +index b074fbb..bd2a8be 100644 +--- a/kern/assert.h ++++ b/kern/assert.h +@@ -39,10 +39,9 @@ + extern void Assert(const char *exp, const char *filename, int line) __attribute__ ((noreturn)); + + #define assert(ex) \ +-MACRO_BEGIN \ +- if (!(ex)) \ +- Assert(#ex, __FILE__, __LINE__); \ +-MACRO_END ++ ((ex) \ ++ ? (void) (0) \ ++ : Assert (#ex, __FILE__, __LINE__)) + + #define assert_static(x) assert(x) + +-- +2.1.3 + diff --git a/debian/patches/0002-i386-specialize-copyinmsg-and-copyoutmsg.patch b/debian/patches/0002-i386-specialize-copyinmsg-and-copyoutmsg.patch new file mode 100644 index 0000000..7603910 --- /dev/null +++ b/debian/patches/0002-i386-specialize-copyinmsg-and-copyoutmsg.patch @@ -0,0 +1,147 @@ +From 5e1d8cea366518faffc10bce12e073634b019469 Mon Sep 17 00:00:00 2001 +From: Justus Winter <4winter@informatik.uni-hamburg.de> +Date: Fri, 19 Dec 2014 01:51:58 +0100 +Subject: [PATCH gnumach 2/3] i386: specialize `copyinmsg' and `copyoutmsg' + +Previously, `copyinmsg' was the same function as `copyin'. The former +is for messages, and the size of messages is a multiple of four. +Likewise for `copyoutmsg'. + +Provide a specialized version of both functions. This shaves off a +couple of instructions and improves our IPC performance. + +* i386/i386/locore.S (copyinmsg): New function. +(copyout): Do not needlessly copy length to %eax first. +(copyoutmsg): New function. +--- + i386/i386/locore.S | 78 +++++++++++++++++++++++++++++++++++++++++++++++++----- + 1 file changed, 71 insertions(+), 7 deletions(-) + +diff --git a/i386/i386/locore.S b/i386/i386/locore.S +index 15715f6..ab17879 100644 +--- a/i386/i386/locore.S ++++ b/i386/i386/locore.S +@@ -1232,13 +1232,12 @@ ENTRY(discover_x86_cpu_type) + */ + + /* +- * Copy from user address space. ++ * Copy from user address space - generic version. + * arg0: user address + * arg1: kernel address + * arg2: byte count + */ + ENTRY(copyin) +-Entry(copyinmsg) + pushl %esi + pushl %edi /* save registers */ + +@@ -1275,13 +1274,43 @@ copyin_fail: + jmp copyin_ret /* pop frame and return */ + + /* +- * Copy to user address space. ++ * Copy from user address space - version for copying messages. ++ * arg0: user address ++ * arg1: kernel address ++ * arg2: byte count - must be a multiple of four ++ */ ++ENTRY(copyinmsg) ++ pushl %esi ++ pushl %edi /* save registers */ ++ ++ movl 8+S_ARG0,%esi /* get user start address */ ++ movl 8+S_ARG1,%edi /* get kernel destination address */ ++ movl 8+S_ARG2,%ecx /* get count */ ++ ++ movl $USER_DS,%eax /* use user data segment for accesses */ ++ mov %ax,%ds ++ ++ /*cld*/ /* count up: default mode in all GCC code */ ++ shrl $2,%ecx ++ RECOVER(copyin_fail) ++ rep ++ movsl /* move longwords */ ++ xorl %eax,%eax /* return 0 for success */ ++ ++ mov %ss,%di /* restore DS to kernel segment */ ++ mov %di,%ds ++ ++ popl %edi /* restore registers */ ++ popl %esi ++ ret /* and return */ ++ ++/* ++ * Copy to user address space - generic version. + * arg0: kernel address + * arg1: user address + * arg2: byte count + */ + ENTRY(copyout) +-Entry(copyoutmsg) + pushl %esi + pushl %edi /* save registers */ + +@@ -1297,14 +1326,13 @@ Entry(copyoutmsg) + jbe copyout_retry /* Use slow version on i386 */ + #endif /* !defined(MACH_HYP) && !PAE */ + +- movl %edx,%eax /* use count */ + /*cld*/ /* count up: always this way in GCC code */ +- movl %eax,%ecx /* move by longwords first */ ++ movl %edx,%ecx /* move by longwords first */ + shrl $2,%ecx + RECOVER(copyout_fail) + rep + movsl +- movl %eax,%ecx /* now move remaining bytes */ ++ movl %edx,%ecx /* now move remaining bytes */ + andl $3,%ecx + RECOVER(copyout_fail) + rep +@@ -1323,6 +1351,42 @@ copyout_fail: + movl $1,%eax /* return 1 for failure */ + jmp copyout_ret /* pop frame and return */ + ++/* ++ * Copy to user address space - version for copying messages. ++ * arg0: kernel address ++ * arg1: user address ++ * arg2: byte count - must be a multiple of four ++ */ ++ENTRY(copyoutmsg) ++ pushl %esi ++ pushl %edi /* save registers */ ++ ++ movl 8+S_ARG0,%esi /* get kernel start address */ ++ movl 8+S_ARG1,%edi /* get user start address */ ++ movl 8+S_ARG2,%ecx /* get count */ ++ ++ movl $USER_DS,%eax /* use user data segment for accesses */ ++ mov %ax,%es ++ ++#if !defined(MACH_HYP) && !PAE ++ movl 8+S_ARG2,%edx /* copyout_retry expects count here */ ++ cmpl $3,machine_slot+SUB_TYPE_CPU_TYPE ++ jbe copyout_retry /* Use slow version on i386 */ ++#endif /* !defined(MACH_HYP) && !PAE */ ++ ++ shrl $2,%ecx /* move by longwords */ ++ RECOVER(copyout_fail) ++ rep ++ movsl ++ xorl %eax,%eax /* return 0 for success */ ++ ++ mov %ss,%di /* restore ES to kernel segment */ ++ mov %di,%es ++ ++ popl %edi /* restore registers */ ++ popl %esi ++ ret /* and return */ ++ + #if !defined(MACH_HYP) && !PAE + /* + * Check whether user address space is writable +-- +2.1.3 + diff --git a/debian/patches/0003-linux-fix-compiler-warning.patch b/debian/patches/0003-linux-fix-compiler-warning.patch new file mode 100644 index 0000000..644b172 --- /dev/null +++ b/debian/patches/0003-linux-fix-compiler-warning.patch @@ -0,0 +1,29 @@ +From 1febf984272cadf96e9e1c22d60fbcb5527e52c0 Mon Sep 17 00:00:00 2001 +From: Justus Winter <4winter@informatik.uni-hamburg.de> +Date: Fri, 19 Dec 2014 02:02:44 +0100 +Subject: [PATCH gnumach 3/3] linux: fix compiler warning + +If the loop above completes at least one iteration, `i' will be larger +than zero. + +* linux/dev/glue/block.c (rdwr_full): Add assertion to appease the +compiler. +--- + linux/dev/glue/block.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/linux/dev/glue/block.c b/linux/dev/glue/block.c +index 79a3646..da4ef38 100644 +--- a/linux/dev/glue/block.c ++++ b/linux/dev/glue/block.c +@@ -624,6 +624,7 @@ rdwr_full (int rw, kdev_t dev, loff_t *off, char **buf, int *resid, int bshift) + } + if (! err) + { ++ assert (i > 0); + ll_rw_block (rw, i, bhp, 0); + wait_on_buffer (bhp[i - 1]); + } +-- +2.1.3 + diff --git a/debian/patches/series b/debian/patches/series index 52021c2..8b3baf7 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -6,3 +6,6 @@ Add-some-padding-to-make-objects-fit-a-single-cache-.patch vm_cache_policy.patch +0001-kern-improve-assert.patch +0002-i386-specialize-copyinmsg-and-copyoutmsg.patch +0003-linux-fix-compiler-warning.patch |
