Hi;
-rc6 fails with latest gcc 4.2 snapshot as following;
CC [M] drivers/kvm/svm.o
drivers/kvm/svm.c:206: warning: 'inject_db' defined but not used
drivers/kvm/svm.c: In function 'svm_vcpu_run':
drivers/kvm/kvm.h:560: error: 'asm' operand has impossible constraints
make[2]: *** [drivers/kvm/svm.o] Error 1
make[1]: *** [drivers/kvm] Error 2
make: *** [drivers] Error 2
And according to this thread http://lkml.org/lkml/2006/11/11/129, solution is
converting g to rm, patch follows
Signed-off-by: S.Çağlar Onur <[email protected]>
Index: linux-2.6/drivers/kvm/kvm.h
===================================================================
--- linux-2.6.orig/drivers/kvm/kvm.h 2007-01-26 01:38:35.000000000 +0200
+++ linux-2.6/drivers/kvm/kvm.h 2007-01-26 01:37:48.000000000 +0200
@@ -557,7 +557,7 @@
#ifndef load_ldt
static inline void load_ldt(u16 sel)
{
- asm ("lldt %0" : : "g"(sel));
+ asm ("lldt %0" : : "rm"(sel));
}
#endif
--
S.Çağlar Onur <[email protected]>
http://cekirdek.pardus.org.tr/~caglar/
Linux is like living in a teepee. No Windows, no Gates and an Apache in house!
S.Çağlar Onur wrote:
> Hi;
>
> -rc6 fails with latest gcc 4.2 snapshot as following;
>
> CC [M] drivers/kvm/svm.o
> drivers/kvm/svm.c:206: warning: 'inject_db' defined but not used
> drivers/kvm/svm.c: In function 'svm_vcpu_run':
> drivers/kvm/kvm.h:560: error: 'asm' operand has impossible constraints
> make[2]: *** [drivers/kvm/svm.o] Error 1
> make[1]: *** [drivers/kvm] Error 2
> make: *** [drivers] Error 2
>
> And according to this thread http://lkml.org/lkml/2006/11/11/129, solution is
> converting g to rm, patch follows
>
>
The patch looks correct, but I don't understand the gcc error message.
Are we sure this isn't a gcc 4.2 bug?
"g" appears to be equivalent to "rmi", if "i" is impossible, gcc is free
to use "r" or "m", no?
> Signed-off-by: S.Çağlar Onur <[email protected]>
>
> Index: linux-2.6/drivers/kvm/kvm.h
> ===================================================================
> --- linux-2.6.orig/drivers/kvm/kvm.h 2007-01-26 01:38:35.000000000 +0200
> +++ linux-2.6/drivers/kvm/kvm.h 2007-01-26 01:37:48.000000000 +0200
> @@ -557,7 +557,7 @@
> #ifndef load_ldt
> static inline void load_ldt(u16 sel)
> {
> - asm ("lldt %0" : : "g"(sel));
> + asm ("lldt %0" : : "rm"(sel));
> }
> #endif
>
>
>
--
Do not meddle in the internals of kernels, for they are subtle and quick to panic.
On Saturday 27 of January 2007 10:05:53 Avi Kivity wrote:
> "g" appears to be equivalent to "rmi", if "i" is impossible, gcc is free
> to use "r" or "m", no?
`r'
A register operand is allowed provided that it is in a general
register.
`g'
Any register, memory or immediate integer operand is allowed,
except for registers that are not general registers.
so, it looks like g == !r for registers ( not general vs. general regs ).
27 Oca 2007 Cts tarihinde, Avi Kivity şunları yazmıştı:
> The patch looks correct, but I don't understand the gcc error message.
> Are we sure this isn't a gcc 4.2 bug?
>
> "g" appears to be equivalent to "rmi", if "i" is impossible, gcc is free
> to use "r" or "m", no?
Accorgind to GCC devs. its not a bug
(http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29808), on comment #5 the
problem described like;
"g" means "r"+"i" so the register allocator in the -O0 case is selecting "r"
while in the optimize case is selecting "i"
--
S.Çağlar Onur <[email protected]>
http://cekirdek.pardus.org.tr/~caglar/
Linux is like living in a teepee. No Windows, no Gates and an Apache in house!
On Saturday 27 January 2007 16:28, S.Çağlar Onur wrote:
> 27 Oca 2007 Cts tarihinde, Avi Kivity şunları yazmıştı:
> > The patch looks correct, but I don't understand the gcc error message.
> > Are we sure this isn't a gcc 4.2 bug?
> >
> > "g" appears to be equivalent to "rmi", if "i" is impossible, gcc is free
> > to use "r" or "m", no?
>
> Accorgind to GCC devs. its not a bug
> (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29808), on comment #5 the
> problem described like;
>
> "g" means "r"+"i" so the register allocator in the -O0 case is selecting
> "r" while in the optimize case is selecting "i"
Sounds like a bug to me! After all, shouldn't the different sections of code
be selecting the *same* bits ?
DRH
S.Çağlar Onur wrote:
>
> "g" means "r"+"i" so the register allocator in the -O0 case is selecting "r"
> while in the optimize case is selecting "i"
>
"g" means "rmi", not "ri".
-hpa
Paweł Sikora wrote:
> On Saturday 27 of January 2007 10:05:53 Avi Kivity wrote:
>
>
>> "g" appears to be equivalent to "rmi", if "i" is impossible, gcc is free
>> to use "r" or "m", no?
>>
>
> `r'
> A register operand is allowed provided that it is in a general
> register.
> `g'
> Any register, memory or immediate integer operand is allowed,
> except for registers that are not general registers.
>
> so, it looks like g == !r for registers ( not general vs. general regs ).
>
I read it as g == !!r for registers ("except" and "not" constitute a
double negative).
--
error compiling committee.c: too many arguments to function
S.Çağlar Onur wrote:
> 27 Oca 2007 Cts tarihinde, Avi Kivity şunları yazmıştı:
>
>> The patch looks correct, but I don't understand the gcc error message.
>> Are we sure this isn't a gcc 4.2 bug?
>>
>> "g" appears to be equivalent to "rmi", if "i" is impossible, gcc is free
>> to use "r" or "m", no?
>>
>
> Accorgind to GCC devs. its not a bug
> (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29808), on comment #5 the
> problem described like;
>
> "g" means "r"+"i" so the register allocator in the -O0 case is selecting "r"
> while in the optimize case is selecting "i"
>
>
That's a different bug. The gcc PR has an assembler error message, as
expected, whereas the kvm miscompile has a compiler error, which I don't
understand.
Anyhow, your patch is correct (because selecting "i" is indeed
erroneous) so I'll apply it, but I'm worried that there's a gcc bug in
there that we ought to report.
--
error compiling committee.c: too many arguments to function