2008-11-27 7 views
6

Jak uzyskać dostęp do użytkownika R13 i R14, które są zapisywane po wprowadzeniu trybu administratora? Używam ARM7TDMI.ARM. Uzyskaj dostęp do użytkownika R13 i R14 z trybu administratora

I.E. Nie chcę mieć dostępu do administratora R14, który teraz zawiera adres zwrotny do trybu użytkownika, zamiast tego chce uzyskać wartość rejestru linków trybu użytkownika. To jest część debuggera, który piszę.

Czy istnieją specjalne aliasy do tych rejestrów?

Dzięki

Odpowiedz

9

opiszę odpowiedź na Twoje pytanie, ale samo podejście stosuje się do innych trybów, jak również.

Będziesz musiał zmienić tryb procesora, zmieniając bity trybu w CPSR na tryb systemowy. Umożliwi to dostęp do SP/LR trybu użytkownika (R13 & R14). Pamiętaj, że tryb systemowy jest uprzywilejowany, ale jego R13 i R14 są takie same jak w R13 i R14 w trybie użytkownika.

Po przejściu do trybu systemowego przeczytaj R13 i R14 i umieść je tam, gdzie chcesz. Następnie przełączaj bity trybu z powrotem do poprzedniego trybu (wierzę, że był to tryb administratora w twoim przykładzie) i dobrze ci idzie.

Należy pamiętać, że nie przełączyliśmy się z trybu administratora do trybu użytkownika. Jeśli przełączyłeś się z przełożonego na użytkownika, , nie można wrócić do trybu administratora. (W przeciwnym razie nie byłoby ochrony przed uprawnieniami do eskalacji kodu użytkownika). Dlatego użyliśmy trybu systemowego - tryb systemu jest uprzywilejowany, ale rejestry są takie same jak w trybie użytkownika.

Możesz przełączać dowolny z uprzywilejowanych trybów, manipulując bitami trybu w CPSR. Myślę, że oni są niższymi 5 bitami? Jestem na drodze & nie mam informacji na wyciągnięcie ręki. W przeciwnym razie dostarczyłbym ci kod zestawu dla tego, co opisałem powyżej. Właściwie, jeśli chcesz umieścić trochę włosów na klatce piersiowej, weź to, co ci dałem powyżej, zaimplementuj, przetestuj i opublikuj tutaj. :-D

(Jedna rzecz, którą powinienem dodać do "ogólnego przypadku" (twój jest bardzo specyficzny) - możesz zbadać SPSR, aby zobaczyć "skąd przyszedłeś" - i użyć go, by określić, który tryb chcesz trzeba się przełączyć.)

Przy okazji, właśnie zrobiłem to niedawno dla jednego z moich klientów ... małego świata, tak myślę.

+0

Wow dzięki. Nigdy nie zauważyłem, że tryb użytkownika i tryb systemu współdzielą te same rejestry! Wezmę pękanie kodu. Obawiam się, że nie mogę tego opublikować, ponieważ jest to dzieło sztuki - ale uważam, że bardzo dobrze opisałeś zasady, co jest ważniejsze. – Tarski

+0

Nie ma za co. Powodzenia w zajęciach. – Dan

+0

Cześć Dan, jeśli ARM jest w trybie hip i musi przeczytać R13/r14 z PL1 NS = 1 mode (SVC), w jaki sposób byłoby to zrobić? – mSO

3

odkryłem lepszy sposób: -

Podczas STM, jeśli R15 nie jest jeden z argumentów następnie^daje dostęp do rejestrów w trybie użytkownika. Jednak autoinrementacja nie działa zgodnie z instrukcją, a nop jest wymagany później, jeśli chcesz uzyskać dostęp do banku rejestru.

Coś

stmfd r13, {r13-r14}^ ;store r13 and r14 usermode 
nop 
sub r13, r13, #8  ;update stack pointer 
+0

Znak^jest dostępny tylko w ARMv6 i nowszych, IIRC. –

+0

To jest świetne znalezisko! Według http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204j/Cihcadda.html, to użycie jest "przestarzałe". Nie bardzo jestem pewien, czy o to dbać. – Brendan

Powiązane problemy