Skip to content

Commit

Permalink
x86: tweak io_64.h for paravirt.
Browse files Browse the repository at this point in the history
We need something here because we can't call in and out instructions
directly. However, we have to be careful, because no indirections are
allowed in misc_64.c , and paravirt_ops is a kind of one. So just
call it directly there

Signed-off-by: Glauber de Oliveira Costa <gcosta@redhat.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Acked-by: Jeremy Fitzhardinge <jeremy@xensource.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
  • Loading branch information
Glauber de Oliveira Costa authored and Ingo Molnar committed Jan 30, 2008
1 parent ee238e5 commit ba08242
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 7 deletions.
6 changes: 6 additions & 0 deletions arch/x86/boot/compressed/misc_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,12 @@
* High loaded stuff by Hans Lermen & Werner Almesberger, Feb. 1996
*/

/*
* we have to be careful, because no indirections are allowed here, and
* paravirt_ops is a kind of one. As it will only run in baremetal anyway,
* we just keep it from happening
*/
#undef CONFIG_PARAVIRT
#define _LINUX_STRING_H_ 1
#define __LINUX_BITMAP_H 1

Expand Down
30 changes: 23 additions & 7 deletions include/asm-x86/io_64.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,10 @@ extern void native_io_delay(void);
extern int io_delay_type;
extern void io_delay_init(void);

#if defined(CONFIG_PARAVIRT)
#include <asm/paravirt.h>
#else

static inline void slow_down_io(void)
{
native_io_delay();
Expand All @@ -49,6 +53,7 @@ static inline void slow_down_io(void)
native_io_delay();
#endif
}
#endif

/*
* Talk about misusing macros..
Expand All @@ -57,21 +62,32 @@ static inline void slow_down_io(void)
static inline void out##s(unsigned x value, unsigned short port) {

#define __OUT2(s,s1,s2) \
__asm__ __volatile__ ("out" #s " %" s1 "0,%" s2 "1" : : "a" (value), "Nd" (port))
__asm__ __volatile__ ("out" #s " %" s1 "0,%" s2 "1"

#ifndef REALLY_SLOW_IO
#define REALLY_SLOW_IO
#define UNSET_REALLY_SLOW_IO
#endif

#define __OUT(s,s1,x) \
__OUT1(s,x) __OUT2(s,s1,"w"); } \
__OUT1(s##_p,x) __OUT2(s,s1,"w"); slow_down_io(); }
__OUT1(s,x) __OUT2(s,s1,"w") : : "a" (value), "Nd" (port)); } \
__OUT1(s##_p, x) __OUT2(s, s1, "w") : : "a" (value), "Nd" (port)); \
slow_down_io(); }

#define __IN1(s) \
static inline RETURN_TYPE in##s(unsigned short port) { RETURN_TYPE _v;

#define __IN2(s,s1,s2) \
__asm__ __volatile__ ("in" #s " %" s2 "1,%" s1 "0" : "=a" (_v) : "Nd" (port))
__asm__ __volatile__ ("in" #s " %" s2 "1,%" s1 "0"

#define __IN(s,s1,i...) \
__IN1(s) __IN2(s, s1, "w") : "=a" (_v) : "Nd" (port), ##i); return _v; } \
__IN1(s##_p) __IN2(s, s1, "w") : "=a" (_v) : "Nd" (port), ##i); \
slow_down_io(); return _v; }

#define __IN(s,s1) \
__IN1(s) __IN2(s,s1,"w"); return _v; } \
__IN1(s##_p) __IN2(s,s1,"w"); slow_down_io(); return _v; }
#ifdef UNSET_REALLY_SLOW_IO
#undef REALLY_SLOW_IO
#endif

#define __INS(s) \
static inline void ins##s(unsigned short port, void * addr, unsigned long count) \
Expand Down

0 comments on commit ba08242

Please sign in to comment.