From 47369555b8069b8acab1fb1169a996439cc2f43c Mon Sep 17 00:00:00 2001 From: Tomasz Bursztyka Date: Wed, 11 Nov 2015 13:33:43 +0100 Subject: [PATCH] sys_io: x86: Make sys_in/sys_out fitting properly in other functions Let the compiler decide about the registers to use, depending on which functions those are called from (as they might be already in use or not). Change-Id: I00afa0f82c740c8ea70133d85ab67e9cb117187d Signed-off-by: Tomasz Bursztyka --- include/arch/x86/asm_inline_gcc.h | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/include/arch/x86/asm_inline_gcc.h b/include/arch/x86/asm_inline_gcc.h index 25d6117b1e2..32762732c80 100644 --- a/include/arch/x86/asm_inline_gcc.h +++ b/include/arch/x86/asm_inline_gcc.h @@ -239,7 +239,9 @@ static inline __attribute__((always_inline)) static inline __attribute__((always_inline)) void sys_out8(uint8_t data, io_port_t port) { - __asm__ volatile("outb %%al, %%dx;\n\t" : : "a"(data), "d"(port)); + __asm__ volatile("outb %b0, %w1;\n\t" + : + : "a"(data), "Nd"(port)); } @@ -248,7 +250,9 @@ static inline __attribute__((always_inline)) { uint8_t ret; - __asm__ volatile("inb %%dx, %%al;\n\t" : "=a"(ret) : "d"(port)); + __asm__ volatile("inb %w1, %b0;\n\t" + : "=a"(ret) + : "Nd"(port)); return ret; } @@ -256,7 +260,9 @@ static inline __attribute__((always_inline)) static inline __attribute__((always_inline)) void sys_out16(uint16_t data, io_port_t port) { - __asm__ volatile("outw %%ax, %%dx;\n\t" : : "a"(data), "d"(port)); + __asm__ volatile("outw %w0, %w1;\n\t" + : + : "a"(data), "Nd"(port)); } @@ -265,7 +271,9 @@ static inline __attribute__((always_inline)) { uint16_t ret; - __asm__ volatile("inw %%dx, %%ax;\n\t" : "=a"(ret) : "d"(port)); + __asm__ volatile("inw %w1, %w0;\n\t" + : "=a"(ret) + : "Nd"(port)); return ret; } @@ -273,7 +281,9 @@ static inline __attribute__((always_inline)) static inline __attribute__((always_inline)) void sys_out32(uint32_t data, io_port_t port) { - __asm__ volatile("outl %%eax, %%dx;\n\t" : : "a"(data), "d"(port)); + __asm__ volatile("outl %0, %w1;\n\t" + : + : "a"(data), "Nd"(port)); } @@ -282,7 +292,9 @@ static inline __attribute__((always_inline)) { uint32_t ret; - __asm__ volatile("inl %%dx, %%eax;\n\t" : "=a"(ret) : "d"(port)); + __asm__ volatile("inl %w1, %0;\n\t" + : "=a"(ret) + : "Nd"(port)); return ret; }