2010-05-06 10 views
7

In base al manuale ARM, dovrebbe essere possibile accedere ai registri sovrapposti per una modalità CPU specifica come, ad esempio, "r13_svc". Quando provo a fare questo gcc mi grida con il seguente errore:Accedere in modo esplicito a registri elevati su ARM

espressione immediata richiede un prefisso # - `mov r2, sp_svc'

Cosa c'è di sbagliato?

Aggiornamento

. Il testo che segue dal Manuale ARM Architettura di riferimento per ARMv5 e ARMv6 mi ha portato a credere che sia possibile, la sezione A2.4.2:

Registers R13 and R14 have six banked physical registers each. One is used in User and System modes, and each of the remaining five is used in one of the five exception modes. Where it is necessary to be specific about which version is being referred to, you use names of the form: R13_mode R14_mode where mode is the appropriate one of usr, svc (for Supervisor mode), abt, und, irq and fiq.

risposta

3

non credo che sia possibile con l'istruzione mov; almeno secondo il Manuale di riferimento sull'architettura ARM che sto leggendo. Che documento hai? C'è una variante di ldm che può caricare i registri della modalità utente da una modalità privilegiata (usando ^). L'unica altra opzione è quella di passare alla modalità SVC, fare mov r2, sp e quindi tornare a qualsiasi altra modalità in uso.

L'errore che stai ricevendo è perché non capisce sp_svc, in modo che pensa che tu stai cercando di fare un immediato mov, che sarebbe simile:

mov r2, #0x14 

Ecco perché si dice " richiede un # prefisso ".

+0

Lo capisco. Si prega di consultare l'aggiornamento sopra per quanto riguarda il testo dal Manuale di riferimento Architettura ARM – Demiurg

+2

@Demiurg, quel paragrafo non si riferisce alla scrittura del codice, ma solo alle convenzioni del documento. Dato che i registri sovrapposti sono diversi, devono avere nomi univoci in modo che nessuno possa confondersi. Non sta cercando di implicare che potresti usare quei nomi nel tuo codice assembly. Le sezioni relative alle istruzioni e alle modalità di indirizzamento più avanti nel libro sono più chiare su ciò che puoi o non puoi fare. –

+0

Probabilmente hai ragione – Demiurg

2

È possibile utilizzare mrs e msr per modificare le modalità modificando i bit nel cpsr, quindi utilizzare normalmente r13.

dal braccio braccio

 
MRS R0,CPSR 
BIC R0,R0,#0x1F 
ORR R0,R0,#0x13 
MSR CPSR_c,R0 

poi

 
mov sp,#0x10000000 

o se avete bisogno di più bit nelle immediate

 
ldr sp,=0x12345600 

o se non volete l'assemblatore mettendo i dati, puoi metterlo da solo

 
ldr sp,svc_stack 
b 1f 
svc_stack: .word 0x12345600 
1: 

Vedrete tipico codice di avvio del braccio, in cui l'applicazione sta per supportare gli interrupt, interrompe e altre eccezioni, per impostare tutti i puntatori dello stack che si sta per necessità, modalità di cambio, Set SP, il cambiamento mode, set sp, change mode ...

+0

Se guardi la codifica delle istruzioni per un mov, ci sono quattro bit per il registro di destinazione, appena sufficienti per il 0xD (r13 o sp). Ci sono 6 diversi registri sp avete bisogno di altri 3 bit nell'istruzione se poteste specificare la modalità, non li vedo lì quindi non c'è modo di specificare la modalità nell'istruzione dovete cambiare il cpsr usando la modifica cpsr istruzione (msr). Nota che i vari assemblatori (arm, gcc, ecc.) Usano una sintassi diversa per msr/mrs e le istruzioni mrc/mcr. Quindi la sintassi del braccio è probabile per il braccio non gcc. –

+0

Grazie. Il codice che hai postato probabilmente farebbe il trucco. Quello che mi ha portato a credere che sia possibile accedere direttamente a questi registri è il seguente testo: I registri R13 e R14 hanno sei registri fisici sovrapposti ciascuno ... Dove è necessario essere specifici su quale versione si sta riferendo a , si utilizzano i nomi del modulo: R13_ R14_ dove è quello appropriato di usr, svc (per modalità Supervisore), abt, und, irq e fiq. dal Manuale di riferimento Architettura ARM. – Demiurg

+0

Hmm, è una sezione molto confusa nel braccio, non capisco cosa stiano insinuando. Forse il loro assemblatore aggiunge istruzioni per te, tranne forse per le valutazioni di Keil. Non ho più accesso agli strumenti per armare. quella sezione implica qualcosa di speciale su armv6 relativo al registro bancario e prosegue mostrando ciò che ho mostrato sopra iniziando con "In archtecture versions before armv6". Se r13_svc, r13_sys, ecc erano disponibili su qualsiasi istruzione in quanto ciò implica allora ogni istruzione avrebbe bisogno di spazio nella sua codifica e una nota nella codifica su se armv6 allora ... –

5

La sintassi corretta per questo è mrs r2,sp_svc o mrs r3, sp_usr. Questa è una nuova estensione armv7. Il codice può essere visto nel file sorgente KVM ARM Linux interrupt_head.S. La patch gas binutils per questo instruction support di Matthew Gretton-Dann. Richiede le estensioni di virtualizzazione per quanto ho capito.

Secondo quanto ho capito, LPAE (estensione di indirizzo fisico di grandi dimensioni) implica le estensioni di virtualizzazione. Quindi Cortex-A7, Cortex-A12, Cortex-A15 e Cortex-A17 potrebbero essere in grado di utilizzare questa estensione. Tuttavia, Cortex-A5, Cortex-A8 e Cortex-A9 non possono.

documentazione sul istruzione può essere trovato nel ARMv7a TRM RevC, nella sezione B9.3.9 MRS (registro sopraelevate).

Per le altre CPU Cortex-A (e ARMv6) è possibile utilizzare l'istruzione cps per passare da una modalità all'altra e trasferire il registro su un registro non assegnato (R0-R7) e quindi tornare indietro. La difficoltà evidente è con la modalità utente . Il modo corretto di gestirlo è con ldm rN, {sp,lr}^; la modalità utente non ha modo di ritornare alle modalità privilegiate.

Per tutte le CPU precedenti, le informazioni fornite da Dwelch funzioneranno. Principalmente, utilizzare mrs/msr per cambiare modalità.

Questa è un'istruzione importante per il cambio di contesto (che le VM fanno molto).

+0

I binutils più recenti danno l'errore * Errore: i registri Banked non sono disponibili con questa architettura. * Quando si tenta l'istruzione con flag CPU compilatore/assemblatore che non supportano LPAE. –

Problemi correlati