2008-10-17 13:16:35

by Jike Song

[permalink] [raw]
Subject: [PATCH] x86: add missed clobber for 32-bit memmove


2008-10-17 13:17:00

by Jike Song

[permalink] [raw]
Subject: [PATCH] x86: add missed clobber for 32-bit memmove

memmove() is implemented by inline assembly. It calls std at first
and cld at last, but EFLAGS still should be clobbered.

Signed-off-by: Jike Song <[email protected]>
---
arch/x86/lib/memcpy_32.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/arch/x86/lib/memcpy_32.c b/arch/x86/lib/memcpy_32.c
index 5415a9d..99a8240 100644
--- a/arch/x86/lib/memcpy_32.c
+++ b/arch/x86/lib/memcpy_32.c
@@ -36,7 +36,7 @@ void *memmove(void *dest, const void *src, size_t n)
:"0" (n),
"1" (n-1+src),
"2" (n-1+dest)
- :"memory");
+ :"cc", "memory");
}
return dest;
}
--
1.6.0.1

2008-10-17 15:56:35

by Jeremy Fitzhardinge

[permalink] [raw]
Subject: Re: [PATCH] x86: add missed clobber for 32-bit memmove

Jike Song wrote:
> memmove() is implemented by inline assembly. It calls std at first
> and cld at last, but EFLAGS still should be clobbered.
>

I think x86 gcc assumes "cc" is always clobbered by asms. Otherwise
there'll need to be a lot more "cc" clobbers than this...

J

> Signed-off-by: Jike Song <[email protected]>
> ---
> arch/x86/lib/memcpy_32.c | 2 +-
> 1 files changed, 1 insertions(+), 1 deletions(-)
>
> diff --git a/arch/x86/lib/memcpy_32.c b/arch/x86/lib/memcpy_32.c
> index 5415a9d..99a8240 100644
> --- a/arch/x86/lib/memcpy_32.c
> +++ b/arch/x86/lib/memcpy_32.c
> @@ -36,7 +36,7 @@ void *memmove(void *dest, const void *src, size_t n)
> :"0" (n),
> "1" (n-1+src),
> "2" (n-1+dest)
> - :"memory");
> + :"cc", "memory");
> }
> return dest;
> }
>

2008-10-17 16:35:59

by H. Peter Anvin

[permalink] [raw]
Subject: Re: [PATCH] x86: add missed clobber for 32-bit memmove

Jike Song wrote:
> memmove() is implemented by inline assembly. It calls std at first
> and cld at last, but EFLAGS still should be clobbered.

gcc always treats EFLAGS as clobbered on x86. The "cc" clobber is
needed on some platforms, but is a noop on x86.

-hpa

2008-10-20 06:44:17

by Jike Song

[permalink] [raw]
Subject: Re: [PATCH] x86: add missed clobber for 32-bit memmove

On Sat, Oct 18, 2008 at 12:35 AM, H. Peter Anvin <[email protected]> wrote:
> Jike Song wrote:
>>
>> memmove() is implemented by inline assembly. It calls std at first
>> and cld at last, but EFLAGS still should be clobbered.
>
> gcc always treats EFLAGS as clobbered on x86. The "cc" clobber is needed on
> some platforms, but is a noop on x86.

No wonder there are inline asms that clobbered eflags/rflags but
without declaring them as clobbered. Thanks for your information.

It turns out that I need to read through the gcc x86 back-end as long
as I want to be a Linux/x86 developer, right? That sounds
discouraging:)

--
Thanks,
Jike