Rockchip · AI & Linux Hub

Linux und Boot

Rockchip Trust: vollständiger Leitfaden zu TrustZone, PSCI, sicherer Welt und PANIC

Rockchip Trust: vollständiger Leitfaden zu TrustZone, PSCI, sicherer Welt und PANIC — V1.1.1

· ArmSoM Editorial · Rockchip source documentation · 9 Min. Lesezeit

Beide Quellen tragen V1.1.1. Geltungsbereich: RK3036/RK3126C/RK3288/RK322X/RK3368/RK3328/RK3399/PX30/RK3308; Kernel 3.10, 4.4 und 4.19. Nur ArmSoM-Plattformreferenz: Platine, SoC, SDK/BSP, trust/ATF/OP-TEE und Kernel prüfen; keine universelle Platinenunterstützung. Chinesisch nutzt chinesische, EN/RU/DE englische Originalbilder. Logs sind Quellbeispiele; keine Hardwaretests oder Änderungen der Sicherheitskonfiguration.

Speicherbereiche, Einsprungadressen und Logs gehören zu Quellbeispielen; nicht ungeprüft auf andere BSPs übertragen. Adressen und Registerwerte bleiben erhalten. Historische Aussagen zur Binärbereitstellung gelten nicht pauschal für heutige Plattformen.

Technisches Vorwort: Die Quelle beschreibt Trust als Rockchip-SDK-Firmware, erläutert seine Rolle und die Sammlung von Fehlerinformationen. Vollständiger Quellzugriff wird als auf einige interne Ingenieure beschränkt beschrieben, grundlegende Funktionen für RK322x/RK3328/RK3368/RK3399/PX30 jedoch ausdrücklich als offen. Dies sind historische Quellaussagen, keine Garantie aktueller Verfügbarkeit. Der vollständige technische Text bleibt erhalten, nicht nur eine Zusammenfassung.

ArmSoM Docs · Rockchip tools

1. ARM TrustZone

ARM TrustZone [1] ist eine Grundfunktion von Cortex-A-Prozessoren, eingeführt durch ARM-Sicherheitserweiterungen. Diese bieten über Anbieter, Plattformen und Anwendungen hinweg ein einheitliches Programmiermodell mit hardwaregestützter sicherer Umgebung. TrustZone schützt systemweit Anwendungen wie sichere Zahlungen, DRM, Unternehmens- und Webdienste. Die enge Cortex-A-Integration wird über den AMBA-AXI-Bus und spezielle TrustZone-IP-Blöcke erweitert und bietet Sicherheit auf Hardwareebene. So können sicherer Speicher, Kryptoblöcke, Tastaturen und Bildschirme gegen Softwareangriffe geschützt werden. Verbreitete Open-Source-Implementierungen sind ARM Trusted Firmware und OP-TEE OS [2], niedrigstufige ARM-Firmwareprojekte, die gemeinsam oder getrennt einsetzbar sind.

1.1 Systemarchitektur

Die folgende 64-Bit-Architektur verwendet ARM TrustZone. Links liegt die nicht sichere, rechts die sichere Welt. Die sichere Welt darf Ressourcen beider Welten nutzen; die nicht sichere nur ihre eigenen. Zugriffe auf sichere Ressourcen aus der nicht sicheren Welt verursachen Hardware-Busfehler oder ähnliche Ausnahmen und erhalten keinen Zugriff. ARM Trusted Firmware verbindet beide Welten. Eine nicht sichere CPU tritt über die ARM-SMC-Instruktion zunächst in ARM Trusted Firmware ein; Secure Monitor setzt ihren Status auf sicher und wechselt dann in die sichere Welt. Umgekehrt gilt dasselbe. Der Statuswechsel erfolgt auf Hardwareebene. Rockchip Trust kombiniert ARM Trusted Firmware und OP-TEE OS und implementiert die benötigten sicheren Funktionen sowie Secure Monitor als Kern des Weltwechsels.

TrustZone-Architekturdiagramm der englischen Quelle

