diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2011-08-31 03:28:39 +0200 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2011-08-31 03:28:39 +0200 |
commit | a25d046db7a5f67b3aa553f988d2e7527e6a3d2b (patch) | |
tree | fb9671eeef5687d950a957f2f93f2f38c6d36d9f | |
parent | dc8e2985370f05184d47f956d98fc2404dbb6316 (diff) |
Optimize copyout path
* i386/i386/locore.S (copyout): Remove RETRY() use from >=i486 variant. Move
copyout_ret and copyout_fail.
-rw-r--r-- | i386/i386/locore.S | 30 |
1 files changed, 13 insertions, 17 deletions
diff --git a/i386/i386/locore.S b/i386/i386/locore.S index 221201c..c35b7ab 100644 --- a/i386/i386/locore.S +++ b/i386/i386/locore.S @@ -1298,19 +1298,26 @@ Entry(copyoutmsg) movl %eax,%ecx /* move by longwords first */ shrl $2,%ecx RECOVER(copyout_fail) - RETRY(copyout_retry_longs) -copyout_retry_longs: rep movsl movl %eax,%ecx /* now move remaining bytes */ andl $3,%ecx RECOVER(copyout_fail) - RETRY(copyout_retry_bytes) -copyout_retry_bytes: rep movsb /* move */ xorl %eax,%eax /* return 0 for success */ - jmp copyout_ret + +copyout_ret: + mov %ss,%di /* restore ES to kernel segment */ + mov %di,%es + + popl %edi /* restore registers */ + popl %esi + ret /* and return */ + +copyout_fail: + movl $1,%eax /* return 1 for failure */ + jmp copyout_ret /* pop frame and return */ #if !defined(MACH_HYP) && !PAE /* @@ -1372,20 +1379,9 @@ copyout_retry: subl %eax,%edx /* decrement count */ jg copyout_retry /* restart on next page if not done */ xorl %eax,%eax /* return 0 for success */ + jmp copyout_ret #endif /* !defined(MACH_HYP) && !PAE */ -copyout_ret: - mov %ss,%di /* restore ES to kernel segment */ - mov %di,%es - - popl %edi /* restore registers */ - popl %esi - ret /* and return */ - -copyout_fail: - movl $1,%eax /* return 1 for failure */ - jmp copyout_ret /* pop frame and return */ - /* * int inst_fetch(int eip, int cs); * |