mirror of
https://gitlab.com/qemu-project/openbios.git
synced 2024-02-13 08:34:06 +08:00
initial import of openbios--main--1.0--patch-26
git-svn-id: svn://coreboot.org/openbios/openbios-devel@1 f158a5a8-5612-0410-a976-696ce0be7e32
This commit is contained in:
194
arch/ppc/briq/briq.c
Normal file
194
arch/ppc/briq/briq.c
Normal file
@@ -0,0 +1,194 @@
|
||||
/*
|
||||
* Creation Date: <2004/08/28 18:38:22 greg>
|
||||
* Time-stamp: <2004/08/28 18:38:22 greg>
|
||||
*
|
||||
* <briq.c>
|
||||
*
|
||||
* Copyright (C) 2004, Greg Watson
|
||||
*
|
||||
* derived from 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 "openbios/config.h"
|
||||
#include "openbios/kernel.h"
|
||||
#include "openbios/nvram.h"
|
||||
#include "libc/vsprintf.h"
|
||||
#include "libc/string.h"
|
||||
#include "briq/briq.h"
|
||||
#include <stdarg.h>
|
||||
|
||||
#define UART_BASE 0x3f8
|
||||
|
||||
unsigned long virt_offset = 0;
|
||||
|
||||
void
|
||||
exit( int status )
|
||||
{
|
||||
for (;;);
|
||||
}
|
||||
|
||||
void
|
||||
fatal_error( const char *err )
|
||||
{
|
||||
printk("Fatal error: %s\n", err );
|
||||
exit(0);
|
||||
}
|
||||
|
||||
void
|
||||
panic( const char *err )
|
||||
{
|
||||
printk("Panic: %s\n", err );
|
||||
exit(0);
|
||||
|
||||
/* 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]; /* XXX: no buffer overflow protection... */
|
||||
va_list args;
|
||||
int i;
|
||||
|
||||
va_start(args, fmt);
|
||||
i=vsprintf(buf,fmt,args);
|
||||
va_end(args);
|
||||
|
||||
for( p=buf; *p; p++ ) {
|
||||
if( *p == '\n' )
|
||||
do_indent = 0;
|
||||
if( do_indent++ == 1 ) {
|
||||
putchar( '>' );
|
||||
putchar( '>' );
|
||||
putchar( ' ' );
|
||||
}
|
||||
putchar( *p );
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************/
|
||||
/* TTY iface */
|
||||
/************************************************************************/
|
||||
|
||||
static int ttychar = -1;
|
||||
|
||||
static int
|
||||
tty_avail( void )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
tty_putchar( int c )
|
||||
{
|
||||
if( tty_avail() ) {
|
||||
while (!(inb(UART_BASE + 0x05) & 0x20))
|
||||
;
|
||||
outb(c, UART_BASE);
|
||||
while (!(inb(UART_BASE + 0x05) & 0x40))
|
||||
;
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
int
|
||||
availchar( void )
|
||||
{
|
||||
if( !tty_avail() )
|
||||
return 0;
|
||||
|
||||
if( ttychar < 0 )
|
||||
ttychar = inb(UART_BASE);
|
||||
return (ttychar >= 0);
|
||||
}
|
||||
|
||||
int
|
||||
getchar( void )
|
||||
{
|
||||
int ch;
|
||||
|
||||
if( !tty_avail() )
|
||||
return 0;
|
||||
|
||||
if( ttychar < 0 )
|
||||
return inb(UART_BASE);
|
||||
ch = ttychar;
|
||||
ttychar = -1;
|
||||
return ch;
|
||||
}
|
||||
|
||||
int
|
||||
putchar( int c )
|
||||
{
|
||||
if (c == '\n')
|
||||
tty_putchar('\r');
|
||||
return tty_putchar(c);
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************/
|
||||
/* briQ specific stuff */
|
||||
/************************************************************************/
|
||||
|
||||
static char nvram[2048];
|
||||
|
||||
void
|
||||
dump_nvram(void)
|
||||
{
|
||||
static char hexdigit[] = "0123456789abcdef";
|
||||
int i;
|
||||
for (i = 0; i < 16*4; i++)
|
||||
{
|
||||
printk ("%c", hexdigit[nvram[i] >> 4]);
|
||||
printk ("%c", hexdigit[nvram[i] % 16]);
|
||||
if (!((i + 1) % 16))
|
||||
{
|
||||
printk ("\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
printk (" ");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
arch_nvram_size( void )
|
||||
{
|
||||
return sizeof(nvram);
|
||||
}
|
||||
|
||||
void
|
||||
arch_nvram_put( char *buf )
|
||||
{
|
||||
memcpy(nvram, buf, sizeof(nvram));
|
||||
printk("new nvram:\n");
|
||||
dump_nvram();
|
||||
}
|
||||
|
||||
void
|
||||
arch_nvram_get( char *buf )
|
||||
{
|
||||
memcpy(buf, nvram, sizeof(nvram));
|
||||
printk("current nvram:\n");
|
||||
dump_nvram();
|
||||
}
|
||||
Reference in New Issue
Block a user