Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / openbios / arch / ppc / mol / mol.c
diff --git a/qemu/roms/openbios/arch/ppc/mol/mol.c b/qemu/roms/openbios/arch/ppc/mol/mol.c
new file mode 100644 (file)
index 0000000..86b3b66
--- /dev/null
@@ -0,0 +1,165 @@
+/*
+ *   Creation Date: <2003/12/19 18:46:21 samuel>
+ *   Time-stamp: <2004/04/12 16:27:12 samuel>
+ *
+ *     <mol.c>
+ *
+ *
+ *
+ *   Copyright (C) 2003, 2004 Samuel Rydh (samuel@ibrium.se)
+ *
+ *   This program is free software; you can redistribute it and/or
+ *   modify it under the terms of the GNU General Public License
+ *   version 2
+ *
+ */
+
+#include "config.h"
+#include "kernel/kernel.h"
+#include "arch/common/nvram.h"
+#include "libc/vsprintf.h"
+#include "libc/string.h"
+#include "mol/mol.h"
+#include "osi_calls.h"
+#include <stdarg.h>
+
+void
+exit( int status )
+{
+       OSI_Exit();
+}
+
+void
+fatal_error( const char *err )
+{
+       printk("Fatal error: %s\n", err );
+       OSI_Exit();
+}
+
+void
+panic( const char *err )
+{
+       printk("Panic: %s\n", err );
+       OSI_Exit();
+
+       /* won't come here... this keeps the gcc happy */
+       for( ;; )
+               ;
+}
+
+
+/************************************************************************/
+/*     print using OSI interface                                       */
+/************************************************************************/
+
+static int do_indent;
+
+int
+printk( const char *fmt, ... )
+{
+        char *p, buf[1024];
+       va_list args;
+       int i;
+
+       va_start(args, fmt);
+        i = vnsprintf(buf, sizeof(buf), fmt, args);
+       va_end(args);
+
+       for( p=buf; *p; p++ ) {
+               if( *p == '\n' )
+                       do_indent = 0;
+               if( do_indent++ == 1 ) {
+                       OSI_PutC( '>' );
+                       OSI_PutC( '>' );
+                       OSI_PutC( ' ' );
+               }
+               OSI_PutC( *p );
+       }
+       return i;
+}
+
+
+/************************************************************************/
+/*     TTY iface                                                       */
+/************************************************************************/
+
+static int ttychar = -1;
+
+static int
+tty_avail( void )
+{
+       return OSI_CallAvailable( OSI_TTY_GETC );
+}
+
+int
+availchar( void )
+{
+       if( !tty_avail() )
+               return 0;
+
+       if( ttychar < 0 )
+               ttychar = OSI_TTYGetc();
+       if( ttychar < 0 )
+               OSI_USleep(1);
+       return (ttychar >= 0);
+}
+
+int
+getchar( void )
+{
+       int ch;
+
+       if( !tty_avail() )
+               return 0;
+
+       if( ttychar < 0 )
+               return OSI_TTYGetc();
+       ch = ttychar;
+       ttychar = -1;
+       return ch;
+}
+
+int
+putchar( int c )
+{
+       printk("%c", c );
+
+       if( tty_avail() )
+               OSI_TTYPutc( c );
+       return c;
+}
+
+
+/************************************************************************/
+/*     MOL specific stuff                                              */
+/************************************************************************/
+
+int
+arch_nvram_size( void )
+{
+       return OSI_NVRamSize();
+}
+
+void
+arch_nvram_put( char *buf )
+{
+       int i, size = arch_nvram_size();
+
+       for( i=0; i<size; i++ )
+               OSI_WriteNVRamByte( i, buf[i] );
+}
+
+void
+arch_nvram_get( char *buf )
+{
+       int i, size = arch_nvram_size();
+
+       /* support for zapping the nvram */
+       if( get_bool_res("zap_nvram") == 1 ) {
+               memset( buf, 0, size );
+               return;
+       }
+
+       for( i=0; i<size; i++ )
+               buf[i] = OSI_ReadNVRamByte( i );
+}