Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[nap] Formalise the CPU sleeping API
  • Loading branch information
Michael Brown committed Oct 12, 2008
1 parent 658c6db commit c083533
Show file tree
Hide file tree
Showing 12 changed files with 138 additions and 20 deletions.
12 changes: 0 additions & 12 deletions src/arch/i386/core/nap.c

This file was deleted.

2 changes: 0 additions & 2 deletions src/arch/i386/include/bios.h
Expand Up @@ -5,6 +5,4 @@
#define BDA_FBMS 0x0013
#define BDA_NUM_DRIVES 0x0075

extern void cpu_nap ( void );

#endif /* BIOS_H */
12 changes: 12 additions & 0 deletions src/arch/i386/include/bits/nap.h
@@ -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 changes: 16 additions & 0 deletions src/arch/i386/include/gpxe/bios_nap.h
@@ -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 changes: 14 additions & 0 deletions src/arch/i386/interface/pcbios/bios_nap.c
@@ -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 );
1 change: 1 addition & 0 deletions src/config/defaults/pcbios.h
Expand Up @@ -11,5 +11,6 @@
#define PCIAPI_PCBIOS
#define TIMER_PCBIOS
#define CONSOLE_PCBIOS
#define NAP_PCBIOS

#endif /* CONFIG_DEFAULTS_PCBIOS_H */
15 changes: 15 additions & 0 deletions src/config/nap.h
@@ -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 */
6 changes: 1 addition & 5 deletions src/core/console.c
@@ -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]
Expand Down Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion src/core/gdbudp.c
Expand Up @@ -19,14 +19,14 @@
#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>
#include <gpxe/if_ether.h>
#include <gpxe/ip.h>
#include <gpxe/udp.h>
#include <gpxe/netdevice.h>
#include <gpxe/nap.h>
#include <gpxe/gdbstub.h>
#include <gpxe/gdbudp.h>

Expand Down
3 changes: 3 additions & 0 deletions src/core/null_nap.c
@@ -0,0 +1,3 @@
#include <gpxe/nap.h>

PROVIDE_NAP_INLINE ( null, cpu_nap );
54 changes: 54 additions & 0 deletions src/include/gpxe/nap.h
@@ -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 changes: 21 additions & 0 deletions src/include/gpxe/null_nap.h
@@ -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 */

0 comments on commit c083533

Please sign in to comment.