[PATCH v3] cpukit/aarch64: Add ESR register decoding

Alex White alex.white at oarcorp.com
Mon Mar 22 20:43:58 UTC 2021


On Mon, Mar 22, 2021 at 2:33 PM Joel Sherrill <joel at rtems.org> wrote:
>> +static const char* _exception_class_to_string( uint16_t exception_class )
>> +{
>> +  switch (exception_class)
>> +  {
>> +  case 0b000001: return "Trapped WFI or WFE instruction";
>> +  case 0b000011: return "Trapped MCR or MRC access with (coproc==0b1111)";
>> +  case 0b000100: return "Trapped MCRR or MRRC access with (coproc==0b1111)";
>> +  case 0b000101: return "Trapped MCR or MRC access with (coproc==0b1110)";
>> +  case 0b000110: return "Trapped LDC or STC access";
>> +  case 0b001100: return "Trapped MRRC access with (coproc==0b1110)";
>> +  case 0b001110: return "Illegal Execution state";
>> +  case 0b011000: return "Trapped MSR, MRS, or System instruction";
>> +  case 0b100000: return "Instruction Abort from a lower Exception level";
>> +  case 0b100001: return "Instruction Abort taken without a change in Exception "
>> +                        "level";
>> +  case 0b100010: return "PC alignment fault";
>> +  case 0b100100: return "Data Abort from a lower Exception level";
>> +  case 0b100101: return "Data Abort taken without a change in Exception level";
>> +  case 0b100110: return "SP alignment fault";
>> +  case 0b110000: return "Breakpoint exception from a lower Exception level";
>> +  case 0b110001: return "Breakpoint exception taken without a change in "
>> +                        "Exception level";
>> +  case 0b110010: return "Software Step exception from a lower Exception level";
>> +  case 0b110011: return "Software Step exception taken without a change in "
>> +                        "Exception level";
>> +  case 0b110100: return "Watchpoint exception from a lower Exception level";
>> +  case 0b110101: return "Watchpoint exception taken without a change in "
>> +                        "Exception level";
>> +  case 0b111000: return "BKPT instruction execution in AArch32 state";
>> +  case 0b111100: return "BRK instruction execution in AArch64 state";
>
>
> Before someone else asks...
>
> (1) Are binary constants standard C? The stackover flow discussion I found
> says they are a GNU extension which puts them off-limits.

No, it doesn't look like they are. Darn. I'll switch to hex.

> (2). These appear to be 6 bits and there is nothing ensuring only those six 
> bits are set before the switch. Is there a chance other bits could be set 
> messing up this switch?

Currently, no, there is no chance other bits could be set. This function is only called from one place, and the argument is bitwise AND-ed with 0x3f before being passed in.

>> +static void _binary_sprintf(
>> +  char *s,
>> +  size_t maxlen,
>> +  uint32_t num_bits,
>> +  uint32_t value
>> +)
>> +{
>> +  string_context sctx = {
>> +    .s = s,
>> +    .n = maxlen
>> +  };
>> +  uint32_t mask = 1<<(num_bits-1);
>> +  int cx = 0;
>> +
>> +  while ( mask != 0 ) {
>> +    cx += _IO_Printf(put_char, &sctx, "%d", (value & mask ? 1 : 0));
>> +    //cx += snprintf(s + cx, maxlen - cx, "%d", (value&mask ? 1 : 0));
>
>
> Commented out.

Will fix.

Alex


More information about the devel mailing list