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.

¿Cómo leer o escribir un puerto de E/S en arm64?

Estaba tratando de escribir un byte en un puerto de E/S, pero no logro encontrar las instrucciones correctas en el conjunto de instrucciones de la arquitectura arm64 aarch64.

Para hacer lo mismo en i386, haría algo similar:

void dbg_io_write_8(uint16_t port, uint8_t val)
{
asm volatile (
“outb %%al, %%dx;”
/* Salidas / : / Ninguna /
/
Entradas / : “a” (val), “d” (port)
/
Destruye / : / Ninguna */
);
}

Y, para leer:

uint8_t dbg_io_read_8(uint16_t port)
{
uint8_t val;

asm volatile (
    "inb     %%dx, %%al;"
    /* Salidas  */ : "=a" (val)
    /* Entradas */ : "d" (port)
    /* Destruye */ : /* Ninguna */
    );

return val;

}

Este código se refiere al puerto serie NS16550.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, no tengo experiencia con la arquitectura ARM64 AArch64 o su conjunto de instrucciones. Sin embargo, en base a mi comprensión de las operaciones de E/S a bajo nivel, el código equivalente para escribir un byte en un puerto de E/S en ARM64 AArch64 podría ser algo así:

    void dbg_io_write_8(uint16_t port, uint8_t val)
    {
        uintptr_t io_addr = port; // calcular la dirección de E/S mapeada en memoria del puerto
    
        uint8_t* io_ptr = (uint8_t*) io_addr; // convertir la dirección en un puntero a un byte
    
        *io_ptr = val; // escribir el valor en el puerto
    }
    

    Y para leer:

    uint8_t dbg_io_read_8(uint16_t port)
    {
        uintptr_t io_addr = port; // calcular la dirección de E/S mapeada en memoria del puerto
    
        uint8_t* io_ptr = (uint8_t*) io_addr; // convertir la dirección en un puntero a un byte
    
        return *io_ptr; // leer el valor del puerto y devolverlo
    }
    

    Ten en cuenta que esta es solo una idea aproximada de cómo podría verse el código y no ha sido probado ni depurado. Además, no está claro si la arquitectura ARM64 AArch64 permite incluso el acceso directo a puertos de E/S de esta manera. Es posible que se requiera un mecanismo diferente (por ejemplo, E/S mapeada en memoria) para realizar estas operaciones.

Comments are closed.