es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

ARM TrustZone: Accediendo a un búfer no seguro desde un servicio de tiempo de ejecución de monitor seguro.

Mi configuración consiste en un STM32MP157C-DK2 que utiliza Trusted Firmware-A para cargar SP-MIN como BL32 y uBoot+Linux como BL33.

Estoy tratando de hacer funcionar un pequeño ejemplo en el que creo un SMC desde el kernel de Linux que pasa una referencia a la memoria no segura. Los datos en esa ubicación deberían ser modificados por el servicio en tiempo de ejecución que maneja el SMC.

El problema que enfrento es que no puedo encontrar información sobre los pasos necesarios para traducir la dirección virtual del kernel de Linux en NS: EL1 al régimen de traducción de EL3.

El código de mi servicio en tiempo de ejecución se ve así:

static int32_t my_svc_setup(void)
{
return 0;
}

static uintptr_t my_svc_smc_handler(uint32_t smc_fid,
u_register_t x1,
u_register_t x2,
u_register_t x3,
u_register_t x4,
void *cookie,
void *handle,
u_register_t flags)
{
uint16_t smc_function_number = (uint16_t) smc_fid;
uint32_t *data;

switch(smc_function_number){
case 123:
    data = (uint32_t *) x1;
    // Magia de Traducción de Dirección ...
    *data = 42;
    SMC_RET1(handle, 1);
default:
    SMC_RET1(handle, SMC_UNK);
}

}

DECLARE_RT_SVC(
my_svc,
OEN_OEM_START,
OEN_OEM_END,
SMC_TYPE_FAST,
my_svc_setup,
my_svc_smc_handler
);

El SMC llega al controlador sin problemas, pero tan pronto como trato de obtener la dirección física que pasé a través de x1, la CPU (obviamente) se bloquea. Si alguien pudiera ayudarme a completar los pasos necesarios restantes para obtener una referencia válida, se lo agradecería enormemente.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Problema de traducción de direcciones en el kernel de Linux a EL3 en STM32MP157C-DK2

    Como experto en tecnología de la información especializado en C, ARM y Trust-Zone, el problema que enfrentas es que no encuentras información sobre cuáles son los pasos necesarios para traducir la dirección virtual del kernel de Linux en NS: EL1 al régimen de traducción de EL3. A continuación se explica los pasos que se pueden seguir para resolver el problema.

    Pasos para traducir la dirección virtual a la dirección física

    Para traducir una dirección virtual a una dirección física en STM32MP157C-DK2, que utiliza Trusted Firmware-A para cargar SP-MIN como BL32 y uBoot + Linux como BL33, siga estos pasos:

    1. En Trusted Firmware-A, configure las tablas de traducción para todas las regiones de memoria para asignar las direcciones físicas a las mismas direcciones virtuales en los contextos de ejecución de EL1 y EL3.
    2. Después del arranque, MMU se habilitará, y el kernel de Linux funcionará en el estado no seguro, EL1.

    3. En el kernel de Linux, puede utilizar llamadas API de firmware con el Blob del árbol de dispositivos (DTB) para recuperar la dirección física de un dispositivo.

    4. Traduzca la dirección física a la dirección virtual utilizando la función ioremap_nocache () en el kernel de Linux.

    5. Pase esta dirección virtual al SMC utilizando la función del controlador SMC, y el SMC puede traducir la dirección virtual a una dirección física en EL3 utilizando las mismas tablas de páginas.

    6. Con la dirección física, el SMC puede pasar datos entre los mundos seguro y no seguro.

    Código para la magia de traducción de direcciones

    En su código, debe agregar código para traducir la dirección virtual a una dirección física. A continuación se muestra un ejemplo de cómo puede modificar su código para la magia de traducción de direcciones:

    static uintptr_t my_svc_smc_handler(uint32_t smc_fid,
          u_register_t x1,
          u_register_t x2,
          u_register_t x3,
          u_register_t x4,
          void *cookie,
          void *handle,
          u_register_t flags)
    {
        uint16_t smc_function_number = (uint16_t) smc_fid;
        uint32_t *data;
        phys_addr_t phys_addr;
    
        switch(smc_function_number){
        case 123:
            data = (uint32_t *) x1;
    
            // Translate virtual address to physical address
            phys_addr = virt_to_phys(data); 
    
            // Pass the physical address to the SMC handler
            *(__iomem uint32_t *)phys_addr = 42;
    
            SMC_RET1(handle, 1);
        default:
            SMC_RET1(handle, SMC_UNK);
        }
    }
    

    Conclusión

    En resumen, para traducir una dirección virtual de Linux a EL3 en STM32MP157C-DK2, debe configurar las tablas de traducción para todas las regiones de memoria, recuperar la dirección física utilizando las llamadas API de firmware con el Blob del árbol de dispositivos, utilizar la función ioremap_nocache () para traducir la dirección física a una dirección virtual, y utilizar la función virt_to_phys () para traducir la dirección virtual a una dirección física en la función del controlador SMC. Siguiendo estos pasos y modificando su código como se muestra arriba, debería poder resolver el problema de traducción de direcciones.

Comments are closed.