Domanda

Come si accede all'utente R13 e R14 che vengono salvati quando si accede alla modalità supervisore? Sto usando un ARM7TDMI.

vale a dire. Non voglio accedere al supervisore R14 che ora contiene l'indirizzo di ritorno in modalità utente, ma voglio il valore del registro dei collegamenti in modalità utente. Questo fa parte di un debugger che sto scrivendo.

Esistono alias speciali per questi registri?

Grazie

È stato utile?

Soluzione

Descriverò la risposta per la tua domanda specifica, ma lo stesso approccio si applica anche ad altre modalità.

Dovrai cambiare la modalità del processore cambiando i bit di modalità dal CPSR alla modalità di sistema. Questo ti darà accesso a SP / LR in modalità utente (R13 e amp; R14). Ricorda che la modalità di sistema è privilegiata, ma i suoi R13 e R14 sono gli stessi di R13 e R14 della modalità utente.

Quando sei in modalità di sistema, leggi R13 e R14 e inseriscili dove vuoi. Quindi ripristina i bit della modalità alla modalità precedente (credo che nel tuo esempio fosse la modalità supervisore) e sei a posto.

Nota che non siamo passati dal supervisore alla modalità utente. Se sei passato dal supervisore all'utente, non puoi tornare alla modalità supervisore . (Altrimenti non ci sarebbe protezione dal privilegio di escalation del codice utente). Ecco perché abbiamo usato la modalità di sistema: la modalità di sistema è privilegiata, ma i registri sono gli stessi della modalità utente.

È possibile passare da una delle modalità privilegiate a piacere modificando i bit di modalità nel CPSR. Penso che siano i 5 bit inferiori? Sono in viaggio & amp; non ho le informazioni a portata di mano. Altrimenti ti avrei fornito il codice assembly per quello che ho descritto sopra. In realtà, se vuoi mettere un po 'di peli sul petto, prendi quello che ti ho dato sopra, implementalo, testalo e postalo di nuovo qui. :-D

(Una cosa che dovrei aggiungere per il "caso generale" (il tuo è molto specifico) - puoi esaminare l'SPSR per vedere "da dove vieni" e usarlo per determinare quale modalità devi passare a.)

A proposito, l'ho appena fatto di recente per uno dei miei clienti .... piccolo mondo, immagino.

Altri suggerimenti

Ho scoperto un modo migliore: -

Quando si esegue un STM, se r15 non è uno degli operandi, allora ^ dà accesso ai registri in modalità utente. Tuttavia, l'incremento automatico non sembra funzionare all'interno dell'istruzione e in seguito è necessario un nop se si desidera accedere alla banca dei registri.

Qualcosa di simile

stmfd r13, {r13-r14}^ ;store r13 and r14 usermode
nop
sub r13, r13, #8      ;update stack pointer
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top