📄 cst_pei.c
字号:
*info = (T_PEI_INFO *)&pei_info;
return PEI_OK;
}
/*
+--------------------------------------------------------------------+
| PROJECT : XXX MODULE : CST_PEI |
| STATE : code ROUTINE : cst_tok_init |
+--------------------------------------------------------------------+
PURPOSE : Initialize token scanner.
*/
static void cst_tok_init (char * s, TOK_DCB *dcb, char *buf, int buf_len)
{
int i;
dcb->nexttok = dcb->tokbuf = buf;
// can't use strcpy since it stops at 0s
for (i=0; i<buf_len-1; i++)
{
dcb->tokbuf[i] = s[i];
}
dcb->tokbuf[buf_len-1] = '\0';
dcb->lastchar = 0;
}
/*
+--------------------------------------------------------------------+
| PROJECT : XXX MODULE : CST_PEI |
| STATE : code ROUTINE : cst_get_values |
+--------------------------------------------------------------------+
*/
static SHORT cst_get_values(TOK_DCB *dcb, char *value[])
{
char * val; /* not identifier, so thrown away */
/*
* Check next token
*/
switch (cst_tok_gettok (dcb, &val))
{
/*
* No value present
*/
case COMMA:
return (0);
/*
* Value(s) follows
*/
case EQUAL:
return (cst_tok_value (dcb, value));
/*
* No value present and EOS
*/
case EOS:
dcb->nexttok = NULL;
return (0);
/*
* Syntax error
*/
default:
dcb->nexttok = NULL;
return (TOK_EOCS);
}
}
/*
+--------------------------------------------------------------------+
| PROJECT : XXX MODULE : CST_PEI |
| STATE : code ROUTINE : cst_tok_value |
+--------------------------------------------------------------------+
*/
static SHORT cst_tok_value (TOK_DCB *dcb, char * value [])
{
SHORT count;
SHORT tok;
SHORT inbrack;
char * val;
char * val2;
inbrack = 0;
/*
* Get next token
*/
tok = cst_tok_gettok (dcb, &val);
switch (tok)
{
case LBRACK:
inbrack++;
break;
case IDENT :
case STRING :
tok = cst_tok_gettok (dcb, &val2); /* val2 ignored since next tok */
if ((tok == COMMA) || (tok == EOS)) /* shouldn't be an IDENT */
{
/* just single value, return */
value[0] = val;
return (1);
}
else
{
/* error */
dcb->nexttok = NULL;
return (0);
}
case EOS :
default :
dcb->nexttok = NULL;
return (0);
}
/*
* Get first token of list
*/
tok = cst_tok_gettok (dcb, &val);
count = 0;
while (1)
{
if ((tok == IDENT) || (tok == STRING))
{
value[count++] = val;
}
else
{
dcb->nexttok = NULL;
return (0);
}
tok = cst_tok_gettok (dcb, &val);
switch (tok)
{
case COMMA:
break;
case RBRACK :
if (inbrack)
{
if (((tok = cst_tok_gettok (dcb, &val)) == COMMA) ||
(tok == EOS))
{
return (count);
}
}
/*
* Fall through
*/
default:
dcb->nexttok = NULL;
return (0);
}
tok = cst_tok_gettok (dcb, &val);
}
return (0);
}
/*
+--------------------------------------------------------------------+
| PROJECT : XXX MODULE : CST_PEI |
| STATE : code ROUTINE : cst_tok_gettok |
+--------------------------------------------------------------------+
PURPOSE : Get list of values for token.
Return number of values found.
Formats: Value
(Value)
(Value, Value,...)
()
*/
static SHORT cst_tok_gettok (TOK_DCB *dcb, char ** token)
{
SHORT tok;
/* if previous token was IDENT, a '\0' was placed afterwards
* for string processing and the overwritten character was
* placed in lastchar. We now replace this character.
*/
if (dcb->lastchar)
{
*(dcb->nexttok) = dcb->lastchar;
dcb->lastchar = 0;
}
/*
* Skip leading white space
*/
while (isspace (*(dcb->nexttok)))
{
dcb->nexttok++;
}
* token = dcb->nexttok++;
switch (** token)
{
case '\0': /* End of string */
case '\n':
tok = EOS;
break;
case ',':
** token = '\0';
tok = COMMA;
break;
case '=':
** token = '\0';
tok = EQUAL;
break;
case '(':
case '<':
case '[':
** token = '\0';
tok = LBRACK;
break;
case ')':
case '>':
case ']':
** token = '\0';
tok = RBRACK;
break;
case '"':
/*
* Get first char of string
*/
* token = dcb->nexttok;
while ((*(dcb->nexttok) != '\0') && (*(dcb->nexttok) != '"'))
{
dcb->nexttok++;
}
if (*(dcb->nexttok) != '\0')
{
*(dcb->nexttok++) = '\0';
}
tok = STRING;
break;
default:
/*
* Read an identifier
*/
while ( !cst_tok_issep (*(dcb->nexttok)) )
{
dcb->nexttok++;
}
dcb->lastchar = *(dcb->nexttok);
*(dcb->nexttok) = '\0';
if (*token == dcb->nexttok)
{
/* no characters in identifier. Error in code! */
tok = ERROR;
}
else
{
tok = IDENT;
}
break;
}
return (tok);
}
/*
+--------------------------------------------------------------------+
| PROJECT : XXX MODULE : CST_PEI |
| STATE : code ROUTINE : cst_tok_issep |
+--------------------------------------------------------------------+
PURPOSE : Return 1 if special character.
*/
static SHORT cst_tok_issep (char c)
{
switch (c)
{
case '\0' :
case '\n' :
case ',' :
case '=' :
case '(' :
case '<' :
case '[' :
case ')' :
case '>' :
case ']' :
case '"' : return (1);
default : return (isspace (c));
}
}
/* if string in tokenizer state has unprocessed tokens return 1 */
/*
+--------------------------------------------------------------------+
| PROJECT : XXX MODULE : CST_PEI |
| STATE : code ROUTINE : cst_tokenizer_has_more_data |
+--------------------------------------------------------------------+
PURPOSE : Return 1 if string in tokenizer state has unprocessed tokens.
*/
static int cst_tokenizer_has_more_data(const TOK_DCB *dcb)
{
return (dcb->nexttok != NULL);
}
/*
+--------------------------------------------------------------------+
| PROJECT : XXX MODULE : CST_PEI |
| STATE : code ROUTINE : cst_getbyte |
+--------------------------------------------------------------------+
*/
static int cst_getbyte(TOK_DCB *dcb)
{
if (dcb->nexttok)
{
return *(dcb->nexttok++);
}
else
{
return -1;
}
}
/*
+--------------------------------------------------------------------+
| PROJECT : XXX MODULE : CST_PEI |
| STATE : code ROUTINE : cst_gsm_parameters |
+--------------------------------------------------------------------+
*/
int cst_gsm_parameters(TOK_DCB *dcb)
{
unsigned char id;
char str[80];
int i;
// STRIP FIRST TWO DELIMITERS
{
char *tok_string;
if (cst_tok_gettok(dcb, &tok_string) != EQUAL)
{
return (0);
}
if (cst_tok_gettok(dcb, &tok_string) != LBRACK)
{
return (0);
}
}
// GET CONTROL ID
if ((id = cst_getbyte(dcb)) == -1)
{
// vsi_o_trace("CST", 0x08, "gsm_parameters() parser error: out of bytes");
return (0);
}
// STACK TRACE
else if (id == '1')
{
CST_stack_trace();
} //end else if (id == '1')
// Crash Me
else if (id == '2')
{
// No instruction before setting the reset vector
void (*reset_vector)() = (void (*)()) 0x3000000;
(*reset_vector)();
} //end else if (id == '2')
#if defined (ALR)
// Print Reg Copy
else if (id == '3')
{
extern int xdump_buffer;
int *xp = &xdump_buffer;
int magic_word;
// displays the 16 User mode 32bits registers saved on exception
// vsi_o_trace("CST", 0x08, "User mode registers [r0-r15] = ...");
for (i=0; i<4; i++)
{
sprintf(str, "%08x %08x %08x %08x", *(xp++), *(xp++),
*(xp++), *(xp++));
// vsi_o_trace("CST", 0x08, str);
}
// displays the User mode CPSR saved on exception
sprintf(str, "User mode CPSR = %08x", *(xp++));
// vsi_o_trace("CST", 0x08, str);
// displays the magic word and the index of vector taken
magic_word = *(xp++);
sprintf(str, "Magic Word + Index of Vector = %08x", magic_word);
// vsi_o_trace("CST", 0x08, str);
// displays the cause of the exception
magic_word &= 0x000F;
switch (magic_word) {
case 1:
// vsi_o_trace("CST", 0x08, "Exception: Undefined Instruction");
break;
case 2:
// vsi_o_trace("CST", 0x08, "Exception: Unexpected Software Interrupt");
break;
case 3:
// vsi_o_trace("CST", 0x08, "Exception: Abort Prefetch");
break;
case 4:
// vsi_o_trace("CST", 0x08, "Exception: Abort Data");
break;
case 5:
// vsi_o_trace("CST", 0x08, "Exception: Reserved");
break;
default:
break;
}
// displays the bottom 20 words of user mode stack saved on exception
// vsi_o_trace("CST", 0x08, "Bottom 20 words of User mode stack = ...");
for (i=0; i<5; i++)
{
sprintf(str, "%08x %08x %08x %08x", *(xp++), *(xp++),
*(xp++), *(xp++));
// vsi_o_trace("CST", 0x08, str);
}
} //end else if (id == '3')
// Clear Reg Copy
else if (id == '4')
{
extern int xdump_buffer;
int *xp = &xdump_buffer;
// Clears the 38 32bits registers saved on exception
for (i=0; i<38; i++)
{
*(xp+i) = 0;
}
// vsi_o_trace("CST", 0x08, "Registers Copy cleared ...");
} //end else if (id == '4')
#endif
#if (OP_WCP == 1)
#if (WCP_PROF == 1)
// Enable/disable MC profiler
else if (id == '5')
{
PR_EnableProfiler(0);
}
else if (id == '6')
{
PR_EnableProfiler(1);
power_down_config(0, 0x5ff); // disable sleep, which interferes with profiler
}
// Enable/disable CPU Meter
else if (id == '7')
{
PR_EnableCpuMeter(0);
}
else if (id == '8')
{
PR_EnableCpuMeter(1);
power_down_config(0, 0x5ff); // disable sleep, which interferes with CPU meter
}
#endif
#endif
// STRIP LAST DELIMITER
{
char *tok_string;
if (cst_tok_gettok(dcb, &tok_string) != RBRACK)
{
return (0);
}
}
} // end cst_gsm_parameters
/*
* Reach here if unexpected event occurs (e.g. Undefined instruction, Abort,
* out of memory); choose whether to restart or stay in datadump mode to find
* out cause of problem
*/
void exception_handler(void)
{
void (*jump_address)() = (void (*)()) ((unsigned)0x0);
(*jump_address)();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -