summaryrefslogtreecommitdiff
path: root/debian
diff options
context:
space:
mode:
authorJustus Winter <4winter@informatik.uni-hamburg.de>2014-12-19 02:06:35 +0100
committerJustus Winter <4winter@informatik.uni-hamburg.de>2014-12-19 02:06:35 +0100
commitdf667b5b58e5ae0d9479c4bc0ffb37a39b57978f (patch)
treefbf5a364a167f3b5d54457c931e14738a788d358 /debian
parent9f011e6defe9a3023921ff8c425a90faf4df91d5 (diff)
add patch series
Diffstat (limited to 'debian')
-rw-r--r--debian/patches/0001-kern-improve-assert.patch35
-rw-r--r--debian/patches/0002-i386-specialize-copyinmsg-and-copyoutmsg.patch147
-rw-r--r--debian/patches/0003-linux-fix-compiler-warning.patch29
-rw-r--r--debian/patches/series3
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