This is the mail archive of the newlib@sources.redhat.com mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [MIPS PATCH RFA] Add support for Broadcom CFE firmware tolibgloss.


	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
>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]