Suporte a RTOS do tipo MitM no GDB

Pensei por um longo tempo se é possível republicar um artigo sobre Habré, estudei as regras, parece que agora não é proibido. Se eu cometer um erro, vou corrigi-lo :)


Assim...


Há algum tempo, escrevi o código de firmware para os Epiphan grabbers da linha AV.io:


  • AV.io HD - nosso piloto, no qual muita coisa foi depurada e formada arquitetura
  • AV.io SDI - fixando posições
  • AV.io 4K - novo hardware e novas abordagens, agora lançamos quase instantaneamente
  • KVM2USB 3.0 - Um profundo repensar do AV.io HD . De fato, graças ao potencial de modernização do modelo básico, praticamente sem modificações de hardware, eles conseguiram criar um novo produto apenas com software.

O Cypress FX3 estava envolvido lá , e o SDK foi construído sobre o ThreadX. Você pode usar o Olimex ARM-USB-OCD-H em conjunto com o OpenOCD como um depurador JTAG . Infelizmente, o OpenOCD não sabe nada sobre threads no RTOS e, embora o suporte básico esteja presente no código, especificamente para o nosso processador, usamos um esquema de empilhamento de registros que era diferente do que já havia sido implementado. Eu tive que entender e modificar . Os lucros do uso do JTAG para desenvolvimento dificilmente podem ser superestimados, pelo menos no caso de trabalho distribuído .


Então o tempo está acabando. Agora é a vez do FPG do Xilinx e seu processador de software MicroBlaze, onde você pode executar a versão 10.x do FreeRTOS portada. Mas o problema é exatamente o mesmo: não há suporte para threads no depurador!


XSDK


Xilinx ARM Cortex-A53, ARM Cortex-R5 MicroBlaze. MicroBlaze — , FPGA. .


( CPU, FPGA, — Vivado) — XSDK ( 2020 Vitis), Eclipse. FPGA . , JTAG ( OpenOCD!) , . : , , .


, Eclipse, , — XSTC. . .


.


JTAG hw_server. TCP , — 3121, , , 3000 — GDB :


  • N+0 (3000) — ARM Cortex-A53
  • N+1 (3001) — ARM Cortex-R5
  • N+2 (3002) — MicroBlaze ( )

-, .


, . , . , ( !) — System Debugger GDB. MicroBlaze GDB — mb-gdb.


System Debugger . , Xilinx GDB — .


,


, RTOS OpenOCD, , , :


  1. RTOS TCB (Thread Control Block), , . . ( ) — Reverse Engineering! : , , .
  2. RTOS — . , , . , , — . .. . — .
  3. 1 — TCB ( — RTOS).

, GDB GDB , info threads info registers thread N bt.


, RTOS , , RTOS ( , SDK , ). , .


: . . p , , . , ThreadX Cypress FX3. , . — .


… GDB-client GDB-server , , , MitM ""? , , , , ?


, : . gdbproxy , .


— . C++ ( , , ), Asio, C++17 , , C++2a — , , , 100%, 90% !


,


, — . . Asio , . . .


: . TCB, . … GDB- . . … ! — . , , ( — ) : qSymbol::, : - ? — . — , . qSymbol:NAME, qSymbol:ADDR:NAME qSymbol::NAME , nullptr. - ( , — ) , .


. , , , , — … , !


.. , .


, : , . .


, . . (SMP , ) — . GDB ( ) — : . .


, GDB-client . , . : - , - SP (Stack Pointer) FP (Frame Pointer) . , .


: Set Current Thread ( OK EXX — XX — , ), . RTOS, , , . , — . — Current Execution? : — . , . ! . Set Current Thread Set Current Thread , xxxxxxxx , — ! , RTOS , Set Current Thread , Set Current Thread . : . .


, SP : TCB . SP , .


, . . Stop Reply Packets. , . , breakpoint, watchpoint Break ( , , 0x03 Stop Reply Packet). , , . Stop Reply Packet, . . Stop Reply Packets : vCont c — Continue s — Step ( ).


. , , .


, , . : . — . GDB. MicroBlaze GDB microblaze-tdep.h enum microblaze_regnum:


