Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / openbios / arch / ppc / pearpc / pearpc.c
1 /*
2  *   Creation Date: <2004/08/28 18:38:22 greg>
3  *   Time-stamp: <2004/08/28 18:38:22 greg>
4  *
5  *      <pearpc.c>
6  *
7  *   Copyright (C) 2004, Greg Watson
8  *
9  *   derived from mol.c
10  *
11  *   Copyright (C) 2003, 2004 Samuel Rydh (samuel@ibrium.se)
12  *
13  *   This program is free software; you can redistribute it and/or
14  *   modify it under the terms of the GNU General Public License
15  *   version 2
16  *
17  */
18
19 #include "config.h"
20 #include "kernel/kernel.h"
21 #include "arch/common/nvram.h"
22 #include "libc/vsprintf.h"
23 #include "libc/string.h"
24 #include "pearpc/pearpc.h"
25 #include <stdarg.h>
26
27 #define UART_BASE 0x3f8
28
29 // FIXME
30 unsigned long virt_offset = 0;
31
32
33 void
34 exit( int status )
35 {
36         for (;;);
37 }
38
39 void
40 fatal_error( const char *err )
41 {
42         printk("Fatal error: %s\n", err );
43         exit(0);
44 }
45
46 void
47 panic( const char *err )
48 {
49         printk("Panic: %s\n", err );
50         exit(0);
51
52         /* won't come here... this keeps the gcc happy */
53         for( ;; )
54                 ;
55 }
56
57
58 /************************************************************************/
59 /*      print using OSI interface                                       */
60 /************************************************************************/
61
62 static int do_indent;
63
64 int
65 printk( const char *fmt, ... )
66 {
67         char *p, buf[1024];
68         va_list args;
69         int i;
70
71         va_start(args, fmt);
72         i = vsnprintf(buf, sizeof(buf), fmt, args);
73         va_end(args);
74
75         for( p=buf; *p; p++ ) {
76                 if( *p == '\n' )
77                         do_indent = 0;
78                 if( do_indent++ == 1 ) {
79                         putchar( '>' );
80                         putchar( '>' );
81                         putchar( ' ' );
82                 }
83                 putchar( *p );
84         }
85         return i;
86 }
87
88
89 /************************************************************************/
90 /*      TTY iface                                                       */
91 /************************************************************************/
92
93 static int ttychar = -1;
94
95 static int
96 tty_avail( void )
97 {
98         return 1;
99 }
100
101 static int
102 tty_putchar( int c )
103 {
104         if( tty_avail() ) {
105                 while (!(inb(UART_BASE + 0x05) & 0x20))
106                         ;
107                 outb(c, UART_BASE);
108                 while (!(inb(UART_BASE + 0x05) & 0x40))
109                         ;
110         }
111         return c;
112 }
113
114 int
115 availchar( void )
116 {
117         if( !tty_avail() )
118                 return 0;
119
120         if( ttychar < 0 )
121                 ttychar = inb(UART_BASE);
122         return (ttychar >= 0);
123 }
124
125 int
126 getchar( void )
127 {
128         int ch;
129
130         if( !tty_avail() )
131                 return 0;
132
133         if( ttychar < 0 )
134                 return inb(UART_BASE);
135         ch = ttychar;
136         ttychar = -1;
137         return ch;
138 }
139
140 int
141 putchar( int c )
142 {
143         if (c == '\n')
144                 tty_putchar('\r');
145         return tty_putchar(c);
146 }
147
148
149 /************************************************************************/
150 /*      briQ specific stuff                                             */
151 /************************************************************************/
152
153 #define IO_NVRAM_PA_START 0x80860000
154 #define IO_NVRAM_PA_END 0x80880000
155
156 static char *nvram=(char *)IO_NVRAM_PA_START;
157
158 void
159 dump_nvram(void)
160 {
161   static char hexdigit[] = "0123456789abcdef";
162   int i;
163   for (i = 0; i < 16*4; i++)
164     {
165       printk ("%c", hexdigit[nvram[i<<4] >> 4]);
166       printk ("%c", hexdigit[nvram[i<<4] % 16]);
167       if (!((i + 1) % 16))
168         {
169           printk ("\n");
170         }
171       else
172         {
173           printk (" ");
174         }
175     }
176 }
177
178
179 int
180 arch_nvram_size( void )
181 {
182         return (IO_NVRAM_PA_END-IO_NVRAM_PA_START)>>4;
183 }
184
185 void
186 arch_nvram_put( char *buf )
187 {
188         int i;
189         for (i=0; i<(IO_NVRAM_PA_END-IO_NVRAM_PA_START)>>4; i++)
190                 nvram[i<<4]=buf[i];
191         // memcpy(nvram, buf, IO_NVRAM_PA_END-IO_NVRAM_PA_START);
192         printk("new nvram:\n");
193         dump_nvram();
194 }
195
196 void
197 arch_nvram_get( char *buf )
198 {
199         int i;
200         for (i=0; i<(IO_NVRAM_PA_END-IO_NVRAM_PA_START)>>4; i++)
201                 buf[i]=nvram[i<<4];
202
203         //memcpy(buf, nvram, IO_NVRAM_PA_END-IO_NVRAM_PA_START);
204         printk("current nvram:\n");
205         dump_nvram();
206 }