Retro68/gcc/libgloss/mips/cfe.c
2012-03-27 01:51:53 +02:00

108 lines
3.0 KiB
C

/* cfe.c -- I/O code for the MIPS boards running CFE. */
/*
* Copyright 2001, 2002, 2003
* Broadcom Corporation. All rights reserved.
*
* This software is furnished under license and may be used and copied only
* in accordance with the following terms and conditions. Subject to these
* conditions, you may download, copy, install, use, modify and distribute
* modified or unmodified copies of this software in source and/or binary
* form. No title or ownership is transferred hereby.
*
* 1) Any source code used, modified or distributed must reproduce and
* retain this copyright notice and list of conditions as they appear in
* the source file.
*
* 2) No right is granted to use any trade name, trademark, or logo of
* Broadcom Corporation. The "Broadcom Corporation" name may not be
* used to endorse or promote products derived from this software
* without the prior written permission of Broadcom Corporation.
*
* 3) THIS SOFTWARE IS PROVIDED "AS-IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING BUT NOT LIMITED TO, ANY IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
* NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL BROADCOM BE LIABLE
* FOR ANY DAMAGES WHATSOEVER, AND IN PARTICULAR, BROADCOM SHALL NOT BE
* LIABLE FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
*/
#include "cfe_api.h"
void *__libcfe_init (long handle, long a1, long cfe_entrypoint, long a3);
void __libcfe_exit (long status);
char inbyte (void);
int outbyte (char c);
/* Echo input characters? */
int __libcfe_echo_input = 0;
/* CFE handle used to access console device. */
static int cfe_conshandle;
/* Initialize firmware callbacks. Called from crt0_cfe. Returns desired
stack pointer. */
void *
__libcfe_init (long handle, long a1, long entrypoint, long a3)
{
cfe_init (handle, entrypoint);
cfe_conshandle = cfe_getstdhandle (CFE_STDHANDLE_CONSOLE);
__libcfe_meminit ();
return __libcfe_stack_top ();
}
/* Exit back to monitor, with the given status code. */
void
__libcfe_exit (long status)
{
outbyte ('\r');
outbyte ('\n');
cfe_exit (CFE_FLG_WARMSTART, status);
}
char
inbyte (void)
{
unsigned char c;
int rv;
while (cfe_read (cfe_conshandle, &c, 1) != 1)
;
if (c == '\r')
c = '\n';
if (__libcfe_echo_input)
outbyte (c);
return c;
}
int
outbyte (char c)
{
int res;
do
{
res = cfe_write (cfe_conshandle, &c, 1);
}
while (res == 0);
if (c == '\n')
outbyte ('\r');
return 0;
}
/* This is the MIPS cache flush function call. No defines are provided
by libgloss for 'cache', and CFE doesn't let you flush ranges, so
we just flush all I & D for every call. */
int
_flush_cache (char *addr, int nbytes, int cache)
{
cfe_flushcache (0);
return 0;
}