Skip to content

Commit

Permalink
[console] Add concept of generic console configuration
Browse files Browse the repository at this point in the history
Signed-off-by: Michael Brown <mcb30@ipxe.org>
  • Loading branch information
mcb30 committed Nov 28, 2013
1 parent b225174 commit c501c98
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 0 deletions.
4 changes: 4 additions & 0 deletions src/arch/i386/image/bootsector.c
Expand Up @@ -30,6 +30,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
#include <realmode.h>
#include <biosint.h>
#include <bootsector.h>
#include <ipxe/console.h>

/** Vector for storing original INT 18 handler
*
Expand Down Expand Up @@ -60,6 +61,9 @@ int call_bootsector ( unsigned int segment, unsigned int offset,
unsigned int drive ) {
int discard_b, discard_D, discard_d;

/* Reset console, since boot sector will probably use it */
console_reset();

DBG ( "Booting from boot sector at %04x:%04x\n", segment, offset );

/* Hook INTs 18 and 19 to capture failure paths */
Expand Down
4 changes: 4 additions & 0 deletions src/arch/i386/image/pxe_image.c
Expand Up @@ -33,6 +33,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
#include <ipxe/segment.h>
#include <ipxe/netdevice.h>
#include <ipxe/features.h>
#include <ipxe/console.h>

FEATURE ( FEATURE_IMAGE, "PXE", DHCP_EB_FEATURE_PXE, 1 );

Expand Down Expand Up @@ -74,6 +75,9 @@ static int pxe_exec ( struct image *image ) {
/* Set PXE command line */
pxe_cmdline = image->cmdline;

/* Reset console since PXE NBP will probably use it */
console_reset();

/* Start PXE NBP */
rc = pxe_start_nbp();

Expand Down
32 changes: 32 additions & 0 deletions src/core/console.c
Expand Up @@ -121,3 +121,35 @@ int getchar ( void ) {
int iskey ( void ) {
return has_input() ? 1 : 0;
}

/**
* Configure console
*
* @v config Console configuration
* @ret rc Return status code
*
* The configuration is passed to all configurable consoles, including
* those which are currently disabled. Consoles may choose to enable
* or disable themselves depending upon the configuration.
*
* If configuration fails, then all consoles will be reset.
*/
int console_configure ( struct console_configuration *config ) {
struct console_driver *console;
int rc;

/* Try to configure each console */
for_each_table_entry ( console, CONSOLES ) {
if ( ( console->configure ) &&
( ( rc = console->configure ( config ) ) != 0 ) )
goto err;
}

return 0;

err:
/* Reset all consoles, avoiding a potential infinite loop */
if ( config )
console_reset();
return rc;
}
4 changes: 4 additions & 0 deletions src/core/init.c
Expand Up @@ -20,6 +20,7 @@
FILE_LICENCE ( GPL2_OR_LATER );

#include <ipxe/device.h>
#include <ipxe/console.h>
#include <ipxe/init.h>

/** @file
Expand Down Expand Up @@ -95,5 +96,8 @@ void shutdown ( int flags ) {
startup_fn->shutdown ( flags );
}

/* Reset console */
console_reset();

started = 0;
}
17 changes: 17 additions & 0 deletions src/include/ipxe/console.h
Expand Up @@ -77,6 +77,13 @@ struct console_driver {
* will not block.
*/
int ( * iskey ) ( void );
/**
* Configure console
*
* @v config Console configuration, or NULL to reset
* @ret rc Return status code
*/
int ( * configure ) ( struct console_configuration *config );
/**
* Console usage bitmask
*
Expand Down Expand Up @@ -170,5 +177,15 @@ console_set_usage ( int usage ) {

extern int iskey ( void );
extern int getkey ( unsigned long timeout );
extern int console_configure ( struct console_configuration *config );

/**
* Reset console
*
*/
static inline __attribute__ (( always_inline )) void console_reset ( void ) {

console_configure ( NULL );
}

#endif /* _IPXE_CONSOLE_H */

0 comments on commit c501c98

Please sign in to comment.