enum microblaze_regnum
{
  MICROBLAZE_R0_REGNUM,
  MICROBLAZE_R1_REGNUM, MICROBLAZE_SP_REGNUM = MICROBLAZE_R1_REGNUM,
  MICROBLAZE_R2_REGNUM,
  MICROBLAZE_R3_REGNUM, MICROBLAZE_RETVAL_REGNUM = MICROBLAZE_R3_REGNUM,
  MICROBLAZE_R4_REGNUM,
  MICROBLAZE_R5_REGNUM, MICROBLAZE_FIRST_ARGREG = MICROBLAZE_R5_REGNUM,
  MICROBLAZE_R6_REGNUM,
  MICROBLAZE_R7_REGNUM,
  MICROBLAZE_R8_REGNUM,
  MICROBLAZE_R9_REGNUM,
  MICROBLAZE_R10_REGNUM, MICROBLAZE_LAST_ARGREG = MICROBLAZE_R10_REGNUM,
  MICROBLAZE_R11_REGNUM,
  MICROBLAZE_R12_REGNUM,
  MICROBLAZE_R13_REGNUM,
  MICROBLAZE_R14_REGNUM,
  MICROBLAZE_R15_REGNUM,
  MICROBLAZE_R16_REGNUM,
  MICROBLAZE_R17_REGNUM,
  MICROBLAZE_R18_REGNUM,
  MICROBLAZE_R19_REGNUM,
  MICROBLAZE_R20_REGNUM,
  MICROBLAZE_R21_REGNUM,
  MICROBLAZE_R22_REGNUM,
  MICROBLAZE_R23_REGNUM,
  MICROBLAZE_R24_REGNUM,
  MICROBLAZE_R25_REGNUM,
  MICROBLAZE_R26_REGNUM,
  MICROBLAZE_R27_REGNUM,
  MICROBLAZE_R28_REGNUM,
  MICROBLAZE_R29_REGNUM,
  MICROBLAZE_R30_REGNUM,
  MICROBLAZE_R31_REGNUM,
  MICROBLAZE_PC_REGNUM,
  MICROBLAZE_MSR_REGNUM,
  MICROBLAZE_EAR_REGNUM,
  MICROBLAZE_ESR_REGNUM,
  MICROBLAZE_FSR_REGNUM,
  MICROBLAZE_BTR_REGNUM,
  MICROBLAZE_PVR0_REGNUM,
  MICROBLAZE_PVR1_REGNUM,
  MICROBLAZE_PVR2_REGNUM,
  MICROBLAZE_PVR3_REGNUM,
  MICROBLAZE_PVR4_REGNUM,
  MICROBLAZE_PVR5_REGNUM,
  MICROBLAZE_PVR6_REGNUM,
  MICROBLAZE_PVR7_REGNUM,
  MICROBLAZE_PVR8_REGNUM,
  MICROBLAZE_PVR9_REGNUM,
  MICROBLAZE_PVR10_REGNUM,
  MICROBLAZE_PVR11_REGNUM,
  MICROBLAZE_REDR_REGNUM,
  MICROBLAZE_RPID_REGNUM,
  MICROBLAZE_RZPR_REGNUM,
  MICROBLAZE_RTLBX_REGNUM,
  MICROBLAZE_RTLBSX_REGNUM,
  MICROBLAZE_RTLBLO_REGNUM,
  MICROBLAZE_RTLBHI_REGNUM,
  MICROBLAZE_SLR_REGNUM, MICROBLAZE_NUM_CORE_REGS = MICROBLAZE_SLR_REGNUM,
  MICROBLAZE_SHR_REGNUM,
  MICROBLAZE_NUM_REGS
};

, . - , , 00000000 xxxxxxxx, — , — : unavail. — . , qFeatures (TBD: !) , — .


, ?


: https://github.com/h4tr3d/gdbproxy/


, BSD MIT. OpenOCD (, : , , , ). .


: . , , RTOS, . . .


?


XSDK:


  1. — GDB , System Debugger
  2. GDB, 4002 ( gdbproxy, )
  3. gdbproxy, XSDK hw_server :
    ./gdbproxy --port 4002 --remote-host localhost --remote-port 3002 -- mb_freertos
  4. ...
  5. PROFIT!

No caso de usar o controle remoto hw_server, devido à pequena flexibilidade da configuração do XSDK, ele gdbproxydeve ser executado na mesma máquina que hw_server.


achados


Nenhum. Apenas a linha inferior: é suportado o encadeamento no FreeRTOS e MicroBlaze.


All Articles