TrustZone-Architekturdiagramm der englischen Quelle

TrustZone-Architekturdiagramm der englischen Quelle

TrustZone-Architekturdiagramm der englischen Quelle

1.2 CPU-Privilegstufen

Das nächste Diagramm zeigt CPU-Privilegmodi mit TrustZone. Eine 64-Bit-CPU besitzt EL0, EL1, EL2 und EL3; EL0/EL1 sind je nach Welt sicher oder nicht sicher. Eine 32-Bit-CPU besitzt Mon, Hyp, SVC, ABT, IRQ, FIQ, UND, SYS und USER; SVC, ABT, IRQ, FIQ, UND, SYS und USER haben ebenfalls sichere/nicht sichere Varianten. Rockchip Trust entspricht funktional EL3 plus sicherem EL1.

TrustZone-Architekturdiagramm der englischen Quelle

TrustZone-Architekturdiagramm der englischen Quelle

TrustZone-Architekturdiagramm der englischen Quelle

TrustZone-Architekturdiagramm der englischen Quelle

2. Trust auf Rockchip-Plattformen

2.1 Implementierung

Die beschriebenen 64-Bit-SoCs von Rockchip verwenden ARM Trusted Firmware mit OP-TEE OS; 32-Bit-SoCs verwenden OP-TEE OS.

2.2 Startablauf

ARM Trusted Firmware beschreibt EL0, EL1, EL2 und EL3 sowie die Startstufen BL1, BL2, BL31, BL32 und BL33. Die eigenen Quellen implementieren BL1, BL2 und BL31. Rockchip nutzt nur dessen BL31 und implementiert BL1/BL2 selbst. Daher bezeichnet ARM Trusted Firmware bei Rockchip üblicherweise BL31; BL32 ist OP-TEE OS. Zuordnung: Maskrom (BL1), Loader (BL2), Trust (BL31: ARM Trusted Firmware + BL32: OP-TEE OS), U-Boot (BL33). Android-Firmware-Startfolge:

Maskrom -> Loader -> Trust -> U-Boot -> kernel -> Android

TrustZone-Architekturdiagramm der englischen Quelle

TrustZone-Architekturdiagramm der englischen Quelle

2.3 Firmware beziehen

Die Quelle beschreibt die Bereitstellung als Binärdateien ohne vollständigen Quellcode. Trust-Binärdateien liegen im U-Boot-Projekt:

./tools/rk_tools/bin/rk30/
./tools/rk_tools/bin/rk31/
./tools/rk_tools/bin/rk32/
./tools/rk_tools/bin/rk33/

Beim Bauen von uboot.img für eine Plattform wird gleichzeitig trust.img im U-Boot-Hauptverzeichnis erstellt. Eine ini-Datei referenziert die Binärdateien für das Paket. Diese ini-Dateien liegen im U-Boot-Projekt:

tools/rk_tools/RKTRUST/

Entwickler können auch das separate rkbin-Repository mit den Plattform-Binärdateien herunterladen.

2.4 Aktivierung über DTS

2.4.1 Kernel 3.10

2.4.1.1 32-Bit-Plattformen

(1) Einen psci-Knoten ergänzen:

psci {
    compatible      = "arm,psci";
    method          = "smc";
    cpu_suspend     = <0x84000001>;
    cpu_off         = <0x84000002>;
    cpu_on          = <0x84000003>;
    affinity_info   = <0x84000004>;
};

(2) psci=enable in chosen oder parameter ergänzen.

chosen {
    bootargs = "psci=enable vmalloc=496M cma=4M rockchip_jtag";
};
2.4.1.2 64-Bit-Plattformen

(1) Einen psci-Knoten ergänzen:

psci {
        compatible = "arm,psci-0.2";
        method = "smc";
};

(2) enable-method = “psci”; unter dem cpu-Knoten ergänzen.

cpus {
        #address-cells = <2>;
        #size-cells = <0>;

        cpu@0 {
                device_type = "cpu";
                compatible = "arm,cortex-a53", "arm,armv8";
                reg = <0x0 0x0>;
                enable-method = "psci";
                cpu-idle-states = <&CPU_SLEEP>;
        };
        cpu@1 {
                device_type = "cpu";
                compatible = "arm,cortex-a53", "arm,armv8";
                reg = <0x0 0x1>;
                enable-method = "psci";
                cpu-idle-states = <&CPU_SLEEP>;
        };
        cpu@2 {
                device_type = "cpu";
                compatible = "arm,cortex-a53", "arm,armv8";
                reg = <0x0 0x2>;
                enable-method = "psci";
                cpu-idle-states = <&CPU_SLEEP>;
        };
        cpu@3 {
                device_type = "cpu";
                compatible = "arm,cortex-a53", "arm,armv8";
                reg = <0x0 0x3>;
                enable-method = "psci";
                cpu-idle-states = <&CPU_SLEEP>;
        };

        .....
};

2.4.2 Kernel 4.4+

2.4.2.1 32-Bit-Plattformen

Den psci-Knoten ergänzen:

psci {
        compatible = "arm,psci-1.0";
        method = "smc";
};
2.4.2.2 64-Bit-Plattformen

(1) Einen psci-Knoten ergänzen:

psci {
        compatible = "arm,psci-1.0";
        method = "smc";
};

(2) enable-method = “psci”; unter dem cpu-Knoten ergänzen.

cpus {
        #address-cells = <2>;
        #size-cells = <0>;

        cpu@0 {
                device_type = "cpu";
                compatible = "arm,cortex-a53", "arm,armv8";
                reg = <0x0 0x0>;
                enable-method = "psci";
                cpu-idle-states = <&CPU_SLEEP>;
        };
        cpu@1 {
                device_type = "cpu";
                compatible = "arm,cortex-a53", "arm,armv8";
                reg = <0x0 0x1>;
                enable-method = "psci";
                cpu-idle-states = <&CPU_SLEEP>;
        };
        cpu@2 {
                device_type = "cpu";
                compatible = "arm,cortex-a53", "arm,armv8";
                reg = <0x0 0x2>;
                enable-method = "psci";
                cpu-idle-states = <&CPU_SLEEP>;
        };
        cpu@3 {
                device_type = "cpu";
                compatible = "arm,cortex-a53", "arm,armv8";
                reg = <0x0 0x3>;
                enable-method = "psci";
                cpu-idle-states = <&CPU_SLEEP>;
        };

        .....
};

2.4.3 Kernel-Dokumentation

Die Kernel-Dokumentation erläutert PSCI hier:

./Documentation/devicetree/bindings/arm/psci.txt

2.5 Laufzeitspeicher und Lebensdauer

2.5.1 Laufzeitspeicher

ARM Trusted Firmware läuft bei DRAM-Offsets 0M–2M mit Einsprungadresse 0x10000 (64KB). OP-TEE OS läuft bei 132M–148M; die Endadresse hängt von Plattformanforderungen ab. Einsprungadresse: 0x08400000 (132M).

2.5.2 Lebensdauer

Nach der Initialisierung beim Einschalten bleibt Trust während des gesamten Betriebs im Speicher resident.

2.6 Security

Mit TrustZone ist Firmware auf beide Welten verteilt. Bei Rockchip laufen Loader und Trust sicher; U-Boot, Kernel und Android nicht sicher, ausgenommen sichere Treiber und Anwendungen.

2.7 Funktionen

2.7.1 PSCI(Power State Coordination Interface)

SoC-IC-Entwürfe unterscheiden sich stark, besonders bei der CPU-Stromverwaltung. Herstellerspezifische Softwareabläufe fragmentieren den Kernelcode und erschweren eine Vereinheitlichung. Normale Entwickler benötigen diese eng an CPU-Architektur und IC-Entwurf gebundenen, schwer vollständig verständlichen oder implementierbaren Details selten. Der Kernel verlagert CPU-Stromverwaltung deshalb bevorzugt in Herstellerfirmware und behält die Steuerungsstrategie, um Code zu vereinheitlichen. Dafür wurde PSCI (Power State Coordination Interface) [3] eingeführt. Die CPU-Kern-Stromverwaltungsschnittstellen treten über ARM-SMC-Instruktionen in Trust ein und erledigen CPU-Ein-/Ausschalten, tiefen System-Suspend, Reset, Abschalten usw. Wesentliche Schnittstellen:

PSCI_VERSION
PSCI_FEATURES
CPU_ON
CPU_OFF
CPU_SUSPEND
SYSTEM_SUSPEND
AFFINITY_INFO
SYSTEM_OFF
SYSTEM_RESET
......

Codepfade für Kernel 4.4+

./arch/arm/kvm/psci.c
./arch/arm/kernel/smccc-call.S
./arch/arm64/kernel/psci.c
./arch/arm64/kernel/smccc-call.S
./drivers/firmware/psci.c
./drivers/firmware/rockchip_sip.c

Codepfade für Kernel 3.10

./arch/arm/kernel/psci.c
./arch/arm64/kernel/psci.c
./arch/arm/mach-rockchip/psci.c

2.7.2 Secure Monitor

Secure Monitor verbindet CPU-Zustandswechsel zwischen sicherer und nicht sicherer Welt. Er ist in Trust implementiert; ohne ihn wäre kein Sicherheitszustandswechsel möglich und TrustZone verlöre seinen Zweck. Der Eintritt erfolgt per SMC. Das ARM-Handbuch erklärt: Die Secure-Monitor-Call-Ausnahme gehört ausschließlich zu den Security Extensions; SMC fordert eine Secure-Monitor-Funktion an und versetzt den Prozessor in Monitor mode.

2.7.3 Sicherheitskonfiguration

Neben Cortex-A-Integration wird TrustZone über AMBA AXI und spezielle System-IPs erweitert. Die Sicherheitseinstellungen dieser IP-Module müssen daher konfiguriert werden, gewöhnlich in Trust.

2.7.4 Schutz sicherer Daten

Schutz sicherer Daten umfasst den Speicherschutz von Sicherheitsinformationen für Zahlungen, DRM, Unternehmens- und Webdienste.

3. Rockchip-Trust-Fehlersuche

Die Quelle beschreibt öffentlich bereitgestellte Trust-Firmware als binär. Debuggingmöglichkeiten sind begrenzt und erfordern häufig spezielle JTAG-Werkzeuge. Normale Nutzer können Trust-Fehler meist nicht selbst beheben; daher Fehlerzustand erhalten und ausreichend Informationen für den Trust-Maintainer sammeln. Nutzer sollten Trust-Meldungen, Firmwareversionen und PANIC-Ausgaben erkennen können.

3.1 Beispiel eines Startprotokolls

NOTICE:  BL31: v1.3(debug):4c793da
NOTICE:  BL31: Built : 18:13:44, Dec 25 2017
NOTICE:  BL31:Rockchip release version: v1.3
INFO:    ARM GICv2 driver initialized
INFO:    Using opteed sec cpu_context!
INFO:    boot cpu mask: 1
INFO:    plat_rockchip_pmu_init: pd status 0xe
INFO:    BL31: Initializing runtime services
INFO:    BL31: Initializing BL32
INF [0x0] TEE-CORE:init_primary_helper:337: Initializing (1.1.0-127-g27532f4 #54
Mon Dec 18 02:01:14 UTC 2017 aarch64)
INF [0x0] TEE-CORE:init_primary_helper:338: Release version: 1.4
INF [0x0] TEE-CORE:init_teecore:83: teecore inits done
INFO:    BL31: Preparing for EL3 exit to normal world
INFO:    Entry point address = 0x200000
INFO:    SPSR = 0x3c9

3.2 Protokollmeldungen erkennen

Abgesehen vom Startprotokoll verwendet ARM Trusted Firmware zur Laufzeit gewöhnlich dieses Format ohne Zeitstempel:

INFO: *********

