diff options
author | Justus Winter <4winter@informatik.uni-hamburg.de> | 2015-02-20 19:14:29 +0100 |
---|---|---|
committer | Justus Winter <4winter@informatik.uni-hamburg.de> | 2015-02-20 19:14:29 +0100 |
commit | 921df2f336840cff8e25d11f85b44a6b274b9902 (patch) | |
tree | 08ac140e1f92e4ced28c0cc9b97f62cf0dd2bd68 /debian/patches/0004-i386-specialize-copyinmsg-and-copyoutmsg.patch | |
parent | 7faa9f6b5433cfc2ad154ea8be59623fc48a9f23 (diff) |
add patch series
Diffstat (limited to 'debian/patches/0004-i386-specialize-copyinmsg-and-copyoutmsg.patch')
-rw-r--r-- | debian/patches/0004-i386-specialize-copyinmsg-and-copyoutmsg.patch | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/debian/patches/0004-i386-specialize-copyinmsg-and-copyoutmsg.patch b/debian/patches/0004-i386-specialize-copyinmsg-and-copyoutmsg.patch new file mode 100644 index 0000000..1139e74 --- /dev/null +++ b/debian/patches/0004-i386-specialize-copyinmsg-and-copyoutmsg.patch @@ -0,0 +1,139 @@ +From d3f20b06cee70fd5afe8aaff31614756a57e6bb6 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 4/4] 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. +(copyoutmsg): New function. +--- + i386/i386/locore.S | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++--- + 1 file changed, 79 insertions(+), 4 deletions(-) + +diff --git a/i386/i386/locore.S b/i386/i386/locore.S +index 2e04bb8..cfda86f 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,48 @@ 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(copyinmsg_fail) ++ rep ++ movsl /* move longwords */ ++ xorl %eax,%eax /* return 0 for success */ ++ ++copyinmsg_ret: ++ mov %ss,%di /* restore DS to kernel segment */ ++ mov %di,%ds ++ ++ popl %edi /* restore registers */ ++ popl %esi ++ ret /* and return */ ++ ++copyinmsg_fail: ++ movl $1,%eax /* return 1 for failure */ ++ jmp copyinmsg_ret /* pop frame 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 */ + +@@ -1322,6 +1356,47 @@ 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(copyoutmsg_fail) ++ rep ++ movsl ++ xorl %eax,%eax /* return 0 for success */ ++ ++copyoutmsg_ret: ++ mov %ss,%di /* restore ES to kernel segment */ ++ mov %di,%es ++ ++ popl %edi /* restore registers */ ++ popl %esi ++ ret /* and return */ ++ ++copyoutmsg_fail: ++ movl $1,%eax /* return 1 for failure */ ++ jmp copyoutmsg_ret /* pop frame and return */ ++ + #if !defined(MACH_HYP) && !PAE + /* + * Check whether user address space is writable +-- +2.1.4 + |