On Wed, Oct 16, 2013 at 10:46:53PM +0300, Michael S. Tsirkin wrote: > Old GCC didn't let you reference variable by > number if it is listed with a specific register > constraint, on the assumption you can just > use the register name explicitly. > > Build fails with errors like this: > a.c:6: error: invalid 'asm': invalid operand code 'd' > Is it worth to support such ancient compiler? Nobody complained till now. BTW with your patch I still cannot compile with 4.2: x86/s3.c: In function 'main': x86/s3.c:145: error: inconsistent operand constraints in an 'asm' > To fix, let's just use %eax %al etc. > Only %d0 does not work and dropping "d" fixes it since compiler can figure out correct register from variable size. The patch bellow fixes compilation for 4.2. diff --git a/lib/x86/pci.c b/lib/x86/pci.c index f95cd88..231668a 100644 --- a/lib/x86/pci.c +++ b/lib/x86/pci.c @@ -3,13 +3,13 @@ static void outl(unsigned short port, unsigned val) { - asm volatile("outl %d0, %w1" : : "a"(val), "Nd"(port)); + asm volatile("outl %0, %w1" : : "a"(val), "Nd"(port)); } static unsigned inl(unsigned short port) { unsigned data; - asm volatile("inl %w1, %d0" : "=a"(data) : "Nd"(port)); + asm volatile("inl %w1, %0" : "=a"(data) : "Nd"(port)); return data; } static uint32_t pci_config_read(pcidevaddr_t dev, uint8_t reg) diff --git a/x86/s3.c b/x86/s3.c index 71d3ff9..d568aa7 100644 --- a/x86/s3.c +++ b/x86/s3.c @@ -143,14 +143,14 @@ static inline int rtc_in(u8 reg) { u8 x = reg; asm volatile("outb %b1, $0x70; inb $0x71, %b0" - : "+a"(x) : "0"(x)); + : "=a"(x) : "0"(x)); return x; } static inline void rtc_out(u8 reg, u8 val) { asm volatile("outb %b1, $0x70; mov %b2, %b1; outb %b1, $0x71" - : "+a"(reg) : "0"(reg), "ri"(val)); + : "=a"(reg) : "0"(reg), "ri"(val)); } extern char resume_start, resume_end; diff --git a/x86/vmexit.c b/x86/vmexit.c index 3b945de..7e9af15 100644 --- a/x86/vmexit.c +++ b/x86/vmexit.c @@ -26,7 +26,7 @@ static void outw(unsigned short port, unsigned val) static void outl(unsigned short port, unsigned val) { - asm volatile("outl %d0, %w1" : : "a"(val), "Nd"(port)); + asm volatile("outl %0, %w1" : : "a"(val), "Nd"(port)); } static unsigned int inb(unsigned short port) -- Gleb. -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html