Assembly inline
Ăs vezes, precisamos usar assembly para fazer coisas que nĂŁo sĂŁo possĂveis com o cĂłdigo Rust. Por exemplo, para fazer uma chamada HVC (hypervisor call) para informar ao firmware para desligar o sistema:
(Se vocĂȘ realmente quiser fazer isso, use o crate smccc
que possui wrappers para todas essas funçÔes.)
Speaker Notes
- PSCI é a Interface de Coordenação de Estado de Energia Arm, um conjunto padrão de funçÔes para gerenciar estados de energia do sistema e da CPU, entre outras coisas. à implementado pelo firmware EL3 e hipervisores em muitos sistemas.
- A sintaxe
0 => _
significa inicializar o registrador com 0 antes de executar o cĂłdigo de assembly inline e ignorar seu conteĂșdo posteriormente. Ă necessĂĄrio usarinout
em vez dein
porque a chamada pode potencialmente destruir o conteĂșdo dos registradores. - Esta função
main
precisa ser#[no_mangle]
eextern "C"
porque Ă© chamada de nosso ponto de entrada ementry.S
. _x0
â_x3
sĂŁo os valores dos registradoresx0
âx3
, que sĂŁo convencionalmente usados ââpelo carregador de inicialização para passar coisas como um ponteiro para a ĂĄrvore de dispositivos. De acordo com a convenção de chamada aarch64 padrĂŁo (que Ă© o queextern "C"
especifica para usar), os registradoresx0
âx7
sĂŁo usados ââpara os primeiros 8 argumentos passados ââpara uma função, portanto,entry.S
nĂŁo precisa fazer nada especial, exceto garantir que nĂŁo altere esses registradores.- Execute o exemplo no QEMU com
make qemu_psci
emsrc/bare-metal/aps/examples
.