Spørgsmål:
ARM bx-instruktion forgrener sig til adresse, der ikke er angivet som argument
RemarkableBucket
2020-06-09 10:10:22 UTC
view on stackexchange narkive permalink

Jeg debugger en ARM cortex M4 (STM32F4), der kører FreeRTOS. Inde i forsamlingen FreeRTOS-funktion vPortSVCHandler er der en filialinstruktion

  bx r14  

ved hjælp af GDB går jeg igennem instruktion ved instruktion og finder ud af, at r14 (lr) indeholder værdien 0xfffffffd (ikke en gyldig adresse) umiddelbart før bx-instruktionen udføres.

Af en eller anden grund følger GDB ikke instruktionen bx med si (hænger), men jeg kan stadig trin via openOCD. Jeg finder ud af, at den funktion, der er forgrenet til, faktisk er en gyldig funktion på adressen 0x08012abc.

Fra ARM-dokumenterne på bx skal dens argument være et register, der indeholder en adresse at forgrene sig til.

Det er klart, jeg misforstår eller ser på de forkerte dokumenter.

Jeg prøvede at tilpasse lr med GDB lige før filialinstruktionen. Ændring af det til 0x0 eller 0xfffffff7 resulterer i en hård fejl kort efter filialen.

Hvordan fungerer denne greninstruktion, når den kaldes med en værdi på 0xfffffffd , resultere i forgrening til en gyldig funktion på 0x08102abc ?

En svar:
Igor Skochinsky
2020-06-09 11:08:56 UTC
view on stackexchange narkive permalink

Værdier omkring FFFFFFFF bruges i Cortex-M til undtagelsesretur (ECX_RETURN). Aktuelt definerede værdier:

  1. 0xFFFFFFF1 - vende tilbage til Handler-tilstand, gendanne tilstand fra hovedstakken

  2. 0xFFFFFFF9 - vende tilbage til trådtilstand, gendan tilstand fra hovedstak

  3. 0xFFFFFFFD - vende tilbage til trådtilstand, gendan tilstand fra processtak

Så den aktuelle gren adresse er taget fra stakken (MSP eller PSP, afhængigt af de lave bit af værdien). Se det sammenkædede dokument for flere detaljer.

Da GDB for det meste bruges til fejlfinding i brugertilstand, forventer den ikke sådanne shenanigans og forsøger sandsynligvis at indstille et breakpoint til værdien af ​​ LR , som naturligvis fejler. OpenOCD kender til undtagelser og er i stand til at træde ordentligt.



Denne spørgsmål og svar blev automatisk oversat fra det engelske sprog.Det originale indhold er tilgængeligt på stackexchange, som vi takker for den cc by-sa 4.0-licens, den distribueres under.
Loading...