Skip to contentSkip to conversation

KVM: 'asm' operand has impossible constraints

PATCH In review S.Çağlar Onur 5 participants 8 messages Jan 25, 2007 – Jan 28, 2007 KVM

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 KVM: 'asm' operand has impossible constraints

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

drivers/kvm/kvm.h +1 -1
Index: linux-2.6/drivers/kvm/kvm.h
===================================================================
@@ -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
 
Signature · 4 lines
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!
#1 lore raw
Quoted 12 lines · S.Çağlar Onur

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

Quoted 4 lines

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?

Quoted 17 lines

Index: linux-2.6/drivers/kvm/kvm.h
===================================================================

drivers/kvm/kvm.h +1 -1
@@ -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
 
Signature · 12 lines
Do not meddle in the internals of kernels, for they are subtle and quick to panic.


-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
kvm-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/kvm-devel
#2 lore raw
Quoted 2 lines · 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 ).

#3 lore raw
Quoted 7 lines · Paweł Sikora
Quoted 3 lines · 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?

Quoted 9 lines

`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).

Signature · 12 lines
error compiling committee.c: too many arguments to function


-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
kvm-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/kvm-devel
#4 lore raw
In reply to Avi Kivity

27 Oca 2007 Cts tarihinde, Avi Kivity şunları yazmıştı:

Quoted 5 lines

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"

Signature · 4 lines
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!
#5 lore raw
Quoted 7 lines · S.Çağlar Onur

27 Oca 2007 Cts tarihinde, Avi Kivity şunları yazmıştı:

Quoted 5 lines

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?

Quoted 6 lines

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

#6 lore raw
In reply to S.Çağlar Onur
Quoted 3 lines · S.Çağlar Onur

"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

#7 lore raw
In reply to S.Çağlar Onur
Quoted 9 lines · S.Çağlar Onur

27 Oca 2007 Cts tarihinde, Avi Kivity şunları yazmıştı:

Quoted 6 lines

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?

Quoted 8 lines

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.

Signature · 12 lines
error compiling committee.c: too many arguments to function


-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
kvm-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/kvm-devel