summaryrefslogtreecommitdiffstats
path: root/cfe/cfe/verif/ui_vapi.c
diff options
context:
space:
mode:
Diffstat (limited to 'cfe/cfe/verif/ui_vapi.c')
-rw-r--r--cfe/cfe/verif/ui_vapi.c300
1 files changed, 300 insertions, 0 deletions
diff --git a/cfe/cfe/verif/ui_vapi.c b/cfe/cfe/verif/ui_vapi.c
new file mode 100644
index 0000000..4575322
--- /dev/null
+++ b/cfe/cfe/verif/ui_vapi.c
@@ -0,0 +1,300 @@
+/* *********************************************************************
+ * Broadcom Common Firmware Environment (CFE)
+ *
+ * VAPI commands File: ui_vapi.c
+ *
+ * User interface for the verification API
+ *
+ * Author: Mitch Lichtenberg (mpl@broadcom.com)
+ *
+ *********************************************************************
+ *
+ * Copyright 2000,2001,2002,2003
+ * Broadcom Corporation. All rights reserved.
+ *
+ * This software is furnished under license and may be used and
+ * copied only in accordance with the following terms and
+ * conditions. Subject to these conditions, you may download,
+ * copy, install, use, modify and distribute modified or unmodified
+ * copies of this software in source and/or binary form. No title
+ * or ownership is transferred hereby.
+ *
+ * 1) Any source code used, modified or distributed must reproduce
+ * and retain this copyright notice and list of conditions
+ * as they appear in the source file.
+ *
+ * 2) No right is granted to use any trade name, trademark, or
+ * logo of Broadcom Corporation. The "Broadcom Corporation"
+ * name may not be used to endorse or promote products derived
+ * from this software without the prior written permission of
+ * Broadcom Corporation.
+ *
+ * 3) THIS SOFTWARE IS PROVIDED "AS-IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING BUT NOT LIMITED TO, ANY IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+ * PURPOSE, OR NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT
+ * SHALL BROADCOM BE LIABLE FOR ANY DAMAGES WHATSOEVER, AND IN
+ * PARTICULAR, BROADCOM SHALL NOT BE LIABLE FOR DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+ * TORT (INCLUDING NEGLIGENCE OR OTHERWISE), EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ ********************************************************************* */
+
+
+#include "lib_types.h"
+#include "lib_string.h"
+#include "lib_queue.h"
+#include "lib_malloc.h"
+#include "lib_printf.h"
+#include "bsp_config.h"
+
+#include "cfe_iocb.h"
+#include "cfe_device.h"
+#include "cfe_console.h"
+#include "env_subr.h"
+#include "ui_command.h"
+#include "cfe.h"
+
+#if CFG_VAPI
+
+#include "vapi.h"
+
+int ui_init_vapicmds(void);
+
+extern void vapitest(void);
+
+extern void vapi_run(int);
+
+extern uint64_t vapi_logstart;
+extern uint64_t vapi_logend;
+extern uint64_t vapi_logptr;
+extern uint64_t vapi_status;
+
+int ui_cmd_vapirun(ui_cmdline_t *cmd,int argc,char *argv[]);
+int ui_cmd_vapitest(ui_cmdline_t *cmd,int argc,char *argv[]);
+int ui_cmd_vapishow(ui_cmdline_t *cmd,int argc,char *argv[]);
+int ui_cmd_vapidump(ui_cmdline_t *cmd,int argc,char *argv[]);
+int ui_cmd_vapistatus(ui_cmdline_t *cmd,int argc,char *argv[]);
+
+static char *rectypes[7] = {
+ "GPRS ",
+ "SOC ",
+ "DATA ",
+ "BUF ",
+ "TRC ",
+ "EXIT ",
+ "FPRS "
+};
+
+int ui_cmd_vapidump(ui_cmdline_t *cmd,int argc,char *argv[])
+{
+ uint64_t *ptr;
+ uint64_t *eptr;
+ int recnum = 0;
+
+ if (vapi_logptr == 0) {
+ xprintf("Diagnostic did not record any log records\n");
+ return -1;
+ }
+
+ ptr = (uint64_t *) (intptr_t) vapi_logstart;
+ eptr = (uint64_t *) (intptr_t) vapi_logptr;
+
+ xprintf("*** VAPI LOG START %s\n",
+#ifdef __MIPSEB
+ "big-endian"
+#else
+ "little-endian"
+#endif
+ );
+
+ while (ptr < eptr) {
+ xprintf("%6d %016llX %016llX %016llX %016llX\n",
+ recnum,
+ ptr[0],ptr[1],ptr[2],ptr[3]);
+ ptr += 4;
+ recnum++;
+ }
+
+ xprintf("*** VAPI LOG END\n");
+
+ return 0;
+
+
+}
+
+int ui_cmd_vapishow(ui_cmdline_t *cmd,int argc,char *argv[])
+{
+ uint64_t *ptr;
+ uint64_t *eptr;
+ uint32_t a,b;
+ uint32_t ts,len,fmt;
+ unsigned int idx;
+ int recnum = 0;
+
+ if (vapi_logptr == 0) {
+ xprintf("Diagnostic did not record any log records\n");
+ return -1;
+ }
+
+ ptr = (uint64_t *) (intptr_t) vapi_logstart;
+ eptr = (uint64_t *) (intptr_t) vapi_logptr;
+
+ while (ptr < eptr) {
+ a = (ptr[VAPI_IDX_SIGNATURE]) >> 32;
+ b = (ptr[VAPI_IDX_SIGNATURE]) & 0xFFFFFFFF;
+ if ((a & VAPI_SEAL_MASK) != VAPI_CFESEAL) {
+ xprintf("Incorrect record seal at %08X\n",ptr);
+ break;
+ }
+
+ fmt = (a & VAPI_FMT_MASK);
+
+ xprintf("%5d ID=%08X CPU%d %s RA=%08X ",
+ recnum,
+ b,
+ (a & VAPI_PRID_MASK) >> VAPI_PRNUM_SHIFT,
+ rectypes[fmt],
+ ptr[VAPI_IDX_RA]);
+
+ ts = (ptr[VAPI_IDX_SIZE]) >> 32;
+ len = ((ptr[VAPI_IDX_SIZE]) & 0xFFFFFFFF);
+
+ xprintf("TS=%08X ",ts);
+
+ switch (fmt) {
+ case VAPI_FMT_GPRS:
+ xprintf("Len=%d\n",len);
+ for (idx = 0; idx < len; idx += 2) {
+ xprintf(" %016llX %016llX\n",
+ ptr[VAPI_IDX_DATA+idx],
+ ptr[VAPI_IDX_DATA+idx+1]);
+ }
+ break;
+ case VAPI_FMT_SOC:
+ xprintf("Len=%d\n",len);
+ for (idx = 0; idx < len; idx += 2) {
+ xprintf(" Reg=%016llX Val=%016llX\n",
+ ptr[VAPI_IDX_DATA+idx],
+ ptr[VAPI_IDX_DATA+idx+1]);
+ }
+ break;
+ case VAPI_FMT_DATA:
+ xprintf("Data=%016llX\n",ptr[VAPI_IDX_DATA]);
+ break;
+ case VAPI_FMT_BUFFER:
+ xprintf("Addr=%08X\n",(intptr_t) ptr[VAPI_IDX_DATA]);
+ for (idx = 0; idx < len-1; idx += 2) {
+ xprintf(" %016llX %016llX\n",
+ ptr[VAPI_IDX_DATA+idx+1],
+ ptr[VAPI_IDX_DATA+idx+2]);
+ }
+ if (idx != (len-1)) {
+ xprintf(" %016llX\n",
+ ptr[VAPI_IDX_DATA+idx+1]);
+ }
+ break;
+ case VAPI_FMT_TRACE:
+ xprintf("\n");
+ break;
+ case VAPI_FMT_EXIT:
+ xprintf("Stat=%016llX\n",ptr[VAPI_IDX_DATA]);
+ break;
+ default:
+ xprintf("\n");
+ break;
+ }
+
+ ptr += 3 + len;
+ recnum++;
+ }
+
+ return 0;
+
+}
+
+int ui_cmd_vapitest(ui_cmdline_t *cmd,int argc,char *argv[])
+{
+
+ vapitest();
+
+ xprintf("LogStart=%llX LogEnd=%llX LogPtr=%llX\n",
+ vapi_logstart,vapi_logend,vapi_logptr);
+
+ return 0;
+}
+
+int ui_cmd_vapistatus(ui_cmdline_t *cmd,int argc,char *argv[])
+{
+
+ xprintf("VAPI Exit Status = <%016llX>\n", vapi_status);
+ return 0;
+}
+
+int ui_cmd_vapirun(ui_cmdline_t *cmd,int argc,char *argv[])
+{
+ int mode; /* 0 = cached, 1 = uncached, 2 = mc mode */
+
+ mode = 0;
+ if (cmd_sw_isset(cmd,"-uncached")) mode = 1;
+ if (cmd_sw_isset(cmd,"-mc")) mode = 2;
+
+ vapi_run(mode);
+ return -1;
+}
+
+
+int ui_init_vapicmds(void)
+{
+ cmd_addcmd("vapi run",
+ ui_cmd_vapirun,
+ NULL,
+ "Run a program using the VAPI reset vector.",
+ "vapi run\n"
+ "Executes a previously loaded VAPI program by resetting the\n"
+ "CPUs and jumping directly to user code. The program\n"
+ "must be located at absolute address 0x8002_0000\n",
+ "-uncached;Start execution at 0xA002_0000 (KSEG1)|"
+ "-mc;Start execution at 0xBFD0_0000");
+
+ cmd_addcmd("vapi test",
+ ui_cmd_vapitest,
+ NULL,
+ "Test VAPI interface.",
+ "vapi test\n\n"
+ "Do some basic calls to the VAPI interface, then return to CFE\n\n",
+ "");
+
+ cmd_addcmd("vapi dump",
+ ui_cmd_vapidump,
+ NULL,
+ "Show VAPI log in an easily processed format.",
+ "vapi dump\n\n"
+ "Display the VAPI log in a format that is more easily postprocessed\n"
+ "by external programs.\n\n",
+ "");
+
+ cmd_addcmd("vapi show",
+ ui_cmd_vapishow,
+ NULL,
+ "Show VAPI log.\n",
+ "vapi show\n\n"
+ "Display the VAPI log in a human readable form (sort of)\n\n",
+ "");
+
+ cmd_addcmd("vapi status",
+ ui_cmd_vapistatus,
+ NULL,
+ "Print last VAPI exit status.\n",
+ "vapi status\n\n"
+ "Display the exit status of the last VAPI program that was run\n",
+ "");
+
+ return 0;
+}
+
+#endif