]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[console] Add concept of generic console configuration
authorMichael Brown <mcb30@ipxe.org>
Wed, 27 Nov 2013 19:42:23 +0000 (19:42 +0000)
committerMichael Brown <mcb30@ipxe.org>
Thu, 28 Nov 2013 05:55:43 +0000 (05:55 +0000)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/arch/i386/image/bootsector.c
src/arch/i386/image/pxe_image.c
src/core/console.c
src/core/init.c
src/include/ipxe/console.h

index cb164fda9e54a9086bbc5ce11ebba7727be5c27b..9a089e6bbd743e9bf4116a913eef55011013d009 100644 (file)
@@ -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
  *
@@ -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 */
index 4a7d874be2deaca9bffaa975d3a8d1cfe3ee59ae..dc28f608291d3014f1982b245c4908bd9d24ed4b 100644 (file)
@@ -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 );
 
@@ -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();
 
index 73baf7f66b86fb588597381d352c66e69e04e57a..5f3c28d849af40cf97dc6d9d20110499ba5cd4b2 100644 (file)
@@ -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;
+}
index 5627441946b703ac130e5df01741007912d6d175..7ea0730fa38f65ca04ddc14133ffd49a4cca65cc 100644 (file)
@@ -20,6 +20,7 @@
 FILE_LICENCE ( GPL2_OR_LATER );
 
 #include <ipxe/device.h>
+#include <ipxe/console.h>
 #include <ipxe/init.h>
 
 /** @file
@@ -95,5 +96,8 @@ void shutdown ( int flags ) {
                        startup_fn->shutdown ( flags );
        }
 
+       /* Reset console */
+       console_reset();
+
        started = 0;
 }
index 2fcc4150e87b764798b53905fbf622b67e971c56..9c2620bc939bdcc88c4a25af0612687bfe7c9e2a 100644 (file)
@@ -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
         *
@@ -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 */