Prise en charge RTOS de type MitM dans GDB

J'ai longtemps pensé s'il était possible de republier un article sur Habré, j'ai étudié les règles, il semble que maintenant ce n'est plus interdit. Si j'ai fait une erreur, je vais la corriger :)


Donc...


Il y a quelque temps, j'ai écrit le code du firmware pour les grabber Epiphan de la ligne AV.io:


  • AV.io HD - notre pilote, sur lequel beaucoup a été débogué et formé l'architecture
  • AV.io SDI - fixation des positions
  • AV.io 4K - déjà un nouveau matériel et de nouvelles approches, nous lançons maintenant presque instantanément
  • KVM2USB 3.0 - Une profonde refonte d' AV.io HD . En effet, grâce au potentiel de modernisation du modèle de base, sans pratiquement aucune modification matérielle, ils ont pu réaliser un nouveau produit purement logiciel.

Cypress FX3 y était impliqué et le SDK a été construit sur ThreadX. En tant que débogueur JTAG, vous pouvez utiliser Olimex ARM-USB-OCD-H en conjonction avec OpenOCD . Malheureusement, OpenOCD ne sait rien des threads dans RTOS, et bien que le support de base soit présent dans le code, spécifiquement pour notre processeur, un schéma d'empilement de registres a été utilisé, qui était différent de ce qui était déjà implémenté. Je devais comprendre et modifier . Les bénéfices tirés de l'utilisation de JTAG pour le développement ne peuvent guère être surestimés, du moins dans le cas du travail distribué .


Le temps presse donc. Maintenant, c'est au tour du FPGA de Xilinx et de son processeur logiciel MicroBlaze, où vous pouvez exécuter la version 10.x de FreeRTOS portée. Mais le problème est exactement le même: il n'y a pas de support pour les threads dans le débogueur!


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!

Dans le cas de l'utilisation de la télécommande hw_server, en raison de la faible flexibilité de la configuration XSDK, elle gdbproxydoit être exécutée sur la même machine que hw_server.


résultats


Aucun. Juste l'essentiel: le filetage sur FreeRTOS et MicroBlaze est pris en charge.


All Articles