This is the mail archive of the
newlib@sources.redhat.com
mailing list for the newlib project.
Re: [MIPS PATCH RFA] Add support for Broadcom CFE firmware tolibgloss.
- From: Manik Raina <manik at cisco dot com>
- To: cgd at broadcom dot com
- Cc: newlib at sources dot redhat dot com
- Date: Fri, 12 Jul 2002 09:33:36 +0530
- Subject: Re: [MIPS PATCH RFA] Add support for Broadcom CFE firmware tolibgloss.
- Organization: Cisco Systems
- References: <yov5k7o2dwp0.fsf@broadcom.com>
couple of nitpicks ....
1. could inbyte () and outbyte () be made static ? They're
not used anywhere else AFAICS.
2. is get_mem_info () used anywhere in your changes ?
cgd@broadcom.com wrote:
>
> As promised last night in msg:
>
> http://sources.redhat.com/ml/newlib/2002/msg00316.html
>
> 8-) These changes were built along with those, and then i subsequently
> used them to run stuff under CFE on some boards.
>
> 2002-07-11 Chris Demetriou <cgd@broadcom.com>
>
> * mips/Makefile.in (GENOBJS2): New variable to name other
> commonly used objects.
> (DVEOBJS, JMR3904OBJS): Reference GENOBJS2.
>
> * mips/Makefile.in: Add support for Broadcom CFE firmware.
> * mips/configure.in: (mipsisa32*-*-*, *): Likewise.
> * mips/configure: Regenerate.
> * mips/cfe.c: New file.
> * mips/cfe.ld: New file.
> * mips/cfe_api.c: New file.
> * mips/cfe_api.h: New file.
> * mips/cfe_api_int.h: New file.
> * mips/cfe_error.h: New file.
> * mips/cfe_prestart.S: New file.
>
> Index: Makefile.in
> ===================================================================
> RCS file: /cvs/src/src/libgloss/mips/Makefile.in,v
> retrieving revision 1.2
> diff -u -p -r1.2 Makefile.in
> --- Makefile.in 22 Aug 2001 00:22:58 -0000 1.2
> +++ Makefile.in 11 Jul 2002 16:28:35 -0000
> @@ -67,12 +67,14 @@ CRT0 = @crt0@
> PCRT0 = @pcrt0@
> GENOBJS = syscalls.o fstat.o getpid.o isatty.o kill.o \
> lseek.o print.o putnum.o stat.o unlink.o
> +GENOBJS2 = open.o close.o read.o write.o
> IDTOBJS = idtmon.o @part_specific_obj@ ${GENOBJS}
> PMONOBJS = pmon.o @part_specific_obj@ ${GENOBJS}
> LSIOBJS = lsipmon.o @part_specific_obj@ ${GENOBJS}
> -DVEOBJS = open.o close.o dvemon.o read.o write.o @part_specific_obj@ ${GENOBJS}
> -JMR3904OBJS = open.o close.o jmr3904-io.o read.o write.o \
> - @part_specific_obj@ ${GENOBJS}
> +DVEOBJS = dvemon.o @part_specific_obj@ ${GENOBJS} ${GENOBJS2}
> +JMR3904OBJS = jmr3904-io.o @part_specific_obj@ ${GENOBJS} ${GENOBJS2}
> +CFEOBJS = cfe.o cfe_api.o cfe_prestart.o \
> + @part_specific_obj@ ${GENOBJS} ${GENOBJS2}
>
> # Nullmon cannot support read and write, but the test cases pull them in via libs
> NULLMONOBJS = nullmon.o @part_specific_obj@ ${GENOBJS}
> @@ -129,6 +131,10 @@ libjmr3904.a: $(JMR3904OBJS)
> ${AR} ${ARFLAGS} $@ $(JMR3904OBJS)
> ${RANLIB} $@
>
> +libcfe.a: $(CFEOBJS)
> + ${AR} ${ARFLAGS} $@ $(CFEOBJS)
> + ${RANLIB} $@
> +
> # nullmon.a , This is what you want if you want crt0 but NO mon services
> # Supports GDB sim testing, board bringups, ICE operation.
> libnullmon.a: $(NULLMONOBJS)
> @@ -141,7 +147,7 @@ libnullmon.a: $(NULLMONOBJS)
> # in the comand line for ld, and all the symbols will get fully
> # resolved.
>
> -test: $(OBJS) ${BSP} pmon-test idt-test
> +test: $(OBJS) ${BSP} pmon-test idt-test cfe-test
> @echo Done...
>
> dtor.o: $(srcdir)/dtor.C
> @@ -169,6 +175,16 @@ idt-test.dis: idt-test.x
> @rm -fr idt-test.dis
> $(OBJDUMP) -d idt-test.x > $@
> idt-test: idt-test.srec idt-test.dis
> +
> +cfe-test.x: test.o ${CRT0} Makefile libcfe.a
> + ${CC} $(CFLAGS_FOR_TARGET) -L${srcdir} -L${objdir} \
> + test.o -o $@ $(NEWLIB_LDFLAGS) -Wl,-Tcfe.ld
> +cfe-test.srec: cfe-test.x
> + $(OBJCOPY) -O srec cfe-test.x $@
> +cfe-test.dis: cfe-test.x
> + @rm -fr cfe-test.dis
> + $(OBJDUMP) -d cfe-test.x > $@
> +cfe-test: cfe-test.srec cfe-test.dis
>
> doc:
>
> Index: cfe.c
> ===================================================================
> RCS file: cfe.c
> diff -N cfe.c
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ cfe.c 11 Jul 2002 16:28:35 -0000
> @@ -0,0 +1,141 @@
> +/* cfe.c -- I/O code for the MIPS boards running CFE. */
> +
> +/*
> + * Copyright 2001, 2002
> + * 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"
> +
> +char inbyte (void);
> +int outbyte (char c);
> +
> +/* Make sure cfe_prestart is used. It doesn't look like setting the
> + entry symbol in the linker script to a symbol from that fiel will do
> + this! */
> +extern int _prestart;
> +static void *force_prestart = &_prestart;
> +
> +/* The following variables are initialized to non-zero so that they'll be
> + in data, rather than BSS. Used to be that you could init variables to
> + any value to put them into initialized data sections rather than BSS,
> + but that decades-old idiom went out the window with gcc 3.2. Now,
> + either you compile specially (with -fno-zero-initialized-in-bss), or
> + you init to non-zero. In this case, initting to non-zero is OK (and
> + even beneficial; alignment fault via jump to odd if not properly
> + set up by _prestart()), so we do the latter. */
> +unsigned int __cfe_handle = 0xdeadbeef;
> +unsigned int __cfe_entrypt = 0xdeadbeef;
> +
> +/* Echo input characters? */
> +int __cfe_echo_input = 0;
> +
> +/* CFE handle used to access console device. */
> +static int cfe_conshandle;
> +
> +char
> +inbyte (void)
> +{
> + unsigned char c;
> + int rv;
> +
> + while (cfe_read (cfe_conshandle, &c, 1) != 1)
> + ;
> + if (c == '\r')
> + c = '\n';
> + if (__cfe_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;
> +}
> +
> +/* Initialize hardware. Called from crt0. */
> +void
> +hardware_init_hook(void)
> +{
> + cfe_init (__cfe_handle, __cfe_entrypt);
> + cfe_conshandle = cfe_getstdhandle(CFE_STDHANDLE_CONSOLE);
> +}
> +
> +/* Avoid worst-case execution hazards. This is targetted at the SB-1
> + pipe, and is much worse than it needs to be (not even counting
> + the subroutine call and return). */
> +void
> +hardware_hazard_hook(void)
> +{
> + __asm__ __volatile__ (" .set push \n"
> + " .set mips32 \n"
> + " .set noreorder \n"
> + " ssnop \n"
> + " ssnop \n"
> + " ssnop \n"
> + " bnel $0, $0, .+4 \n"
> + " ssnop \n"
> + " .set pop \n");
> +}
> +
> +/* Exit back to monitor, with the given status code. */
> +void
> +hardware_exit_hook (int status)
> +{
> + outbyte ('\r');
> + outbyte ('\n');
> + cfe_exit (CFE_FLG_WARMSTART, status);
> +}
> +
> +/* Structure filled in by get_mem_info. Only the size field is
> + actually used (by sbrk), so the others aren't even filled in. */
> +struct s_mem
> +{
> + unsigned int size;
> + unsigned int icsize;
> + unsigned int dcsize;
> +};
> +
> +void
> +get_mem_info (mem)
> + struct s_mem *mem;
> +{
> + /* XXX FIXME: Fake this for now. Should invoke cfe_enummem, but we
> + don't have enough stack to do that (yet). */
> + mem->size = 0x4000000; /* Assume 64 MB of RAM */
> +}
> Index: cfe.ld
> ===================================================================
> RCS file: cfe.ld
> diff -N cfe.ld
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ cfe.ld 11 Jul 2002 16:28:35 -0000
> @@ -0,0 +1,162 @@
> +/* The following TEXT start address leaves space for the monitor
> + workspace. */
> +
> +ENTRY(_prestart)
> +OUTPUT_FORMAT("elf32-bigmips", "elf32-bigmips", "elf32-littlemips")
> +GROUP(-lc -lcfe -lgcc)
> +SEARCH_DIR(.)
> +__DYNAMIC = 0;
> +
> +/*
> + * Allocate the stack to be at the top of memory, since the stack
> + * grows down
> + */
> +PROVIDE (__stack = 0);
> +/* PROVIDE (__global = 0); */
> +
> +/*
> + * Initalize some symbols to be zero so we can reference them in the
> + * crt0 without core dumping. These functions are all optional, but
> + * we do this so we can have our crt0 always use them if they exist.
> + * This is so BSPs work better when using the crt0 installed with gcc.
> + * We have to initalize them twice, so we multiple object file
> + * formats, as some prepend an underscore.
> + */
> +PROVIDE (hardware_exit_hook = 0);
> +PROVIDE (hardware_hazard_hook = 0);
> +PROVIDE (hardware_init_hook = 0);
> +PROVIDE (software_init_hook = 0);
> +
> +SECTIONS
> +{
> + . = 0x80020000;
> + .text : {
> + _ftext = . ;
> + PROVIDE (eprol = .);
> + *(.text)
> + *(.text.*)
> + *(.gnu.linkonce.t*)
> + *(.mips16.fn.*)
> + *(.mips16.call.*)
> + }
> + .init : {
> + *(.init)
> + }
> + .fini : {
> + *(.fini)
> + }
> + .rel.sdata : {
> + PROVIDE (__runtime_reloc_start = .);
> + *(.rel.sdata)
> + PROVIDE (__runtime_reloc_stop = .);
> + }
> + PROVIDE (etext = .);
> + _etext = .;
> +
> + .ctors :
> + {
> + /* gcc uses crtbegin.o to find the start of
> + the constructors, so we make sure it is
> + first. Because this is a wildcard, it
> + doesn't matter if the user does not
> + actually link against crtbegin.o; the
> + linker won't look for a file to match a
> + wildcard. The wildcard also means that it
> + doesn't matter which directory crtbegin.o
> + is in. */
> +
> + KEEP (*crtbegin.o(.ctors))
> +
> + /* We don't want to include the .ctor section from
> + from the crtend.o file until after the sorted ctors.
> + The .ctor section from the crtend file contains the
> + end of ctors marker and it must be last */
> +
> + KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
> + KEEP (*(SORT(.ctors.*)))
> + KEEP (*(.ctors))
> + }
> +
> + .dtors :
> + {
> + KEEP (*crtbegin.o(.dtors))
> + KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
> + KEEP (*(SORT(.dtors.*)))
> + KEEP (*(.dtors))
> + }
> +
> + . = .;
> + .rodata : {
> + *(.rdata)
> + *(.rodata)
> + *(.rodata.*)
> + *(.gnu.linkonce.r*)
> + }
> + _fdata = ALIGN(16);
> + .data : {
> + *(.data)
> + *(.data.*)
> + *(.gnu.linkonce.d*)
> + }
> + . = ALIGN(8);
> + _gp = . + 0x8000;
> + __global = _gp;
> + .lit8 : {
> + *(.lit8)
> + }
> + .lit4 : {
> + *(.lit4)
> + }
> + .sdata : {
> + *(.sdata)
> + *(.sdata.*)
> + *(.gnu.linkonce.s*)
> + }
> + . = ALIGN(4);
> + PROVIDE (edata = .);
> + _edata = .;
> + _fbss = .;
> + .sbss : {
> + *(.sbss)
> + *(.scommon)
> + }
> + .bss : {
> + _bss_start = . ;
> + *(.bss)
> + *(COMMON)
> + }
> +
> + PROVIDE (end = .);
> + _end = .;
> +
> + /* DWARF debug sections.
> + Symbols in the DWARF debugging sections are relative to
> + the beginning of the section so we begin them at 0. */
> +
> + /* DWARF 1 */
> + .debug 0 : { *(.debug) }
> + .line 0 : { *(.line) }
> +
> + /* GNU DWARF 1 extensions */
> + .debug_srcinfo 0 : { *(.debug_srcinfo) }
> + .debug_sfnames 0 : { *(.debug_sfnames) }
> +
> + /* DWARF 1.1 and DWARF 2 */
> + .debug_aranges 0 : { *(.debug_aranges) }
> + .debug_pubnames 0 : { *(.debug_pubnames) }
> +
> + /* DWARF 2 */
> + .debug_info 0 : { *(.debug_info) }
> + .debug_abbrev 0 : { *(.debug_abbrev) }
> + .debug_line 0 : { *(.debug_line) }
> + .debug_frame 0 : { *(.debug_frame) }
> + .debug_str 0 : { *(.debug_str) }
> + .debug_loc 0 : { *(.debug_loc) }
> + .debug_macinfo 0 : { *(.debug_macinfo) }
> +
> + /* SGI/MIPS DWARF 2 extensions */
> + .debug_weaknames 0 : { *(.debug_weaknames) }
> + .debug_funcnames 0 : { *(.debug_funcnames) }
> + .debug_typenames 0 : { *(.debug_typenames) }
> + .debug_varnames 0 : { *(.debug_varnames) }
> +}
> Index: cfe_api.c
> ===================================================================
> RCS file: cfe_api.c
> diff -N cfe_api.c
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ cfe_api.c 11 Jul 2002 16:28:35 -0000
> @@ -0,0 +1,534 @@
> +/* From: CFE Id: cfe_api.c,v 1.16 2002/07/09 23:29:11 cgd Exp $ */
> +
> +/*
> + * Copyright 2000, 2001, 2002
> + * 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,
> + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
> + * OR OTHERWISE), EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +/* *********************************************************************
> + *
> + * Broadcom Common Firmware Environment (CFE)
> + *
> + * Device Function stubs File: cfe_api.c
> + *
> + * This module contains device function stubs (small routines to
> + * call the standard "iocb" interface entry point to CFE).
> + * There should be one routine here per iocb function call.
> + *
> + * Authors: Mitch Lichtenberg, Chris Demetriou
> + *
> + ********************************************************************* */
> +
> +#include "cfe_api.h"
> +#include "cfe_api_int.h"
> +
> +/* Cast from a native pointer to a cfe_xptr_t and back. */
> +#define XPTR_FROM_NATIVE(n) ((cfe_xptr_t) (intptr_t) (n))
> +#define NATIVE_FROM_XPTR(x) ((void *) (intptr_t) (x))
> +
> +#ifdef CFE_API_IMPL_NAMESPACE
> +#define cfe_iocb_dispatch(a) __cfe_iocb_dispatch(a)
> +#endif
> +int cfe_iocb_dispatch(cfe_xiocb_t *xiocb);
> +
> +#if defined(CFE_API_common) || defined(CFE_API_ALL)
> +/*
> + * Declare the dispatch function with args of "intptr_t".
> + * This makes sure whatever model we're compiling in
> + * puts the pointers in a single register. For example,
> + * combining -mlong64 and -mips1 or -mips2 would lead to
> + * trouble, since the handle and IOCB pointer will be
> + * passed in two registers each, and CFE expects one.
> + */
> +
> +static int (*cfe_dispfunc)(intptr_t handle, intptr_t xiocb) = 0;
> +static cfe_xuint_t cfe_handle = 0;
> +
> +int
> +cfe_init(cfe_xuint_t handle, cfe_xuint_t ept)
> +{
> + cfe_dispfunc = NATIVE_FROM_XPTR(ept);
> + cfe_handle = handle;
> + return 0;
> +}
> +
> +int
> +cfe_iocb_dispatch(cfe_xiocb_t *xiocb)
> +{
> + if (!cfe_dispfunc) return -1;
> + return (*cfe_dispfunc)((intptr_t)cfe_handle, (intptr_t)xiocb);
> +}
> +#endif /* CFE_API_common || CFE_API_ALL */
> +
> +#if defined(CFE_API_close) || defined(CFE_API_ALL)
> +int
> +cfe_close(int handle)
> +{
> + cfe_xiocb_t xiocb;
> +
> + xiocb.xiocb_fcode = CFE_CMD_DEV_CLOSE;
> + xiocb.xiocb_status = 0;
> + xiocb.xiocb_handle = handle;
> + xiocb.xiocb_flags = 0;
> + xiocb.xiocb_psize = 0;
> +
> + cfe_iocb_dispatch(&xiocb);
> +
> + return xiocb.xiocb_status;
> +
> +}
> +#endif /* CFE_API_close || CFE_API_ALL */
> +
> +#if defined(CFE_API_cpu_start) || defined(CFE_API_ALL)
> +int
> +cfe_cpu_start(int cpu, void (*fn)(void), long sp, long gp, long a1)
> +{
> + cfe_xiocb_t xiocb;
> +
> + xiocb.xiocb_fcode = CFE_CMD_FW_CPUCTL;
> + xiocb.xiocb_status = 0;
> + xiocb.xiocb_handle = 0;
> + xiocb.xiocb_flags = 0;
> + xiocb.xiocb_psize = sizeof(xiocb_cpuctl_t);
> + xiocb.plist.xiocb_cpuctl.cpu_number = cpu;
> + xiocb.plist.xiocb_cpuctl.cpu_command = CFE_CPU_CMD_START;
> + xiocb.plist.xiocb_cpuctl.gp_val = gp;
> + xiocb.plist.xiocb_cpuctl.sp_val = sp;
> + xiocb.plist.xiocb_cpuctl.a1_val = a1;
> + xiocb.plist.xiocb_cpuctl.start_addr = (long)fn;
> +
> + cfe_iocb_dispatch(&xiocb);
> +
> + return xiocb.xiocb_status;
> +}
> +#endif /* CFE_API_cpu_start || CFE_API_ALL */
> +
> +#if defined(CFE_API_cpu_stop) || defined(CFE_API_ALL)
> +int
> +cfe_cpu_stop(int cpu)
> +{
> + cfe_xiocb_t xiocb;
> +
> + xiocb.xiocb_fcode = CFE_CMD_FW_CPUCTL;
> + xiocb.xiocb_status = 0;
> + xiocb.xiocb_handle = 0;
> + xiocb.xiocb_flags = 0;
> + xiocb.xiocb_psize = sizeof(xiocb_cpuctl_t);
> + xiocb.plist.xiocb_cpuctl.cpu_number = cpu;
> + xiocb.plist.xiocb_cpuctl.cpu_command = CFE_CPU_CMD_STOP;
> +
> + cfe_iocb_dispatch(&xiocb);
> +
> + return xiocb.xiocb_status;
> +}
> +#endif /* CFE_API_cpu_stop || CFE_API_ALL */
> +
> +#if defined(CFE_API_enumenv) || defined(CFE_API_ALL)
> +int
> +cfe_enumenv(int idx, char *name, int namelen, char *val, int vallen)
> +{
> + cfe_xiocb_t xiocb;
> +
> + xiocb.xiocb_fcode = CFE_CMD_ENV_SET;
> + xiocb.xiocb_status = 0;
> + xiocb.xiocb_handle = 0;
> + xiocb.xiocb_flags = 0;
> + xiocb.xiocb_psize = sizeof(xiocb_envbuf_t);
> + xiocb.plist.xiocb_envbuf.enum_idx = idx;
> + xiocb.plist.xiocb_envbuf.name_ptr = XPTR_FROM_NATIVE(name);
> + xiocb.plist.xiocb_envbuf.name_length = namelen;
> + xiocb.plist.xiocb_envbuf.val_ptr = XPTR_FROM_NATIVE(val);
> + xiocb.plist.xiocb_envbuf.val_length = vallen;
> +
> + cfe_iocb_dispatch(&xiocb);
> +
> + return xiocb.xiocb_status;
> +}
> +#endif /* CFE_API_enumenv || CFE_API_ALL */
> +
> +#if defined(CFE_API_enummem) || defined(CFE_API_ALL)
> +int
> +cfe_enummem(int idx, int flags, cfe_xuint_t *start, cfe_xuint_t *length,
> + cfe_xuint_t *type)
> +{
> + cfe_xiocb_t xiocb;
> +
> + xiocb.xiocb_fcode = CFE_CMD_FW_MEMENUM;
> + xiocb.xiocb_status = 0;
> + xiocb.xiocb_handle = 0;
> + xiocb.xiocb_flags = flags;
> + xiocb.xiocb_psize = sizeof(xiocb_meminfo_t);
> + xiocb.plist.xiocb_meminfo.mi_idx = idx;
> +
> + cfe_iocb_dispatch(&xiocb);
> +
> + if (xiocb.xiocb_status < 0)
> + return xiocb.xiocb_status;
> +
> + *start = xiocb.plist.xiocb_meminfo.mi_addr;
> + *length = xiocb.plist.xiocb_meminfo.mi_size;
> + *type = xiocb.plist.xiocb_meminfo.mi_type;
> +
> + return 0;
> +}
> +#endif /* CFE_API_enummem || CFE_API_ALL */
> +
> +#if defined(CFE_API_exit) || defined(CFE_API_ALL)
> +int
> +cfe_exit(int warm, int status)
> +{
> + cfe_xiocb_t xiocb;
> +
> + xiocb.xiocb_fcode = CFE_CMD_FW_RESTART;
> + xiocb.xiocb_status = 0;
> + xiocb.xiocb_handle = 0;
> + xiocb.xiocb_flags = warm ? CFE_FLG_WARMSTART : 0;
> + xiocb.xiocb_psize = sizeof(xiocb_exitstat_t);
> + xiocb.plist.xiocb_exitstat.status = status;
> +
> + cfe_iocb_dispatch(&xiocb);
> +
> + return xiocb.xiocb_status;
> +}
> +#endif /* CFE_API_exit || CFE_API_ALL */
> +
> +#if defined(CFE_API_flushcache) || defined(CFE_API_ALL)
> +int
> +cfe_flushcache(int flg)
> +{
> + cfe_xiocb_t xiocb;
> +
> + xiocb.xiocb_fcode = CFE_CMD_FW_FLUSHCACHE;
> + xiocb.xiocb_status = 0;
> + xiocb.xiocb_handle = 0;
> + xiocb.xiocb_flags = flg;
> + xiocb.xiocb_psize = 0;
> +
> + cfe_iocb_dispatch(&xiocb);
> +
> + return xiocb.xiocb_status;
> +}
> +#endif /* CFE_API_flushcache || CFE_API_ALL */
> +
> +#if defined(CFE_API_getdevinfo) || defined(CFE_API_ALL)
> +int
> +cfe_getdevinfo(char *name)
> +{
> + cfe_xiocb_t xiocb;
> +
> + xiocb.xiocb_fcode = CFE_CMD_DEV_GETINFO;
> + xiocb.xiocb_status = 0;
> + xiocb.xiocb_handle = 0;
> + xiocb.xiocb_flags = 0;
> + xiocb.xiocb_psize = sizeof(xiocb_buffer_t);
> + xiocb.plist.xiocb_buffer.buf_offset = 0;
> + xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(name);
> + xiocb.plist.xiocb_buffer.buf_length = cfe_strlen(name);
> +
> + cfe_iocb_dispatch(&xiocb);
> +
> + if (xiocb.xiocb_status < 0)
> + return xiocb.xiocb_status;
> + return xiocb.plist.xiocb_buffer.buf_devflags;
> +}
> +#endif /* CFE_API_getdevinfo || CFE_API_ALL */
> +
> +#if defined(CFE_API_getenv) || defined(CFE_API_ALL)
> +int
> +cfe_getenv(char *name, char *dest, int destlen)
> +{
> + cfe_xiocb_t xiocb;
> +
> + *dest = 0;
> +
> + xiocb.xiocb_fcode = CFE_CMD_ENV_GET;
> + xiocb.xiocb_status = 0;
> + xiocb.xiocb_handle = 0;
> + xiocb.xiocb_flags = 0;
> + xiocb.xiocb_psize = sizeof(xiocb_envbuf_t);
> + xiocb.plist.xiocb_envbuf.enum_idx = 0;
> + xiocb.plist.xiocb_envbuf.name_ptr = XPTR_FROM_NATIVE(name);
> + xiocb.plist.xiocb_envbuf.name_length = cfe_strlen(name);
> + xiocb.plist.xiocb_envbuf.val_ptr = XPTR_FROM_NATIVE(dest);
> + xiocb.plist.xiocb_envbuf.val_length = destlen;
> +
> + cfe_iocb_dispatch(&xiocb);
> +
> + return xiocb.xiocb_status;
> +}
> +#endif /* CFE_API_getenv || CFE_API_ALL */
> +
> +#if defined(CFE_API_getfwinfo) || defined(CFE_API_ALL)
> +int
> +cfe_getfwinfo(cfe_fwinfo_t *info)
> +{
> + cfe_xiocb_t xiocb;
> +
> + xiocb.xiocb_fcode = CFE_CMD_FW_GETINFO;
> + xiocb.xiocb_status = 0;
> + xiocb.xiocb_handle = 0;
> + xiocb.xiocb_flags = 0;
> + xiocb.xiocb_psize = sizeof(xiocb_fwinfo_t);
> +
> + cfe_iocb_dispatch(&xiocb);
> +
> + if (xiocb.xiocb_status < 0)
> + return xiocb.xiocb_status;
> +
> + info->fwi_version = xiocb.plist.xiocb_fwinfo.fwi_version;
> + info->fwi_totalmem = xiocb.plist.xiocb_fwinfo.fwi_totalmem;
> + info->fwi_flags = xiocb.plist.xiocb_fwinfo.fwi_flags;
> + info->fwi_boardid = xiocb.plist.xiocb_fwinfo.fwi_boardid;
> + info->fwi_bootarea_va = xiocb.plist.xiocb_fwinfo.fwi_bootarea_va;
> + info->fwi_bootarea_pa = xiocb.plist.xiocb_fwinfo.fwi_bootarea_pa;
> + info->fwi_bootarea_size = xiocb.plist.xiocb_fwinfo.fwi_bootarea_size;
> +#if 0
> + info->fwi_reserved1 = xiocb.plist.xiocb_fwinfo.fwi_reserved1;
> + info->fwi_reserved2 = xiocb.plist.xiocb_fwinfo.fwi_reserved2;
> + info->fwi_reserved3 = xiocb.plist.xiocb_fwinfo.fwi_reserved3;
> +#endif
> +
> + return 0;
> +}
> +#endif /* CFE_API_getfwinfo || CFE_API_ALL */
> +
> +#if defined(CFE_API_getstdhandle) || defined(CFE_API_ALL)
> +int
> +cfe_getstdhandle(int flg)
> +{
> + cfe_xiocb_t xiocb;
> +
> + xiocb.xiocb_fcode = CFE_CMD_DEV_GETHANDLE;
> + xiocb.xiocb_status = 0;
> + xiocb.xiocb_handle = 0;
> + xiocb.xiocb_flags = flg;
> + xiocb.xiocb_psize = 0;
> +
> + cfe_iocb_dispatch(&xiocb);
> +
> + if (xiocb.xiocb_status < 0)
> + return xiocb.xiocb_status;
> + return xiocb.xiocb_handle;
> +
> +}
> +#endif /* CFE_API_getstdhandle || CFE_API_ALL */
> +
> +#if defined(CFE_API_getticks) || defined(CFE_API_ALL)
> +int64_t
> +#ifdef CFE_API_IMPL_NAMESPACE
> +__cfe_getticks(void)
> +#else
> +cfe_getticks(void)
> +#endif
> +{
> + cfe_xiocb_t xiocb;
> +
> + xiocb.xiocb_fcode = CFE_CMD_FW_GETTIME;
> + xiocb.xiocb_status = 0;
> + xiocb.xiocb_handle = 0;
> + xiocb.xiocb_flags = 0;
> + xiocb.xiocb_psize = sizeof(xiocb_time_t);
> + xiocb.plist.xiocb_time.ticks = 0;
> +
> + cfe_iocb_dispatch(&xiocb);
> +
> + return xiocb.plist.xiocb_time.ticks;
> +
> +}
> +#endif /* CFE_API_getticks || CFE_API_ALL */
> +
> +#if defined(CFE_API_inpstat) || defined(CFE_API_ALL)
> +int
> +cfe_inpstat(int handle)
> +{
> + cfe_xiocb_t xiocb;
> +
> + xiocb.xiocb_fcode = CFE_CMD_DEV_INPSTAT;
> + xiocb.xiocb_status = 0;
> + xiocb.xiocb_handle = handle;
> + xiocb.xiocb_flags = 0;
> + xiocb.xiocb_psize = sizeof(xiocb_inpstat_t);
> + xiocb.plist.xiocb_inpstat.inp_status = 0;
> +
> + cfe_iocb_dispatch(&xiocb);
> +
> + if (xiocb.xiocb_status < 0)
> + return xiocb.xiocb_status;
> + return xiocb.plist.xiocb_inpstat.inp_status;
> +
> +}
> +#endif /* CFE_API_inpstat || CFE_API_ALL */
> +
> +#if defined(CFE_API_ioctl) || defined(CFE_API_ALL)
> +int
> +cfe_ioctl(int handle, unsigned int ioctlnum, unsigned char *buffer, int length,
> + int *retlen, cfe_xuint_t offset)
> +{
> + cfe_xiocb_t xiocb;
> +
> + xiocb.xiocb_fcode = CFE_CMD_DEV_IOCTL;
> + xiocb.xiocb_status = 0;
> + xiocb.xiocb_handle = handle;
> + xiocb.xiocb_flags = 0;
> + xiocb.xiocb_psize = sizeof(xiocb_buffer_t);
> + xiocb.plist.xiocb_buffer.buf_offset = offset;
> + xiocb.plist.xiocb_buffer.buf_ioctlcmd = ioctlnum;
> + xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(buffer);
> + xiocb.plist.xiocb_buffer.buf_length = length;
> +
> + cfe_iocb_dispatch(&xiocb);
> +
> + if (retlen)
> + *retlen = xiocb.plist.xiocb_buffer.buf_retlen;
> + return xiocb.xiocb_status;
> +}
> +#endif /* CFE_API_ioctl || CFE_API_ALL */
> +
> +#if defined(CFE_API_open) || defined(CFE_API_ALL)
> +int
> +cfe_open(char *name)
> +{
> + cfe_xiocb_t xiocb;
> +
> + xiocb.xiocb_fcode = CFE_CMD_DEV_OPEN;
> + xiocb.xiocb_status = 0;
> + xiocb.xiocb_handle = 0;
> + xiocb.xiocb_flags = 0;
> + xiocb.xiocb_psize = sizeof(xiocb_buffer_t);
> + xiocb.plist.xiocb_buffer.buf_offset = 0;
> + xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(name);
> + xiocb.plist.xiocb_buffer.buf_length = cfe_strlen(name);
> +
> + cfe_iocb_dispatch(&xiocb);
> +
> + if (xiocb.xiocb_status < 0)
> + return xiocb.xiocb_status;
> + return xiocb.xiocb_handle;
> +}
> +#endif /* CFE_API_open || CFE_API_ALL */
> +
> +#if defined(CFE_API_read) || defined(CFE_API_ALL)
> +int
> +cfe_read(int handle, unsigned char *buffer, int length)
> +{
> + return cfe_readblk(handle, 0, buffer, length);
> +}
> +#endif /* CFE_API_read || CFE_API_ALL */
> +
> +#if defined(CFE_API_readblk) || defined(CFE_API_ALL)
> +int
> +cfe_readblk(int handle, cfe_xint_t offset, unsigned char *buffer, int length)
> +{
> + cfe_xiocb_t xiocb;
> +
> + xiocb.xiocb_fcode = CFE_CMD_DEV_READ;
> + xiocb.xiocb_status = 0;
> + xiocb.xiocb_handle = handle;
> + xiocb.xiocb_flags = 0;
> + xiocb.xiocb_psize = sizeof(xiocb_buffer_t);
> + xiocb.plist.xiocb_buffer.buf_offset = offset;
> + xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(buffer);
> + xiocb.plist.xiocb_buffer.buf_length = length;
> +
> + cfe_iocb_dispatch(&xiocb);
> +
> + if (xiocb.xiocb_status < 0)
> + return xiocb.xiocb_status;
> + return xiocb.plist.xiocb_buffer.buf_retlen;
> +}
> +#endif /* CFE_API_readblk || CFE_API_ALL */
> +
> +#if defined(CFE_API_setenv) || defined(CFE_API_ALL)
> +int
> +cfe_setenv(char *name, char *val)
> +{
> + cfe_xiocb_t xiocb;
> +
> + xiocb.xiocb_fcode = CFE_CMD_ENV_SET;
> + xiocb.xiocb_status = 0;
> + xiocb.xiocb_handle = 0;
> + xiocb.xiocb_flags = 0;
> + xiocb.xiocb_psize = sizeof(xiocb_envbuf_t);
> + xiocb.plist.xiocb_envbuf.enum_idx = 0;
> + xiocb.plist.xiocb_envbuf.name_ptr = XPTR_FROM_NATIVE(name);
> + xiocb.plist.xiocb_envbuf.name_length = cfe_strlen(name);
> + xiocb.plist.xiocb_envbuf.val_ptr = XPTR_FROM_NATIVE(val);
> + xiocb.plist.xiocb_envbuf.val_length = cfe_strlen(val);
> +
> + cfe_iocb_dispatch(&xiocb);
> +
> + return xiocb.xiocb_status;
> +}
> +#endif /* CFE_API_setenv || CFE_API_ALL */
> +
> +#if (defined(CFE_API_strlen) || defined(CFE_API_ALL)) \
> + && !defined(CFE_API_STRLEN_CUSTOM)
> +int
> +cfe_strlen(char *name)
> +{
> + int count = 0;
> +
> + while (*name++)
> + count++;
> +
> + return count;
> +}
> +#endif /* CFE_API_strlen || CFE_API_ALL */
> +
> +#if defined(CFE_API_write) || defined(CFE_API_ALL)
> +int
> +cfe_write(int handle, unsigned char *buffer, int length)
> +{
> + return cfe_writeblk(handle, 0, buffer, length);
> +}
> +#endif /* CFE_API_write || CFE_API_ALL */
> +
> +#if defined(CFE_API_writeblk) || defined(CFE_API_ALL)
> +int
> +cfe_writeblk(int handle, cfe_xint_t offset, unsigned char *buffer, int length)
> +{
> + cfe_xiocb_t xiocb;
> +
> + xiocb.xiocb_fcode = CFE_CMD_DEV_WRITE;
> + xiocb.xiocb_status = 0;
> + xiocb.xiocb_handle = handle;
> + xiocb.xiocb_flags = 0;
> + xiocb.xiocb_psize = sizeof(xiocb_buffer_t);
> + xiocb.plist.xiocb_buffer.buf_offset = offset;
> + xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(buffer);
> + xiocb.plist.xiocb_buffer.buf_length = length;
> +
> + cfe_iocb_dispatch(&xiocb);
> +
> + if (xiocb.xiocb_status < 0)
> + return xiocb.xiocb_status;
> + return xiocb.plist.xiocb_buffer.buf_retlen;
> +}
> +#endif /* CFE_API_writeblk || CFE_API_ALL */
> Index: cfe_api.h
> ===================================================================
> RCS file: cfe_api.h
> diff -N cfe_api.h
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ cfe_api.h 11 Jul 2002 16:28:35 -0000
> @@ -0,0 +1,203 @@
> +/* From: CFE Id: cfe_api.h,v 1.29 2002/07/09 23:29:11 cgd Exp $ */
> +
> +/*
> + * Copyright 2000, 2001, 2002
> + * 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,
> + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
> + * OR OTHERWISE), EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +/* *********************************************************************
> + *
> + * Broadcom Common Firmware Environment (CFE)
> + *
> + * Device function prototypes File: cfe_api.h
> + *
> + * This file contains declarations for doing callbacks to
> + * cfe from an application. It should be the only header
> + * needed by the application to use this library
> + *
> + * Authors: Mitch Lichtenberg, Chris Demetriou
> + *
> + ********************************************************************* */
> +
> +#ifndef CFE_API_H
> +#define CFE_API_H
> +
> +/*
> + * Apply customizations here for different OSes. These need to:
> + * * typedef uint64_t, int64_t, intptr_t, uintptr_t.
> + * * define cfe_strlen() if use of an existing function is desired.
> + * * define CFE_API_IMPL_NAMESPACE if API functions are to use
> + * names in the implementation namespace.
> + * Also, optionally, if the build environment does not do so automatically,
> + * CFE_API_* can be defined here as desired.
> + */
> +/* Begin customization. */
> +#include <sys/types.h> /* for __uint64_t and __int64_t. */
> +#define int64_t __int64_t
> +#define uint64_t __int64_t
> +#include <_ansi.h> /* for _POINTER_INT. */
> +typedef _POINTER_INT intptr_t;
> +typedef unsigned _POINTER_INT uintptr_t;
> +
> +#include <string.h>
> +#define cfe_strlen(s) strlen(s)
> +
> +#define CFE_API_ALL
> +#define CFE_API_IMPL_NAMESPACE
> +/* End customization. */
> +
> +
> +/* *********************************************************************
> + * Constants
> + ********************************************************************* */
> +
> +/* Seal indicating CFE's presence, passed to user program. */
> +#define CFE_EPTSEAL 0x43464531
> +
> +#define CFE_MI_RESERVED 0 /* memory is reserved, do not use */
> +#define CFE_MI_AVAILABLE 1 /* memory is available */
> +
> +#define CFE_FLG_WARMSTART 0x00000001
> +#define CFE_FLG_FULL_ARENA 0x00000001
> +#define CFE_FLG_ENV_PERMANENT 0x00000001
> +
> +#define CFE_CPU_CMD_START 1
> +#define CFE_CPU_CMD_STOP 0
> +
> +#define CFE_STDHANDLE_CONSOLE 0
> +
> +#define CFE_DEV_NETWORK 1
> +#define CFE_DEV_DISK 2
> +#define CFE_DEV_FLASH 3
> +#define CFE_DEV_SERIAL 4
> +#define CFE_DEV_CPU 5
> +#define CFE_DEV_NVRAM 6
> +#define CFE_DEV_CLOCK 7
> +#define CFE_DEV_OTHER 8
> +#define CFE_DEV_MASK 0x0F
> +
> +#define CFE_CACHE_FLUSH_D 1
> +#define CFE_CACHE_INVAL_I 2
> +#define CFE_CACHE_INVAL_D 4
> +#define CFE_CACHE_INVAL_L2 8
> +
> +#define CFE_FWI_64BIT 0x00000001
> +#define CFE_FWI_32BIT 0x00000002
> +#define CFE_FWI_RELOC 0x00000004
> +#define CFE_FWI_UNCACHED 0x00000008
> +#define CFE_FWI_MULTICPU 0x00000010
> +#define CFE_FWI_FUNCSIM 0x00000020
> +#define CFE_FWI_RTLSIM 0x00000040
> +
> +typedef struct {
> + int64_t fwi_version; /* major, minor, eco version */
> + int64_t fwi_totalmem; /* total installed mem */
> + int64_t fwi_flags; /* various flags */
> + int64_t fwi_boardid; /* board ID */
> + int64_t fwi_bootarea_va; /* VA of boot area */
> + int64_t fwi_bootarea_pa; /* PA of boot area */
> + int64_t fwi_bootarea_size; /* size of boot area */
> +} cfe_fwinfo_t;
> +
> +
> +/*
> + * cfe_strlen is handled specially: If already defined, it has been
> + * overridden in this environment with a standard strlen-like function.
> + */
> +#ifdef cfe_strlen
> +# define CFE_API_STRLEN_CUSTOM
> +#else
> +# ifdef CFE_API_IMPL_NAMESPACE
> +# define cfe_strlen(a) __cfe_strlen(a)
> +# endif
> +int cfe_strlen(char *name);
> +#endif
> +
> +/*
> + * Defines and prototypes for functions which take no arguments.
> + */
> +#ifdef CFE_API_IMPL_NAMESPACE
> +int64_t __cfe_getticks(void);
> +#define cfe_getticks() __cfe_getticks()
> +#else
> +int64_t cfe_getticks(void);
> +#endif
> +
> +/*
> + * Defines and prototypes for the rest of the functions.
> + */
> +#ifdef CFE_API_IMPL_NAMESPACE
> +#define cfe_close(a) __cfe_close(a)
> +#define cfe_cpu_start(a,b,c,d,e) __cfe_cpu_start(a,b,c,d,e)
> +#define cfe_cpu_stop(a) __cfe_cpu_stop(a)
> +#define cfe_enumenv(a,b,d,e,f) __cfe_enumenv(a,b,d,e,f)
> +#define cfe_enummem(a,b,c,d,e) __cfe_enummem(a,b,c,d,e)
> +#define cfe_exit(a,b) __cfe_exit(a,b)
> +#define cfe_flushcache(a) __cfe_cacheflush(a)
> +#define cfe_getdevinfo(a) __cfe_getdevinfo(a)
> +#define cfe_getenv(a,b,c) __cfe_getenv(a,b,c)
> +#define cfe_getfwinfo(a) __cfe_getfwinfo(a)
> +#define cfe_getstdhandle(a) __cfe_getstdhandle(a)
> +#define cfe_init(a,b) __cfe_init(a,b)
> +#define cfe_inpstat(a) __cfe_inpstat(a)
> +#define cfe_ioctl(a,b,c,d,e,f) __cfe_ioctl(a,b,c,d,e,f)
> +#define cfe_open(a) __cfe_open(a)
> +#define cfe_read(a,b,c) __cfe_read(a,b,c)
> +#define cfe_readblk(a,b,c,d) __cfe_readblk(a,b,c,d)
> +#define cfe_setenv(a,b) __cfe_setenv(a,b)
> +#define cfe_write(a,b,c) __cfe_write(a,b,c)
> +#define cfe_writeblk(a,b,c,d) __cfe_writeblk(a,b,c,d)
> +#endif /* CFE_API_IMPL_NAMESPACE */
> +
> +int cfe_close(int handle);
> +int cfe_cpu_start(int cpu, void (*fn)(void), long sp, long gp, long a1);
> +int cfe_cpu_stop(int cpu);
> +int cfe_enumenv(int idx, char *name, int namelen, char *val, int vallen);
> +int cfe_enummem(int idx, int flags, uint64_t *start, uint64_t *length,
> + uint64_t *type);
> +int cfe_exit(int warm,int status);
> +int cfe_flushcache(int flg);
> +int cfe_getdevinfo(char *name);
> +int cfe_getenv(char *name, char *dest, int destlen);
> +int cfe_getfwinfo(cfe_fwinfo_t *info);
> +int cfe_getstdhandle(int flg);
> +int cfe_init(uint64_t handle,uint64_t ept);
> +int cfe_inpstat(int handle);
> +int cfe_ioctl(int handle, unsigned int ioctlnum, unsigned char *buffer,
> + int length, int *retlen, uint64_t offset);
> +int cfe_open(char *name);
> +int cfe_read(int handle, unsigned char *buffer, int length);
> +int cfe_readblk(int handle, int64_t offset, unsigned char *buffer, int length);
> +int cfe_setenv(char *name, char *val);
> +int cfe_write(int handle, unsigned char *buffer, int length);
> +int cfe_writeblk(int handle, int64_t offset, unsigned char *buffer,
> + int length);
> +
> +#endif /* CFE_API_H */
> Index: cfe_api_int.h
> ===================================================================
> RCS file: cfe_api_int.h
> diff -N cfe_api_int.h
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ cfe_api_int.h 11 Jul 2002 16:28:35 -0000
> @@ -0,0 +1,168 @@
> +/* From: CFE Id: cfe_api_int.h,v 1.21 2002/07/09 23:29:11 cgd Exp $ */
> +
> +/*
> + * Copyright 2000, 2001, 2002
> + * 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,
> + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
> + * OR OTHERWISE), EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +/* *********************************************************************
> + *
> + * Broadcom Common Firmware Environment (CFE)
> + *
> + * Device function prototypes File: cfe_api_int.h
> + *
> + * This header defines all internal types and macros for the
> + * library. This is stuff that's not exported to an app
> + * using the library.
> + *
> + * Authors: Mitch Lichtenberg, Chris Demetriou
> + *
> + ********************************************************************* */
> +
> +#ifndef CFE_API_INT_H
> +#define CFE_API_INT_H
> +
> +/* *********************************************************************
> + * Constants
> + ********************************************************************* */
> +
> +#define CFE_CMD_FW_GETINFO 0
> +#define CFE_CMD_FW_RESTART 1
> +#define CFE_CMD_FW_BOOT 2
> +#define CFE_CMD_FW_CPUCTL 3
> +#define CFE_CMD_FW_GETTIME 4
> +#define CFE_CMD_FW_MEMENUM 5
> +#define CFE_CMD_FW_FLUSHCACHE 6
> +
> +#define CFE_CMD_DEV_GETHANDLE 9
> +#define CFE_CMD_DEV_ENUM 10
> +#define CFE_CMD_DEV_OPEN 11
> +#define CFE_CMD_DEV_INPSTAT 12
> +#define CFE_CMD_DEV_READ 13
> +#define CFE_CMD_DEV_WRITE 14
> +#define CFE_CMD_DEV_IOCTL 15
> +#define CFE_CMD_DEV_CLOSE 16
> +#define CFE_CMD_DEV_GETINFO 17
> +
> +#define CFE_CMD_ENV_ENUM 20
> +#define CFE_CMD_ENV_GET 22
> +#define CFE_CMD_ENV_SET 23
> +#define CFE_CMD_ENV_DEL 24
> +
> +#define CFE_CMD_MAX 32
> +
> +#define CFE_CMD_VENDOR_USE 0x8000 /* codes above this are for customer use */
> +
> +/* *********************************************************************
> + * Structures
> + ********************************************************************* */
> +
> +typedef uint64_t cfe_xuint_t;
> +typedef int64_t cfe_xint_t;
> +typedef int64_t cfe_xptr_t;
> +
> +typedef struct xiocb_buffer_s {
> + cfe_xuint_t buf_offset; /* offset on device (bytes) */
> + cfe_xptr_t buf_ptr; /* pointer to a buffer */
> + cfe_xuint_t buf_length; /* length of this buffer */
> + cfe_xuint_t buf_retlen; /* returned length (for read ops) */
> + cfe_xuint_t buf_ioctlcmd; /* IOCTL command (used only for IOCTLs) */
> +} xiocb_buffer_t;
> +
> +#define buf_devflags buf_ioctlcmd /* returned device info flags */
> +
> +typedef struct xiocb_inpstat_s {
> + cfe_xuint_t inp_status; /* 1 means input available */
> +} xiocb_inpstat_t;
> +
> +typedef struct xiocb_envbuf_s {
> + cfe_xint_t enum_idx; /* 0-based enumeration index */
> + cfe_xptr_t name_ptr; /* name string buffer */
> + cfe_xint_t name_length; /* size of name buffer */
> + cfe_xptr_t val_ptr; /* value string buffer */
> + cfe_xint_t val_length; /* size of value string buffer */
> +} xiocb_envbuf_t;
> +
> +typedef struct xiocb_cpuctl_s {
> + cfe_xuint_t cpu_number; /* cpu number to control */
> + cfe_xuint_t cpu_command; /* command to issue to CPU */
> + cfe_xuint_t start_addr; /* CPU start address */
> + cfe_xuint_t gp_val; /* starting GP value */
> + cfe_xuint_t sp_val; /* starting SP value */
> + cfe_xuint_t a1_val; /* starting A1 value */
> +} xiocb_cpuctl_t;
> +
> +typedef struct xiocb_time_s {
> + cfe_xint_t ticks; /* current time in ticks */
> +} xiocb_time_t;
> +
> +typedef struct xiocb_exitstat_s {
> + cfe_xint_t status;
> +} xiocb_exitstat_t;
> +
> +typedef struct xiocb_meminfo_s {
> + cfe_xint_t mi_idx; /* 0-based enumeration index */
> + cfe_xint_t mi_type; /* type of memory block */
> + cfe_xuint_t mi_addr; /* physical start address */
> + cfe_xuint_t mi_size; /* block size */
> +} xiocb_meminfo_t;
> +
> +typedef struct xiocb_fwinfo_s {
> + cfe_xint_t fwi_version; /* major, minor, eco version */
> + cfe_xint_t fwi_totalmem; /* total installed mem */
> + cfe_xint_t fwi_flags; /* various flags */
> + cfe_xint_t fwi_boardid; /* board ID */
> + cfe_xint_t fwi_bootarea_va; /* VA of boot area */
> + cfe_xint_t fwi_bootarea_pa; /* PA of boot area */
> + cfe_xint_t fwi_bootarea_size; /* size of boot area */
> + cfe_xint_t fwi_reserved1;
> + cfe_xint_t fwi_reserved2;
> + cfe_xint_t fwi_reserved3;
> +} xiocb_fwinfo_t;
> +
> +typedef struct cfe_xiocb_s {
> + cfe_xuint_t xiocb_fcode; /* IOCB function code */
> + cfe_xint_t xiocb_status; /* return status */
> + cfe_xint_t xiocb_handle; /* file/device handle */
> + cfe_xuint_t xiocb_flags; /* flags for this IOCB */
> + cfe_xuint_t xiocb_psize; /* size of parameter list */
> + union {
> + xiocb_buffer_t xiocb_buffer; /* buffer parameters */
> + xiocb_inpstat_t xiocb_inpstat; /* input status parameters */
> + xiocb_envbuf_t xiocb_envbuf; /* environment function parameters */
> + xiocb_cpuctl_t xiocb_cpuctl; /* CPU control parameters */
> + xiocb_time_t xiocb_time; /* timer parameters */
> + xiocb_meminfo_t xiocb_meminfo; /* memory arena info parameters */
> + xiocb_fwinfo_t xiocb_fwinfo; /* firmware information */
> + xiocb_exitstat_t xiocb_exitstat; /* Exit Status */
> + } plist;
> +} cfe_xiocb_t;
> +
> +#endif /* CFE_API_INT_H */
> Index: cfe_error.h
> ===================================================================
> RCS file: cfe_error.h
> diff -N cfe_error.h
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ cfe_error.h 11 Jul 2002 16:28:35 -0000
> @@ -0,0 +1,101 @@
> +/* From: CFE Id: cfe_error.h,v 1.2 2002/07/09 19:37:52 cgd Exp $ */
> +
> +/*
> + * Copyright 2000, 2001, 2002
> + * 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,
> + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
> + * OR OTHERWISE), EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +/* *********************************************************************
> + *
> + * Broadcom Common Firmware Environment (CFE)
> + *
> + * Error codes File: cfe_error.h
> + *
> + * CFE's global error code list is here.
> + *
> + * Author: Mitch Lichtenberg
> + *
> + ********************************************************************* */
> +
> +
> +#define CFE_OK 0
> +#define CFE_ERR -1 /* generic error */
> +#define CFE_ERR_INV_COMMAND -2
> +#define CFE_ERR_EOF -3
> +#define CFE_ERR_IOERR -4
> +#define CFE_ERR_NOMEM -5
> +#define CFE_ERR_DEVNOTFOUND -6
> +#define CFE_ERR_DEVOPEN -7
> +#define CFE_ERR_INV_PARAM -8
> +#define CFE_ERR_ENVNOTFOUND -9
> +#define CFE_ERR_ENVREADONLY -10
> +
> +#define CFE_ERR_NOTELF -11
> +#define CFE_ERR_NOT32BIT -12
> +#define CFE_ERR_WRONGENDIAN -13
> +#define CFE_ERR_BADELFVERS -14
> +#define CFE_ERR_NOTMIPS -15
> +#define CFE_ERR_BADELFFMT -16
> +#define CFE_ERR_BADADDR -17
> +
> +#define CFE_ERR_FILENOTFOUND -18
> +#define CFE_ERR_UNSUPPORTED -19
> +
> +#define CFE_ERR_HOSTUNKNOWN -20
> +
> +#define CFE_ERR_TIMEOUT -21
> +
> +#define CFE_ERR_PROTOCOLERR -22
> +
> +#define CFE_ERR_NETDOWN -23
> +#define CFE_ERR_NONAMESERVER -24
> +
> +#define CFE_ERR_NOHANDLES -25
> +#define CFE_ERR_ALREADYBOUND -26
> +
> +#define CFE_ERR_CANNOTSET -27
> +#define CFE_ERR_NOMORE -28
> +#define CFE_ERR_BADFILESYS -29
> +#define CFE_ERR_FSNOTAVAIL -30
> +
> +#define CFE_ERR_INVBOOTBLOCK -31
> +#define CFE_ERR_WRONGDEVTYPE -32
> +#define CFE_ERR_BBCHECKSUM -33
> +#define CFE_ERR_BOOTPROGCHKSUM -34
> +
> +#define CFE_ERR_LDRNOTAVAIL -35
> +
> +#define CFE_ERR_NOTREADY -36
> +
> +#define CFE_ERR_GETMEM -37
> +#define CFE_ERR_SETMEM -38
> +
> +#define CFE_ERR_NOTCONN -39
> +#define CFE_ERR_ADDRINUSE -40
> Index: cfe_prestart.S
> ===================================================================
> RCS file: cfe_prestart.S
> diff -N cfe_prestart.S
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ cfe_prestart.S 11 Jul 2002 16:28:35 -0000
> @@ -0,0 +1,66 @@
> +/*
> + * cfe_prestart.S -- startup file for MIPS running CFE.
> + * Derived from crt0.S.
> + *
> + * Copyright (c) 1995, 1996, 1997 Cygnus Support
> + *
> + * The authors hereby grant permission to use, copy, modify, distribute,
> + * and license this software and its documentation for any purpose, provided
> + * that existing copyright notices are retained in all copies and that this
> + * notice is included verbatim in any distributions. No written agreement,
> + * license, or royalty fee is required for any of the authorized uses.
> + * Modifications to this software may be copyrighted by their authors
> + * and need not follow the licensing terms described here, provided that
> + * the new terms are clearly indicated on the first page of each file where
> + * they apply.
> + */
> +
> +#ifdef __mips16
> +/* This file contains 32 bit assembly code. */
> + .set nomips16
> +#endif
> +
> +#include "regs.S"
> +
> +/* This is for referencing addresses that are not in the .sdata or
> + .sbss section under embedded-pic, or before we've set up gp. */
> +#ifdef __mips_embedded_pic
> +# ifdef __mips64
> +# define LA(t,x) la t,x-PICBASE ; daddu t,s0,t
> +# else
> +# define LA(t,x) la t,x-PICBASE ; addu t,s0,t
> +# endif
> +#else /* __mips_embedded_pic */
> +# define LA(t,x) la t,x
> +#endif /* __mips_embedded_pic */
> +
> + .globl __cfe_handle
> + .globl __cfe_entrypt
> +
> + .text
> + .align 2
> +
> + .globl _prestart
> + .ent _prestart
> +_prestart:
> + .set noreorder
> +#ifdef __mips_embedded_pic
> + PICBASE = .+8
> + bal PICBASE
> + nop
> + move s0,$31
> +#endif
> +
> + /* These are actually pointers, but they're guaranteed to be
> + in compatibility space and it's just easier to store them
> + as words ("unsigned int") than worry about the actual
> + pointer size of the runtime we're building. */
> + LA (v0, __cfe_handle)
> + sw a0, 0(v0)
> + LA (v0, __cfe_entrypt)
> + sw a2, 0(v0)
> +
> + LA (v0, _start)
> + jr v0
> + nop
> + .end _prestart
> Index: configure.in
> ===================================================================
> RCS file: /cvs/src/src/libgloss/mips/configure.in,v
> retrieving revision 1.4
> diff -u -p -r1.4 configure.in
> --- configure.in 18 Oct 2001 02:24:30 -0000 1.4
> +++ configure.in 11 Jul 2002 16:28:35 -0000
> @@ -107,14 +107,14 @@ case "${target}" in
> mipsisa32*-*-*)
> part_specific_obj=
> part_specific_defines=
> - script_list="idt32 idt64"
> - bsp_list="libidt.a"
> + script_list="idt32 idt64 cfe"
> + bsp_list="libidt.a libcfe.a"
> ;;
> *)
> part_specific_obj="vr4300.o cma101.o"
> part_specific_defines=
> - script_list="idt pmon ddb ddb-kseg0 lsi idtecoff nullmon"
> - bsp_list="libidt.a libpmon.a liblsi.a libnullmon.a"
> + script_list="idt pmon ddb ddb-kseg0 lsi cfe idtecoff nullmon"
> + bsp_list="libidt.a libpmon.a liblsi.a libcfe.a libnullmon.a"
> ;;
> esac
>