This moves the user memcpy inline asm to an uaccess.c file, to avoid GCC messing up with ECX loading.
https://github.com/brho/akaros/compare/master...dlibenzi:gcc_fuggetaboud_ecx The following changes since commit 2fa42319139e4cc5ca853546363f84443d0ead00: Rename 'reallocarray' to 'kreallocarray'. (2015-11-25 18:02:04 -0500) are available in the git repository at: [email protected]:dlibenzi/akaros gcc_fuggetaboud_ecx for you to fetch changes up to 93d0ee92f6a3fee03e149a7462f17277c386cbda: Fix nasty GCC bug where ECX was forgotten (2015-12-09 19:29:11 -0800) ---------------------------------------------------------------- Davide Libenzi (1): Fix nasty GCC bug where ECX was forgotten kern/arch/x86/Kbuild | 1 + kern/arch/x86/uaccess.c | 26 ++++++++++++++++++++++++++ kern/arch/x86/uaccess.h | 11 +++++++---- 3 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 kern/arch/x86/uaccess.c diff --git a/kern/arch/x86/Kbuild b/kern/arch/x86/Kbuild index ae25726..cbc4e65 100644 --- a/kern/arch/x86/Kbuild +++ b/kern/arch/x86/Kbuild @@ -31,4 +31,5 @@ obj-y += trap.o trap64.o obj-y += trapentry64.o obj-y += usb.o obj-y += topology.o +obj-y += uaccess.o obj-y += vmm/ diff --git a/kern/arch/x86/uaccess.c b/kern/arch/x86/uaccess.c new file mode 100644 index 0000000..6d13924 --- /dev/null +++ b/kern/arch/x86/uaccess.c @@ -0,0 +1,26 @@ +/* Copyright (c) 2015 Google Inc + * Davide Libenzi <[email protected]> + * See LICENSE for details. + * + * Part of this code coming from a Linux kernel file: + * + * linux/arch/x86/include/asm/uaccess.h + * + * Which, even though missing specific copyright, it is supposed to be + * ruled by the overall Linux copyright. + */ + +#include <ros/errno.h> +#include <compiler.h> +#include <stdint.h> +#include <umem.h> +#include <arch/uaccess.h> + +int user_memcpy(void *dst, const void *src, unsigned int count) +{ + int err = 0; + + __user_memcpy(dst, src, count, err, -EFAULT); + + return err; +} diff --git a/kern/arch/x86/uaccess.h b/kern/arch/x86/uaccess.h index cba0ef5..d5f1ea3 100644 --- a/kern/arch/x86/uaccess.h +++ b/kern/arch/x86/uaccess.h @@ -94,6 +94,7 @@ struct extable_ip_fixup { #define __user_memcpy(dst, src, count, err, errret) \ asm volatile(ASM_STAC "\n" \ + " cld\n" \ "1: rep movsb\n" \ "2: " ASM_CLAC "\n" \ ".section .fixup,\"ax\"\n" \ @@ -105,6 +106,8 @@ struct extable_ip_fixup { : "D" (dst), "S" (src), "c" (count), "i" (errret), "0" (err) \ : "memory") +int user_memcpy(void *dst, const void *src, unsigned int count); + static inline int __put_user(void *dst, const void *src, unsigned int count) { int err = 0; @@ -127,7 +130,7 @@ static inline int __put_user(void *dst, const void *src, unsigned int count) "", "er", -EFAULT); break; default: - __user_memcpy(dst, src, count, err, -EFAULT); + err = user_memcpy(dst, src, count); } return err; @@ -140,7 +143,7 @@ static inline int copy_to_user(void *dst, const void *src, unsigned int count) if (unlikely(!is_user_rwaddr(dst, count))) { err = -EFAULT; } else if (!__builtin_constant_p(count)) { - __user_memcpy(dst, src, count, err, -EFAULT); + err = user_memcpy(dst, src, count); } else { err = __put_user(dst, src, count); } @@ -170,7 +173,7 @@ static inline int __get_user(void *dst, const void *src, unsigned int count) "", "=r", -EFAULT); break; default: - __user_memcpy(dst, src, count, err, -EFAULT); + err = user_memcpy(dst, src, count); } return err; @@ -184,7 +187,7 @@ static inline int copy_from_user(void *dst, const void *src, if (unlikely(!is_user_raddr((void *) src, count))) { err = -EFAULT; } else if (!__builtin_constant_p(count)) { - __user_memcpy(dst, src, count, err, -EFAULT); + err = user_memcpy(dst, src, count); } else { err = __get_user(dst, src, count); } -- You received this message because you are subscribed to the Google Groups "Akaros" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. For more options, visit https://groups.google.com/d/optout.
