mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	Port I/O instructions trigger #VE in the TDX environment. In response to the exception, kernel emulates these instructions using hypercalls. But during early boot, on the decompression stage, it is cumbersome to deal with #VE. It is cleaner to go to hypercalls directly, bypassing #VE handling. Add a way to hook up alternative port I/O helpers in the boot stub with a new pio_ops structure. For now, set the ops structure to just call the normal I/O operation functions. out*()/in*() macros redefined to use pio_ops callbacks. It eliminates need in changing call sites. io_delay() changed to use port I/O helper instead of inline assembly. Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com> Reviewed-by: Dave Hansen <dave.hansen@linux.intel.com> Link: https://lkml.kernel.org/r/20220405232939.73860-16-kirill.shutemov@linux.intel.com
		
			
				
	
	
		
			41 lines
		
	
	
	
		
			774 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			41 lines
		
	
	
	
		
			774 B
		
	
	
	
		
			C
		
	
	
	
	
	
/* SPDX-License-Identifier: GPL-2.0 */
 | 
						|
#ifndef BOOT_IO_H
 | 
						|
#define BOOT_IO_H
 | 
						|
 | 
						|
#include <asm/shared/io.h>
 | 
						|
 | 
						|
#undef inb
 | 
						|
#undef inw
 | 
						|
#undef inl
 | 
						|
#undef outb
 | 
						|
#undef outw
 | 
						|
#undef outl
 | 
						|
 | 
						|
struct port_io_ops {
 | 
						|
	u8	(*f_inb)(u16 port);
 | 
						|
	void	(*f_outb)(u8 v, u16 port);
 | 
						|
	void	(*f_outw)(u16 v, u16 port);
 | 
						|
};
 | 
						|
 | 
						|
extern struct port_io_ops pio_ops;
 | 
						|
 | 
						|
/*
 | 
						|
 * Use the normal I/O instructions by default.
 | 
						|
 * TDX guests override these to use hypercalls.
 | 
						|
 */
 | 
						|
static inline void init_default_io_ops(void)
 | 
						|
{
 | 
						|
	pio_ops.f_inb  = __inb;
 | 
						|
	pio_ops.f_outb = __outb;
 | 
						|
	pio_ops.f_outw = __outw;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * Redirect port I/O operations via pio_ops callbacks.
 | 
						|
 * TDX guests override these callbacks with TDX-specific helpers.
 | 
						|
 */
 | 
						|
#define inb  pio_ops.f_inb
 | 
						|
#define outb pio_ops.f_outb
 | 
						|
#define outw pio_ops.f_outw
 | 
						|
 | 
						|
#endif
 |