¿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.
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í:
Y para leer:
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.