OP-TEE-OS-Format ohne Zeitstempel:

INF [0x0] TEE-CORE: *********

3.3 Firmwareversionen erkennen

ARM-Trusted-Firmware-Version: 4c793da.

NOTICE:  BL31: v1.3(debug):4c793da

OP-TEE-OS-Version: 27532f4 (führendes g ignorieren).

INF [0x0] TEE-CORE:init_primary_helper:337: Initializing (1.1.0-127-g27532f4 #54
Mon Dec 18 02:01:14 UTC 2017 aarch64)

3.4 PANIC-Meldungen erkennen

3.4.1 ARM-Trusted-Firmware-Panic

Unhandled Exception in EL3.
x30 =           0x00000000ff00fff0
x0 =            0x00000000000101c0
x1 =            0x0000000000000000
x2 =            0x0000000000000000
x3 =            0x0000000000000000
x4 =            0x0000000000cd383b
x5 =            0x0000000000080001
x6 =            0x0000000080803520
x7 =            0x00000000000342a0
x8 =            0x00000000000101c0
x9 =            0x0000000000000000
x10 =           0x0000000000000000
x11 =           0x0000000000000000
x12 =           0x0000000000000001
x13 =           0x00000000000101b8
x14 =           0x000000000001a950
x15 =           0x0000000000000000
x16 =           0x00000000000101c0
x17 =           0x0000000000000000
x18 =           0x0000000000000000
x19 =           0x0000000000000000
x20 =           0x0000000040000000
x21 =           0x0000000000000040
x22 =           0x00000000000305b0
x23 =           0x000000000001016c
x24 =           0x00000000000101c0
x25 =           0x0000000000000000
x26 =           0x0000000000000000
x27 =           0x0000000000000000
x28 =           0x0000000000035bf8
x29 =           0x0000000000000000
scr_el3 =       0x00000000000101c0
sctlr_el3 =     0x0000000000000000
cptr_el3 =      0x0000000000000000
tcr_el3 =       0x0000000000000000
daif =          0x0000000000000238
mair_el3 =      0x0000000000cd383b
spsr_el3 =      0x0000000000000000
elr_el3 =       0x0000000080803520
ttbr0_el3 =     0x00000000000101c0
esr_el3 =       0x0000000000000000
far_el3 =       0x0000000000000000
spsr_el1 =      0x00000000000101c0
elr_el1 =       0x0000000000000000
spsr_abt =      0x0000000000000000
......

3.4.2 OP-TEE-OS-Panic

core data-abort at address 0xc121b16c

 fsr 0x00000805  ttbr0 0x6847446a  ttbr1 0x6847006a  cidr 0x2
 cpu #0          cpsr 0x200001d1
 r0 0x20068000      r4 0x68407195    r8 0x00000000   r12 0x00000000
 r1 0x00000049      r5 0x6848068b    r9 0x6840a3bd    sp 0xc121b1a4
 r2 0x6848068c      r6 0x6848068c   r10 0x684808cc    lr 0x684296a6
 r3 0x0000001f      r7 0x00000001   r11 0x68404f9d    pc 0x6840041c

ERR [0x0] TEE-CORE:tee_pager_handle_fault:125: Unexpected page fault! Trap CPU
PANIC: tee_pager_handle_fault core/arch/arm/include/mm/tee_pager.h:126

4. Anhang: Referenzen

[0] Open-Source-Downloads:

ARM Trusted Firmware:https://github.com/ARM-software/arm-trusted-firmware

OP-TEE OS:https://github.com/OP-TEE/optee_os

[1] ARM TrustZone:

https://www.arm.com/products/security-on-arm/trustzone

https://developer.arm.com/technologies/trustzone

[2] OP-TEE-Website: https://www.op-tee.org/

[3] PSCI:http://infocenter.arm.com/help/topic/com.arm.doc.den0022c/DEN0022C_Power_State_Coordination_Interface.pdf “Power State Coordination Interface PDD (ARM DEN 0022C)”

Dieses Thema entdecken → · Lernpfade →