Pergunta

Como faço para acessar o usuário R13 e R14, que são salvos quando o modo de supervisor é inserido? Eu estou usando um ARM7TDMI.

I.E. Eu não quero supervisor acesso R14 que agora contém o endereço de retorno para o modo de usuário, em vez quer o valor do link de registro do modo usuário. Isso faz parte de um depurador que estou escrevendo.

Existem aliases especiais para estes registos?

Graças

Foi útil?

Solução

Eu vou descrever a resposta para sua pergunta específica, mas a mesma abordagem se aplica a outros modos também.

Você precisará alterar o modo de processador alterando os bits de modo na CPSR para o modo de sistema. Isto lhe dará acesso a SP do modo de usuário / LR (R13 e R14). Lembre-se que o modo de sistema é privilegiada, mas o seu R13 e R14 são os mesmos que R13 de modo de usuário e R14.

Quando estiver em modo de sistema, leia R13 e R14 e colocá-los onde quiser. Em seguida, basta mudar o modo de pedaços de volta ao seu modo anterior (creio que era o modo supervisor no seu exemplo) e você está pronto para ir.

Nota que não mudar de supervisor para o modo de usuário. Se você mudou de supervisor para o usuário, você não poderia voltar para o modo supervisor . (Caso contrário, não haveria nenhuma proteção contra o código do usuário privilégio escalada). É por isso que usamos o modo de sistema -. Modo do sistema é privilegiada, mas os registros são as mesmas que o modo de usuário

Você pode alternar entre qualquer um dos modos privilegiados à vontade manipulando os bits de modo na CPSR. Eu acho que eles são os mais baixos 5 bits? Eu estou na estrada e não ter a informação na ponta dos dedos. Caso contrário, eu teria lhe fornecido o código de montagem para o que eu descrevi acima. Na verdade, se você quiser colocar algum cabelo em seu peito, pegar o que eu te dei acima, implementá-lo, testá-lo e publicá-lo de volta aqui. :-D

(Uma coisa devo acrescentar para o "caso geral" (o seu é muito específico) - você pode examinar o SPSR para ver "de onde você veio" - e usar isso para determinar qual modo que você precisa para mudar para .)

A propósito, eu só fiz isso recentemente para um dos meus clientes .... pequeno mundo, eu acho.

Outras dicas

Eu descobri uma maneira melhor: -

Ao fazer uma STM, se r15 não é um dos operandos então ^ dá acesso aos registos de modo de usuário. No entanto, autoincrementável não parece trabalho dentro da instrução, e uma nop é necessária mais tarde, se você quiser acessar o banco de registradores.

Algo como

stmfd r13, {r13-r14}^ ;store r13 and r14 usermode
nop
sub r13, r13, #8      ;update stack pointer
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top