Forum: Digitale Signalverarbeitung / DSP / Machine Learning Vermutliches TMS320C6xx-Binary disassemblieren


von Nikolaus S. (Firma: Golden Delicious Computers) (hns)


Angehängte Dateien:

Lesenswert?

Seit Jahren versucht ein kleiner Kreis Interessierter den im OMAP4/OMAP5 
von TI (https://www.ti.com/lit/po/swpt034b/swpt034b.pdf) eingebetteten 
Audio-Signalprozessor zu verstehen. Sehr wahrscheinlich handelt es sich 
um einen TMS320C64x oder C66x oder ein Derivat aber das ist nicht ganz 
klar und nirgends verlässlich dokumentiert.

Bekannt ist der Firmwarecode, der von Linux beim booten in den 
Sound-Prozessor (AE = Audio Engine) geladen wird. Dieser ist als C-File 
mit eingebettetem Hex-Code verfügbar (ABE = Audio Backend): 
https://github.com/omap-audio/abefw/blob/master/fw/009590/abe_firmware.c

Wenn man das übersetzt und lädt, kann man aus dem AESS-Subsystem und dem 
debugfs die angehängte Binärdatei (pmem = program memory) zurücklesen. 
Diese enthält sicherlich die Signalverarbeitungsroutinen, 
Filterparameter und Code, der die Verbindung zu den Interfaces steuert.

Eigene Versuche mit capstone (tms320x64x) haben bisher zu keinen 
verständlichen Ergebnissen geführt.

Sieht hier ein DSP/TMS320-Spezialist eine Chance diese angehängte Datei 
so zu disassemblieren, dass man das das C-File durch einen echten 
Source-Code (natürlich für einen geeigneten Assembler) ersetzen und ggf. 
modifizieren kann? Kann man aus dem Code herausfinden, welcher 
Signalprozessorbefehlssatz das wirklich ist? Wer kennt/hat geeignete 
Tools und Erfahrungen mit TMS320-Architektur und Befehlssatz und würde 
sich daran versuchen wollen?

: Bearbeitet durch User
von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Nikolaus S. schrieb:

> Kann man aus dem Code herausfinden, welcher
> Signalprozessorbefehlssatz das wirklich ist?

Eher nur im Ausschlußverfahren, also man könnte zumindest verifizieren, 
ob das wirklich TMS320-Code ist.

> Wer kennt/hat geeignete
> Tools und Erfahrungen mit TMS320-Architektur und Befehlssatz und würde
> sich daran versuchen wollen?

Das wirst du nicht bezahlen wollen...

von Nikolaus S. (Firma: Golden Delicious Computers) (hns)


Lesenswert?

Ob S. schrieb:
> Nikolaus S. schrieb:
>
>> Kann man aus dem Code herausfinden, welcher
>> Signalprozessorbefehlssatz das wirklich ist?
>
> Eher nur im Ausschlußverfahren, also man könnte zumindest verifizieren,
> ob das wirklich TMS320-Code ist.

Also TMS320 ist 99,99% sicher, denn es ist ja TI. Nur welche Variante...

Falls es hilft: TI hatte eine Library die "Hardware Abstraction" macht: 
https://www.ti.com/pdfs/wtbu/OMAP4430_4460_4470_PUBLIC_TRM_Addendum_ABE_HAL_vF.pdf 
aber das ist Code der außerhalb der DSP-Firmware läuft und höchstens mit 
ihr irgendwie kommuniziert. Das macht der Linux-Kernel-Treiber aber auch 
und der ist Open-Source.

Auch OMAPpedia weiss nichts Genaues: 
https://omappedia.com/wiki/Audio_Drive_Arch

ChatGPT meint zu glauben es wäre ein "TI C55x DSP Core". Auf Nachfrage 
nach einer Quelle schwenkt es um und behauptet es wäre doch ein C64. 
Immerhin gab es dann einen Hinweis auf: 
https://en.wikipedia.org/wiki/TMS320#C6000_series

Dort steht (auch ohne Quelle): "OMAP4 and OMAP5 chips include an ARM 
Cortex-A9 or A15 (ARMv7) with a custom C64x+ derivative known as Tesla 
(or C64T)"

Demnach könnte man hier fündig werden: 
https://www.ti.com/lit/ug/spru732j/spru732j.pdf

D.h. wenn jemand einen C64+-Disassembler in Betrieb hat und die 
Architektur kennt, könnte man das einfach mal auf die Datei anwenden um 
zu sehen ob was sinnvolles erkennbar wird...

>> Wer kennt/hat geeignete
>> Tools und Erfahrungen mit TMS320-Architektur und Befehlssatz und würde
>> sich daran versuchen wollen?
>
> Das wirst du nicht bezahlen wollen...

Schon klar dass das niemand bezahlen wird, es baut ja auch keiner mehr 
neue Produkte auf Basis OMAP4/5. Es interessiert die 
Open-Source-Community und ich mache da auch nur als Hobby mit und weil 
es mich als ungelöstes Rätsel beschäftigt...

von Cartman E. (cartmaneric)


Lesenswert?

Hast du es denn schon einmal mit dem Code Composer von TI versucht?
Der hat für die C6000 einen Debugger/Simulator.
Der kann natürlich auch dissassemblieren.

ChatGPT ist wie immer ahnungslos. Die C55 sind Fixkomma-DSP.
Manche 6000er wie die 6200er aber auch.

von Nikolaus S. (Firma: Golden Delicious Computers) (hns)


Lesenswert?

Cartman E. schrieb:
> Hast du es denn schon einmal mit dem Code Composer von TI versucht?
> Der hat für die C6000 einen Debugger/Simulator.
> Der kann natürlich auch dissassemblieren.

Hatte es vor Jahren mal erfolglos probiert.

Und es gerade versucht neu zu installieren (Version 20.1.1 für macOS). 
Da ist aber anscheinend kein TMS320-Support in der Liste "Select 
Components" dabei. Kann/muss man das dann nachinstallieren?

EDIT: habe es wohl gefunden:
https://www.ti.com/tool/de-de/C6000-CGT

: Bearbeitet durch User
von Dieter S. (ds1)


Lesenswert?

Nur disassemblieren (ohne das Ergebnis zu verstehen) ist das kleinste 
Problem wenn man den DSP kennen würde.

TRACE32 kann die ganzen TMS320Cxxx disassemblieren (IDA Pro natürlich 
auch einen grossen Teil davon). TRACE32 kennt auch den DSP der meisten 
OMAPs (z.B. für den OMAP4430 ist das bei TRACE32 "OMAP4430TESLA"), 
allerdings ergibt die "pmem" Datei keinen sinnvollen Code damit.

Die Frage ist ob der ABE DSP des OMAP identisch zum Haupt-DSP ist oder 
ob der eventuell etwas anderes ist.

BTW, die Firmware C-Dateien von hier

https://github.com/mvduin/abefw-omap4plus

enhalten Kommentare um die unterschiedlichen Speicherbereiche zu 
kennzeichnen, da kann man sich den PMEM Bereich direkt rausholen.

von Nikolaus S. (Firma: Golden Delicious Computers) (hns)


Lesenswert?

Dieter S. schrieb:
> Nur disassemblieren (ohne das Ergebnis zu verstehen) ist das kleinste
> Problem wenn man den DSP kennen würde.

Eben, da ist das zunächst schwierigere Problem herauszufinden welcher 
Befehlssatz das überhaupt ist (wenn das nicht gar noch etwas 
proprietäres oder zumindest modifiziertes ist).

>
> TRACE32 kann die ganzen TMS320Cxxx disassemblieren (IDA Pro natürlich
> auch einen grossen Teil davon). TRACE32 kennt auch den DSP der meisten
> OMAPs (z.B. für den OMAP4430 ist das bei TRACE32 "OMAP4430TESLA"),

Ok, dann scheint der Hinweis auf C64-Tesla aus Wikipedia ja schon mal 
etwas mehr bestätigt.

> allerdings ergibt die "pmem" Datei keinen sinnvollen Code damit.

Danke für den Versuch! Es könnte sein, dass die Byte-Order nicht stimmt.

> Die Frage ist ob der ABE DSP des OMAP identisch zum Haupt-DSP ist oder
> ob der eventuell etwas anderes ist.

Ja, das stimmt. Im OMAP4 gibt es auch noch weitere DSPs und der AE ist 
wahrscheinlich eine im Funktionsumfang reduziert Version.

>
> BTW, die Firmware C-Dateien von hier
>
> https://github.com/mvduin/abefw-omap4plus
>
> enhalten Kommentare um die unterschiedlichen Speicherbereiche zu
> kennzeichnen, da kann man sich den PMEM Bereich direkt rausholen.

Das ist mehr oder weniger dasselbe wie 
https://github.com/omap-audio/abefw/blob/master/fw/009590/abe_firmware.c.

Um die Firmware zu bauen, wird dieses File per #include in ein C-Array 
gepackt, dann kommen Header dazu, damit der Linux-Firmware-Loader weiss 
was das ist. Der lädt das und schreibt es ins pmem. Die Bytes scheinen 
auch identisch zu sein, wenn man einen hexdump von der pmem-Datei macht 
- bis auf evtl. byte-order-Effekte.

Ich habe inzwischen auch mal den dis6x aus 
https://www.ti.com/tool/de-de/C6000-CGT probiert darauf anzusetzen. 
Leider crasht er mit einem Segfault, wenn ich direkt die pmem-Datei 
angebe. Wahrscheinlich will er ein ELF-File und kein reines Binary.

Aber -o=0x... disassembliert wenigstens einzelne Worte, so dass ich das 
in eine Schleife packen konnte.

Ungeswappt gibts ein paar halbwegs sinnvoll erscheinende Sequenzen:
1
520c 0x0041008A .word 0x0041008a
2
5210 0x003300D3 ADDK.S2 26113,B0
3
5214 0x003600D8 SUB.L1 -16,A13,A0
4
5218 0x003900D9 SUB.L1 8,A14,A0
5
521c 0x010500DA SUB.L2 8,B1,B2
6
5220 0x0105007D STW.D2T1 A2,*+B14[1280]
7
5224 0x0060007E STW.D2T2 B0,*+B14[24576]
8
5228 0x0060007E STW.D2T2 B0,*+B14[24576]
9
522c 0x010B007D STW.D2T1 A2,*+B14[2816]
10
5230 0x010B0082 .word 0x010b0082
11
5234 0x01080081 MPYH.M1 A0,A2,A2
12
5238 0x01080082 MPYH.M2 B0,B2,B2
13
523c 0x00030081 .word 0x00030081
14
5240 0x00030134 .word 0x00030134
15
5244 0x00030079 .word 0x00030079
16
5248 0x0024007A ADD.L2 B0,B9,B0
17
524c 0x00240134 .word 0x00240134
18
5250 0x00240079 ADD.L1 A0,A9,A0
19
5254 0x0107007A .word 0x0107007a
20
5258 0x01090085 LDHU.D2T1 *-B2[8],A2
21
525c 0x01070085 LDHU.D2T1 *-B1[24],A2
22
5260 0x0107013C STB.D2T1 A2,*+B14[1793]
23
5264 0x01090086 LDHU.D2T2 *-B2[8],B2
24
5268 0x0109013C STB.D2T1 A2,*+B14[2305]
Aber die .word deuten darauf hin dass da nur Rauschen übersetzt wurde. 
Ich konnte auch nichts finden was auf Schleifen hindeutet (wie ist das 
Mnemonic beim C64x für einen Branch?)

Geswappt aber auch nicht besser (da gibt es auch oft viele Codes die der 
dis6x einfach leer ausgibt):
1
520c 8a004100 EXTU.S1 A0,0,0,A0
2
5210 d3003300 NOP
3
5214 d8003600 NOP
4
5218 d9003900 NOP
5
521c da000501 NOP
6
5220 7d000501 LDHU.D1T2 *-A0[0],B0
7
5224 7e006000 LDHU.D1T2 *-A0[0],B0
8
5228 7e006000 LDHU.D1T2 *-A0[0],B0
9
522c 7d000b01 LDHU.D1T2 *-A0[0],B0
10
5230 82000b01 ADDK.S1 640,A0
11
5234 81000801 .word 0x04d3f961
12
5238 82000801 .word 0x04e33ba1
13
523c 81000300 LDW.D2T1 *+B14[21495],A9
14
5240 34010300 STB.D2T1 A4,*+B15[1780]
15
5244 79000300 LDW.D2T1 *+B15[13682],A9
16
5248 7a002400 LDHU.D1T2 *-A0[0],B0
17
524c 34012400 .word 0x0206fcf0
18
5250 79002400 .word 0x04b57b20
19
5254 7a000701 LDHU.D1T2 *-A0[0],B0
20
5258 85000901 LDH.D2T1 *+B4[8],A10
21
525c 85000701 STW.D2T1 A10,*+B15[4353]
22
5260 3c010701 NOP
23
5264 86000901 .word 0x05204505
24
5268 3c010901 NOP

Vielleicht ist dieser Ausschnitt aber auch nur eine Datentabelle?

Ich kenne die TMS320-Architektur leider viel zu wenig.

Was mir aufgefallen ist, ist dass es anscheinend verschiedene 
Befehlssätze für unterschiedliche Zwecke gibt. So ähnlich wie ARM Thumb. 
Vielleicht ist das auch noch vermengt?

Eine weitere Frage fällt mir ein: unter welcher Adresse beginnt der 
Programmablauf beim C64x normalerweise?

: Bearbeitet durch User
von Uwe (uhi)


Lesenswert?

Zum Verständnis: Das oben angehängte pmem soll den gleichen Inhalt haben 
wie der C-Code in 
https://github.com/omap-audio/abefw/blob/master/fw/009590/abe_firmware.c 
? Ich frag, weil das zwar am Anfang stimmt (bis auf 4 Byte 
Verschiebung), aber weiter hinten nicht mehr zusammenpasst. Oder ist das 
gewollt / verstanden, dass das zwar ähnliche, aber nicht gleiche Daten 
sind? Wenn es gewollt unterschiedliche sind, dann könnte man die 
Unterschiede untersuchen, ob die etwas interessantes ergeben.

Edit: Der Disassembler macht seltsame Sachen. Ich versteh nicht, wie er 
auf dieses kommt:
5234 81000801 .word 0x04d3f961
5238 82000801 .word 0x04e33ba1
Die "81000801" sind die Rohdaten, richtig? Dann ist zum "82000801" nur 
ein Bit verschoben. Die Werte hinten sind aber deutlich 
unterschiedlicher.

Edit 2: Die pmem ist nur ca. 11kByte groß. Es ist nicht klar, woher der 
Disassembler die Adresse 0x5234 etc nimmt. Weil das wären ja über 
20kByte.

: Bearbeitet durch User
von Dieter S. (ds1)


Lesenswert?

Mit der "pmem" Datei von weiter oben stimmt wohl etwas nicht. Wenn man 
die Bytes entsprechend anordnet bekommt man das (20 Bytes aus "pmem" je 
Zeile):

1
00000000: 90 95 00 00 00 20 00 00 AC 1E 00 00 00 40 00 00
2
00000010: 60 54 00 00 0F 20 00 16 10 09 00 0A 00 00 20 08
3
00000020: 00 00 20 08 00 00 80 07 CE 75 00 16 E0 0D 20 0A
4
00000030: E4 00 40 01 E5 00 40 01 E6 00 40 01 E7 00 40 01
5
00000040: E8 00 40 01 E9 00 40 01 EA 00 40 01 EB 00 40 01
6
00000050: EC 00 40 01 ED 00 40 01 EF 00 40 01 EF 00 40 01
7
00000060: E4 00 40 14 00 00 00 9E E0 0D 20 0A 40 00 00 9E
8
...
9
...

Das sind also 4 Bytes Offset und dann 16 Bytes Daten, die Daten 
entsprechen dem Inhalt aus "abe_firmware.c", die Reihenfolge der Bytes 
in den 32-Bit Werten ist allerdings vertauscht.

Seltsam ist dass der Header (Versionsnummer und die Längen) auch 
enthalten sind.

Ausserdem taucht an ein paar Stellen noch ein zusätzliches "0x0C" auf, 
dessen Bedeutung unklar ist:

1
...
2
...
3
00001080: 30 43 A0 0A 0B 00 00 06 A0 42 80 0A 0D 00 00 06  - 0C
4
00001090: 30 43 A0 0A 80 44 04 9D 80 47 04 9D 80 04 10 9C  - 0C
5
000010A0: 00 07 10 9C 90 44 04 9D 90 47 04 9D 80 46 04 9D
6
000010B0: 80 84 10 9D 00 87 10 9D B0 43 00 0A D0 00 80 05
7
000010C0: 30 43 A0 0A 90 44 04 9D 00 07 10 9C 90 47 04 9D  - 0C
8
000010D0: 80 84 10 9D 00 87 10 9D 80 44 04 9D 80 47 04 9D
9
...
10
...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.