Как сбросить регистры ARM-сопроцессора с помощью gdb? - PullRequest
4 голосов
/ 24 декабря 2011

Есть ли способ вывести регистры сопроцессора ARM (в частности, CP15 sctlr) из gdb?Я использую набор инструментов из кода-источника (arm-none-linux-gnueabi-) и отлаживаю linux, работающий на QEMU.

Один из способов - сбросить использованный GPR до / после инструкций mcr / mrc.Есть ли другой способ?

1 Ответ

2 голосов
/ 01 января 2012

Насколько я знаю, GDB / ARM не сможет показать эту информацию ... но отладка qemu может помочь вам (при условии, что вы можете скомпилировать / отладить qemu с его отладочной информацией):

  1. Подключите GDB (определенный i686, но не ARM) к вашему qemu процессу
  2. Посмотрите на этот файл: qemu / target-arm / cpu.h
  3. Проверьте что-то вроде env->cp15 или gdbserver_state->g_cpu->cp15 *:

    struct {
    uint32_t c0_cachetype;
    uint32_t c0_ccsid[16]; /* Cache size.  */
    uint32_t c0_clid; /* Cache level.  */
    uint32_t c0_cssel; /* Cache size selection.  */
    uint32_t c0_c1[8]; /* Feature registers.  */
    uint32_t c0_c2[8]; /* Instruction set registers.  */
    uint32_t c1_sys; /* System control register.  */
    uint32_t c1_coproc; /* Coprocessor access register.  */
    uint32_t c1_xscaleauxcr; /* XScale auxiliary control register.  */
    uint32_t c2_base0; /* MMU translation table base 0.  */
    uint32_t c2_base1; /* MMU translation table base 1.  */
    uint32_t c2_control; /* MMU translation table base control.  */
    uint32_t c2_mask; /* MMU translation table base selection mask.  */
    uint32_t c2_base_mask; /* MMU translation table base 0 mask. */
    uint32_t c2_data; /* MPU data cachable bits.  */
    uint32_t c2_insn; /* MPU instruction cachable bits.  */
    uint32_t c3; /* MMU domain access control register
                    MPU write buffer control.  */
    uint32_t c5_insn; /* Fault status registers.  */
    uint32_t c5_data;
    uint32_t c6_region[8]; /* MPU base/size registers.  */
    uint32_t c6_insn; /* Fault address registers.  */
    uint32_t c6_data;
    uint32_t c9_insn; /* Cache lockdown registers.  */
    uint32_t c9_data;
    uint32_t c13_fcse; /* FCSE PID.  */
    uint32_t c13_context; /* Context ID.  */
    uint32_t c13_tls1; /* User RW Thread register.  */
    uint32_t c13_tls2; /* User RO Thread register.  */
    uint32_t c13_tls3; /* Privileged Thread register.  */
    uint32_t c15_cpar; /* XScale Coprocessor Access Register */
    uint32_t c15_ticonfig; /* TI925T configuration byte.  */
    uint32_t c15_i_max; /* Maximum D-cache dirty line index.  */
    uint32_t c15_i_min; /* Minimum D-cache dirty line index.  */
    uint32_t c15_threadid; /* TI debugger thread-ID.  */
    } cp15;
    

* Я не уверен в точном местоположении, только некоторые предположения, основанные на qemu / gdbstub.c , но я не могу на самом деле проверить его.

...