Il 17/10/2013 08:27, Gleb Natapov ha scritto: > 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; > } This is okay. > 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; > } This should be wrong. GCC should complain that the same operand is used for both input and output but has an "=" constraint. > 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)); > } Same here. But I'm not sure what is the error message for older GCC for s3.c, as I wrote in reply to Michael. > 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)); > } Okay. Paolo > 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