mirror of
https://github.com/xcat2/xNBA.git
synced 2024-11-22 17:41:55 +00:00
[nap] Formalise the CPU sleeping API
This commit is contained in:
parent
658c6dba59
commit
c0835339d0
@ -1,12 +0,0 @@
|
||||
|
||||
#include <realmode.h>
|
||||
#include <bios.h>
|
||||
|
||||
/**************************************************************************
|
||||
* Save power by halting the CPU until the next interrupt
|
||||
**************************************************************************/
|
||||
void cpu_nap ( void ) {
|
||||
__asm__ __volatile__ ( REAL_CODE ( "sti\n\t"
|
||||
"hlt\n\t"
|
||||
"cli\n\t" ) : : );
|
||||
}
|
@ -5,6 +5,4 @@
|
||||
#define BDA_FBMS 0x0013
|
||||
#define BDA_NUM_DRIVES 0x0075
|
||||
|
||||
extern void cpu_nap ( void );
|
||||
|
||||
#endif /* BIOS_H */
|
||||
|
12
src/arch/i386/include/bits/nap.h
Normal file
12
src/arch/i386/include/bits/nap.h
Normal file
@ -0,0 +1,12 @@
|
||||
#ifndef _BITS_NAP_H
|
||||
#define _BITS_NAP_H
|
||||
|
||||
/** @file
|
||||
*
|
||||
* i386-specific CPU sleeping API implementations
|
||||
*
|
||||
*/
|
||||
|
||||
#include <gpxe/bios_nap.h>
|
||||
|
||||
#endif /* _BITS_MAP_H */
|
16
src/arch/i386/include/gpxe/bios_nap.h
Normal file
16
src/arch/i386/include/gpxe/bios_nap.h
Normal file
@ -0,0 +1,16 @@
|
||||
#ifndef _GPXE_BIOS_NAP_H
|
||||
#define _GPXE_BIOS_NAP_H
|
||||
|
||||
/** @file
|
||||
*
|
||||
* BIOS CPU sleeping
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef NAP_PCBIOS
|
||||
#define NAP_PREFIX_pcbios
|
||||
#else
|
||||
#define NAP_PREFIX_pcbios __pcbios_
|
||||
#endif
|
||||
|
||||
#endif /* _GPXE_BIOS_NAP_H */
|
14
src/arch/i386/interface/pcbios/bios_nap.c
Normal file
14
src/arch/i386/interface/pcbios/bios_nap.c
Normal file
@ -0,0 +1,14 @@
|
||||
#include <gpxe/nap.h>
|
||||
#include <realmode.h>
|
||||
|
||||
/**
|
||||
* Save power by halting the CPU until the next interrupt
|
||||
*
|
||||
*/
|
||||
static void bios_cpu_nap ( void ) {
|
||||
__asm__ __volatile__ ( REAL_CODE ( "sti\n\t"
|
||||
"hlt\n\t"
|
||||
"cli\n\t" ) : : );
|
||||
}
|
||||
|
||||
PROVIDE_NAP ( pcbios, cpu_nap, bios_cpu_nap );
|
@ -11,5 +11,6 @@
|
||||
#define PCIAPI_PCBIOS
|
||||
#define TIMER_PCBIOS
|
||||
#define CONSOLE_PCBIOS
|
||||
#define NAP_PCBIOS
|
||||
|
||||
#endif /* CONFIG_DEFAULTS_PCBIOS_H */
|
||||
|
15
src/config/nap.h
Normal file
15
src/config/nap.h
Normal file
@ -0,0 +1,15 @@
|
||||
#ifndef CONFIG_NAP_H
|
||||
#define CONFIG_NAP_H
|
||||
|
||||
/** @file
|
||||
*
|
||||
* CPU sleeping
|
||||
*
|
||||
*/
|
||||
|
||||
#include <config/defaults.h>
|
||||
|
||||
//#undef NAP_PCBIOS
|
||||
//#define NAP_NULL
|
||||
|
||||
#endif /* CONFIG_NAP_H */
|
@ -1,11 +1,10 @@
|
||||
#include "stddef.h"
|
||||
#include "console.h"
|
||||
#include <gpxe/process.h>
|
||||
#include <gpxe/nap.h>
|
||||
|
||||
/** @file */
|
||||
|
||||
#include "bios.h"
|
||||
|
||||
static struct console_driver console_drivers[0]
|
||||
__table_start ( struct console_driver, console );
|
||||
static struct console_driver console_drivers_end[0]
|
||||
@ -82,9 +81,6 @@ static struct console_driver * has_input ( void ) {
|
||||
*
|
||||
* The character read will not be echoed back to any console.
|
||||
*
|
||||
* @bug We need a cleaner way to pick up cpu_nap(). It makes a
|
||||
* real-mode call, and so we don't want to use it with LinuxBIOS.
|
||||
*
|
||||
*/
|
||||
int getchar ( void ) {
|
||||
struct console_driver *console;
|
||||
|
@ -19,7 +19,6 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <byteswap.h>
|
||||
#include <bios.h>
|
||||
#include <gpxe/iobuf.h>
|
||||
#include <gpxe/in.h>
|
||||
#include <gpxe/if_arp.h>
|
||||
@ -27,6 +26,7 @@
|
||||
#include <gpxe/ip.h>
|
||||
#include <gpxe/udp.h>
|
||||
#include <gpxe/netdevice.h>
|
||||
#include <gpxe/nap.h>
|
||||
#include <gpxe/gdbstub.h>
|
||||
#include <gpxe/gdbudp.h>
|
||||
|
||||
|
3
src/core/null_nap.c
Normal file
3
src/core/null_nap.c
Normal file
@ -0,0 +1,3 @@
|
||||
#include <gpxe/nap.h>
|
||||
|
||||
PROVIDE_NAP_INLINE ( null, cpu_nap );
|
54
src/include/gpxe/nap.h
Normal file
54
src/include/gpxe/nap.h
Normal file
@ -0,0 +1,54 @@
|
||||
#ifndef _GPXE_NAP_H
|
||||
#define _GPXE_NAP_H
|
||||
|
||||
/** @file
|
||||
*
|
||||
* CPU sleeping
|
||||
*
|
||||
*/
|
||||
|
||||
#include <gpxe/api.h>
|
||||
#include <config/nap.h>
|
||||
|
||||
/**
|
||||
* Calculate static inline CPU sleeping API function name
|
||||
*
|
||||
* @v _prefix Subsystem prefix
|
||||
* @v _api_func API function
|
||||
* @ret _subsys_func Subsystem API function
|
||||
*/
|
||||
#define NAP_INLINE( _subsys, _api_func ) \
|
||||
SINGLE_API_INLINE ( NAP_PREFIX_ ## _subsys, _api_func )
|
||||
|
||||
/**
|
||||
* Provide an CPU sleeping API implementation
|
||||
*
|
||||
* @v _prefix Subsystem prefix
|
||||
* @v _api_func API function
|
||||
* @v _func Implementing function
|
||||
*/
|
||||
#define PROVIDE_NAP( _subsys, _api_func, _func ) \
|
||||
PROVIDE_SINGLE_API ( NAP_PREFIX_ ## _subsys, _api_func, _func )
|
||||
|
||||
/**
|
||||
* Provide a static inline CPU sleeping API implementation
|
||||
*
|
||||
* @v _prefix Subsystem prefix
|
||||
* @v _api_func API function
|
||||
*/
|
||||
#define PROVIDE_NAP_INLINE( _subsys, _api_func ) \
|
||||
PROVIDE_SINGLE_API_INLINE ( NAP_PREFIX_ ## _subsys, _api_func )
|
||||
|
||||
/* Include all architecture-independent I/O API headers */
|
||||
#include <gpxe/null_nap.h>
|
||||
|
||||
/* Include all architecture-dependent I/O API headers */
|
||||
#include <bits/nap.h>
|
||||
|
||||
/**
|
||||
* Sleep until next CPU interrupt
|
||||
*
|
||||
*/
|
||||
void cpu_nap ( void );
|
||||
|
||||
#endif /* _GPXE_NAP_H */
|
21
src/include/gpxe/null_nap.h
Normal file
21
src/include/gpxe/null_nap.h
Normal file
@ -0,0 +1,21 @@
|
||||
#ifndef _GPXE_NULL_NAP_H
|
||||
#define _GPXE_NULL_NAP_H
|
||||
|
||||
/** @file
|
||||
*
|
||||
* Null CPU sleeping
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef NAP_NULL
|
||||
#define NAP_PREFIX_null
|
||||
#else
|
||||
#define NAP_PREFIX_null __null_
|
||||
#endif
|
||||
|
||||
static inline __always_inline void
|
||||
NAP_INLINE ( null, cpu_nap ) ( void ) {
|
||||
/* Do nothing */
|
||||
}
|
||||
|
||||
#endif /* _GPXE_NULL_NAP_H */
|
Loading…
Reference in New Issue
Block a user