mirror of
https://github.com/ipxe/ipxe
synced 2026-01-02 18:03:36 +03:00
[ioapi] Formalise the I/O API as used in i386-pcbios
This commit is contained in:
82
src/include/gpxe/api.h
Normal file
82
src/include/gpxe/api.h
Normal file
@@ -0,0 +1,82 @@
|
||||
#ifndef _GPXE_API_H
|
||||
#define _GPXE_API_H
|
||||
|
||||
/** @file
|
||||
*
|
||||
* gPXE internal APIs
|
||||
*
|
||||
* There are various formally-defined APIs internal to gPXE, with
|
||||
* several differing implementations specific to particular execution
|
||||
* environments (e.g. PC BIOS, EFI, LinuxBIOS).
|
||||
*
|
||||
*/
|
||||
|
||||
/** @defgroup Single-implementation APIs
|
||||
*
|
||||
* These are APIs for which only a single implementation may be
|
||||
* compiled in at any given time.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* Calculate function implementation name
|
||||
*
|
||||
* @v _prefix Subsystem prefix
|
||||
* @v _api_func API function
|
||||
* @ret _subsys_func Subsystem API function
|
||||
*
|
||||
* The subsystem prefix should be an empty string for the currently
|
||||
* selected subsystem, and should be a subsystem-unique string for all
|
||||
* other subsystems.
|
||||
*/
|
||||
#define SINGLE_API_NAME( _prefix, _api_func ) _prefix ## _api_func
|
||||
|
||||
/**
|
||||
* Calculate static inline function name
|
||||
*
|
||||
* @v _prefix Subsystem prefix
|
||||
* @v _api_func API function
|
||||
* @ret _subsys_func Subsystem API function
|
||||
*/
|
||||
#define SINGLE_API_INLINE( _prefix, _api_func ) \
|
||||
SINGLE_API_NAME ( _prefix, _api_func )
|
||||
|
||||
/**
|
||||
* Provide an API implementation
|
||||
*
|
||||
* @v _prefix Subsystem prefix
|
||||
* @v _api_func API function
|
||||
* @v _func Implementing function
|
||||
*/
|
||||
#define PROVIDE_SINGLE_API( _prefix, _api_func, _func ) \
|
||||
/* Ensure that _api_func exists */ \
|
||||
typeof ( _api_func ) _api_func; \
|
||||
/* Ensure that _func exists */ \
|
||||
typeof ( _func ) _func; \
|
||||
/* Ensure that _func is type-compatible with _api_func */ \
|
||||
typeof ( _api_func ) _func; \
|
||||
/* Ensure that _subsys_func is non-static */ \
|
||||
extern typeof ( _api_func ) SINGLE_API_NAME ( _prefix, _api_func ); \
|
||||
/* Provide symbol alias from _subsys_func to _func */ \
|
||||
typeof ( _api_func ) SINGLE_API_NAME ( _prefix, _api_func ) \
|
||||
__attribute__ (( alias ( #_func ) ));
|
||||
|
||||
/**
|
||||
* Provide a static inline API implementation
|
||||
*
|
||||
* @v _prefix Subsystem prefix
|
||||
* @v _api_func API function
|
||||
*/
|
||||
#define PROVIDE_SINGLE_API_INLINE( _prefix, _api_func ) \
|
||||
/* Ensure that _api_func exists */ \
|
||||
typeof ( _api_func ) _api_func; \
|
||||
/* Ensure that _subsys_func exists and is static */ \
|
||||
static typeof ( SINGLE_API_INLINE ( _prefix, _api_func ) ) \
|
||||
SINGLE_API_INLINE ( _prefix, _api_func ); \
|
||||
/* Ensure that _subsys_func is type-compatible with _api_func */ \
|
||||
typeof ( _api_func ) SINGLE_API_INLINE ( _prefix, _api_func );
|
||||
|
||||
/** @} */
|
||||
|
||||
#endif /* _GPXE_API_H */
|
||||
Reference in New Issue
Block a user