[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] x86/altcall: use an union as register type for function parameters
On Wed, Feb 21, 2024 at 06:03:31PM +0100, Roger Pau Monne wrote: > The current code for alternative calls uses the caller parameter types as the > types for the register variables that serve as function parameters: > > uint8_t foo; > [...] > alternative_call(myfunc, foo); > > Would expand roughly into: > > register unint8_t a1_ asm("rdi") = foo; > register unsigned long a2_ asm("rsi"); > [...] > asm volatile ("call *%c[addr](%%rip)"...); > > However under certain circumstances clang >= 16.0.0 with -O2 can generate > incorrect code, given the following example: > > unsigned int func(uint8_t t) > { > return t; > } > > static void bar(uint8_t b) > { > int ret_; > register uint8_t di asm("rdi") = b; > register unsigned long si asm("rsi"); > register unsigned long dx asm("rdx"); > register unsigned long cx asm("rcx"); > register unsigned long r8 asm("r8"); > register unsigned long r9 asm("r9"); > register unsigned long r10 asm("r10"); > register unsigned long r11 asm("r11"); > > asm volatile ( "call %c[addr]" > : "+r" (di), "=r" (si), "=r" (dx), > "=r" (cx), "=r" (r8), "=r" (r9), > "=r" (r10), "=r" (r11), "=a" (ret_) > : [addr] "i" (&(func)), "g" (func) > : "memory" ); > } > > void foo(unsigned int a) > { > bar(a); > } > > Clang generates the following code: > > func: # @func > movl %edi, %eax > retq > foo: # @foo > callq func > retq > > Note the truncation of the unsigned int parameter 'a' of foo() to uint8_t when > passed into bar() is lost. > > The above can be worked around by using an union when defining the register > variables, so that `di` becomes: > > register union { > uint8_t e; > unsigned long r; > } di asm("rdi") = { .e = b }; > > Which results in following code generated for `foo()`: > > foo: # @foo > movzbl %dil, %edi > callq func > retq > > So the truncation is not longer lost. > This is missing: Reported-by: Matthew Grooms <mgrooms@xxxxxxxxx> Link: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=277200 Link: https://github.com/llvm/llvm-project/issues/82598 Last one is the bug report against llvm. Thanks, Roger.
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |