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:

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

(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 usar inout em vez de in porque a chamada pode potencialmente destruir o conteĂșdo dos registradores.
  • Esta função main precisa ser #[no_mangle] e extern "C" porque Ă© chamada de nosso ponto de entrada em entry.S.
  • _x0–_x3 sĂŁo os valores dos registradores x0–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 que extern "C" especifica para usar), os registradores x0–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 em src/bare-metal/aps/examples.