Changeset df256505 in rtems


Ignore:
Timestamp:
Aug 11, 2019, 10:56:37 PM (11 days ago)
Author:
Chris Johns <chrisj@…>
Branches:
master
Children:
15b6f44d
Parents:
a4d7e4ce
Message:

libdebugger/arm: Support ROM tables.

  • Parse the ROM taables if present to find the component base for the debug hardware. This lets the RPi2 run dl09.exe.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • cpukit/libdebugger/rtems-debugger-arm.c

    ra4d7e4ce rdf256505  
    2626
    2727#define TARGET_DEBUG 0
     28
     29#define ARM_DUMP_ROM_TABLES 0
    2830
    2931#ifdef HAVE_CONFIG_H
     
    549551static size_t  arm_debug_retries;
    550552
     553static void
     554arm_debug_dump_rom_table(uint32_t* rom, size_t depth)
     555{
     556  uint32_t pidr[7];
     557  uint32_t cidr[4];
     558  uint32_t memtype;
     559  uint32_t pidr4_4KB_count;
     560  size_t   r;
     561
     562  static const char *table_class[16] = {
     563    "reserved",
     564    "ROM table",
     565    "reserved", "reserved",
     566    "reserved",
     567    "reserved",
     568    "reserved",
     569    "reserved",
     570    "reserved",
     571    "CoreSight component",
     572    "reserved",
     573    "Peripheral Test Block",
     574    "reserved",
     575    "OptimoDE DESS",
     576    "Generic IP component",
     577    "PrimeCell or System component"
     578  };
     579
     580  #define ROM_READ(b_, o_, r_) b_[((o_) / sizeof(uint32_t)) + (r_)]
     581
     582  if (depth > 16) {
     583    rtems_debugger_printf("]] rom: too deep\n");
     584    return;
     585  }
     586
     587  for (r = 0; r < 4; ++r)
     588    pidr[r] = ROM_READ(rom, 0xfe0, r) & 0xff;
     589  for (r = 0; r < 3; ++r)
     590    pidr[r + 4] = ROM_READ(rom, 0xfd0, r) & 0xff;
     591  for (r = 0; r < 4; ++r)
     592    cidr[r] = ROM_READ(rom, 0xff0, r) & 0xff;
     593  memtype = ROM_READ(rom, 0xfcc, 0);
     594
     595  pidr4_4KB_count = pidr[4] & (((1 << (7 - 4)) - 1) >> 4);
     596
     597  rtems_debugger_printf("]] rom = %p\n", rom);
     598  rtems_debugger_printf("   PIDR: %08x %08x %08x %08x %08x %08x %08x\n",
     599                        pidr[0], pidr[1], pidr[2], pidr[3],
     600                        pidr[4], pidr[5], pidr[6]);
     601  rtems_debugger_printf("   CIDR: %08x %08x %08x %08x\n",
     602                        cidr[0], cidr[1], cidr[2], cidr[3]);
     603  rtems_debugger_printf("   4KB count: %u\n", pidr4_4KB_count);
     604
     605  if ((memtype & 0x01) != 0)
     606    rtems_debugger_printf("   MEMTYPE sys memory present on bus\n");
     607  else
     608    rtems_debugger_printf("   MEMTYPE sys memory not present: dedicated debug bus\n");
     609
     610  /*
     611   * Read ROM table entries until we get 0
     612   */
     613  for (r = 0; rom[r] != 0; ++r) {
     614    uint32_t  romentry = rom[r];
     615    uint32_t  c_pidr[7];
     616    uint32_t  c_cidr[4];
     617    uint32_t* c_base;
     618    uint32_t  table_type;
     619    size_t    i;
     620
     621    c_base = (uint32_t*) ((intptr_t) rom + (romentry & 0xFFFFF000));
     622
     623    /*
     624     * Read the IDs.
     625     */
     626    for (i = 0; i < 4; ++i)
     627      c_pidr[i] = ROM_READ(c_base, 0xfe0, i) & 0xff;
     628    for (i = 0; i < 3; ++i)
     629      c_pidr[i + 4] = ROM_READ(c_base, 0xfd0, i) & 0xff;
     630    for (i = 0; i < 4; ++i)
     631      c_cidr[i] = ROM_READ(c_base, 0xff0, i) & 0xff;
     632
     633    table_type = ROM_READ(c_base, 0xfcc, 0);
     634
     635    rtems_debugger_printf("   > Base: %p, start: 0x%" PRIx32 "\n",
     636                          c_base,
     637                          /* component may take multiple 4K pages */
     638                          (uint32_t)((intptr_t) c_base - 0x1000 * (c_pidr[4] >> 4)));
     639    rtems_debugger_printf("     Class is 0x%x, %s\n",
     640                          (c_cidr[1] >> 4) & 0xf, table_class[(c_cidr[1] >> 4) & 0xf]);
     641
     642    if (((c_cidr[1] >> 4) & 0x0f) == 1) {
     643      arm_debug_dump_rom_table(c_base, depth + 1);
     644    }
     645    else if (((c_cidr[1] >> 4) & 0x0f) == 9) {
     646      const char* major = "reserved";
     647      const char* subtype = "reserved";
     648      unsigned    minor = (table_type >> 4) & 0x0f;
     649
     650      switch (table_type & 0x0f) {
     651      case 0:
     652        major = "Miscellaneous";
     653        switch (minor) {
     654        case 0:
     655          subtype = "other";
     656          break;
     657        case 4:
     658          subtype = "Validation component";
     659          break;
     660        }
     661        break;
     662      case 1:
     663        major = "Trace Sink";
     664        switch (minor) {
     665        case 0:
     666          subtype = "other";
     667          break;
     668        case 1:
     669          subtype = "Port";
     670          break;
     671        case 2:
     672          subtype = "Buffer";
     673          break;
     674        case 3:
     675          subtype = "Router";
     676          break;
     677        }
     678        break;
     679      case 2:
     680        major = "Trace Link";
     681        switch (minor) {
     682        case 0:
     683          subtype = "other";
     684          break;
     685        case 1:
     686          subtype = "Funnel, router";
     687          break;
     688        case 2:
     689          subtype = "Filter";
     690          break;
     691        case 3:
     692          subtype = "FIFO, buffer";
     693          break;
     694        }
     695        break;
     696      case 3:
     697        major = "Trace Source";
     698        switch (minor) {
     699        case 0:
     700          subtype = "other";
     701          break;
     702        case 1:
     703          subtype = "Processor";
     704          break;
     705        case 2:
     706          subtype = "DSP";
     707          break;
     708        case 3:
     709          subtype = "Engine/Coprocessor";
     710          break;
     711        case 4:
     712          subtype = "Bus";
     713          break;
     714        case 6:
     715          subtype = "Software";
     716          break;
     717        }
     718        break;
     719      case 4:
     720        major = "Debug Control";
     721        switch (minor) {
     722        case 0:
     723          subtype = "other";
     724          break;
     725        case 1:
     726          subtype = "Trigger Matrix";
     727          break;
     728        case 2:
     729          subtype = "Debug Auth";
     730          break;
     731        case 3:
     732          subtype = "Power Requestor";
     733          break;
     734        }
     735        break;
     736      case 5:
     737        major = "Debug Logic";
     738        switch (minor) {
     739        case 0:
     740          subtype = "other";
     741          break;
     742        case 1:
     743          subtype = "Processor";
     744          break;
     745        case 2:
     746          subtype = "DSP";
     747          break;
     748        case 3:
     749          subtype = "Engine/Coprocessor";
     750          break;
     751        case 4:
     752          subtype = "Bus";
     753          break;
     754        case 5:
     755          subtype = "Memory";
     756        }
     757        break;
     758      case 6:
     759        major = "Perfomance Monitor";
     760        switch (minor) {
     761        case 0:
     762          subtype = "other";
     763          break;
     764        case 1:
     765          subtype = "Processor";
     766          break;
     767        case 2:
     768          subtype = "DSP";
     769          break;
     770        case 3:
     771          subtype = "Engine/Coprocessor";
     772          break;
     773        case 4:
     774          subtype = "Bus";
     775          break;
     776        case 5:
     777          subtype = "Memory";
     778          break;
     779        }
     780        break;
     781      }
     782
     783      rtems_debugger_printf("     Type: 0x%02" PRIx32 ", %s, %s\n",
     784                            table_type & 0xff, major, subtype);
     785      rtems_debugger_printf("     PID[4..0]: %02x %02x %02x %02x %02x\n",
     786                            c_pidr[4], c_pidr[3], c_pidr[2], c_pidr[1], c_pidr[0]);
     787
     788      if (((c_cidr[1] >> 4) & 0x0f) == 1) {
     789        arm_debug_dump_rom_table(c_base, depth + 1);
     790      }
     791    }
     792  }
     793}
     794
     795static int
     796arm_debug_rom_discover(uint32_t* rom, uint32_t comp, uint32_t** addr, int* index)
     797{
     798  size_t r = 0;
     799  *addr = 0;
     800  while ((rom[r] & 1) != 0) {
     801    uint32_t* c_base = (uint32_t*) ((intptr_t) rom + (rom[r] & 0xfffff000));
     802    uint32_t  c_cid1 = c_base[0xff4 / sizeof(uint32_t)];
     803    uint32_t  type;
     804    if (((c_cid1 >> 4) & 0x0f) == 1) {
     805      if (arm_debug_rom_discover(c_base, comp, addr, index))
     806        return true;
     807    }
     808    type = c_base[0xfcc / sizeof(uint32_t)] & 0xff;
     809    if (comp == type) {
     810      if (*index > 0)
     811        --(*index);
     812      else {
     813        *addr = c_base;
     814        return true;
     815      }
     816    }
     817    ++r;
     818  }
     819  return false;
     820}
     821
    551822static int
    552823arm_debug_mmap_enable(rtems_debugger_target* target, uint32_t dbgdidr)
    553824{
    554   uint32_t rom;
    555825  uint32_t val;
    556826  void*    abort_handler;
     
    563833
    564834  /*
    565    * The DBGDSAR is a signed offset from DBGDRAR. Both need to be
    566    * valid for the debug register address to be valid. Currently there
    567    * is no support to decode a ROM table.
     835   * The DBGDSAR (DSAR) is a signed offset from DBGDRAR. Both need to
     836   * be valid for the debug register address to be valid. Read the
     837   * DBGRAR first.
    568838   */
    569   ARM_CP14_READ(rom, 1, 0, 0);
    570   if ((rom & 3) == 3) {
    571     ARM_CP14_READ(val, 2, 0, 0);
    572     if ((val & 3) == 3 ) {
    573       debug_registers = (void*) ((rom & ~3) + ((int32_t) (val & ~3)));
     839  ARM_CP14_READ(val, 1, 0, 0);
     840  if ((val & 3) == 3) {
     841    uint32_t* rom = (uint32_t*) (val & 0xfffff000);
     842    uint32_t* comp_base = NULL;
     843    int       core = (int) _SMP_Get_current_processor();
     844
     845    if (ARM_DUMP_ROM_TABLES)
     846      arm_debug_dump_rom_table(rom, 0);
     847
     848    debug_registers = NULL;
     849
     850    if (arm_debug_rom_discover(rom, 0x15, &comp_base, &core)) {
     851      debug_registers = comp_base;
     852      rtems_debugger_printf("rtems-db: ram debug: ROM Base: %p\n", comp_base);
     853    } else {
     854      ARM_CP14_READ(val, 2, 0, 0);
     855      if ((val & 3) == 3 ) {
     856        debug_registers = (void*) ((intptr_t) rom + (val & ~3));
     857      }
    574858    }
    575859  }
     
    581865      return -1;
    582866    }
     867    rtems_debugger_printf("rtems-db: arm debug: BSP Base: %p\n", debug_registers);
    583868  }
    584869
Note: See TracChangeset for help on using the changeset viewer.