ARM: как процедура декомпрессии linux выводит символы на UART?

#assembly #linux-kernel #arm #uart

Вопрос:

Процедура распаковки Linux на ARM использует следующий код для вывода сообщений на консоль во время ранней загрузки:

 static void icedcc_putc(int ch)
{
    int status, i = 0x4000000;

    do {
        if (--i < 0)
            return;

        asm volatile ("mrc p14, 0, %0, c0, c0, 0" : "=r" (status));
    } while (status amp; 2);

    asm("mcr p14, 0, %0, c1, c0, 0" : : "r" (ch));
}
 

Из документации инструкции mcr кажется , что символ перемещается в какой-то регистр сопроцессора.

Пожалуйста, объясните, как персонаж в конечном итоге попадает в строки uart после последней команды подпрограммы icedcc_putc.

Комментарии:

1. Он записывается в регистр отладки сопроцессора, который перенаправляет его в определенный канал отладки (UART). Пожалуйста, прочтите документацию (upd: ссылка отредактирована): developer.arm.com/documentation/ddi0344/k/debug/…

2. Похоже, что он вращается-ждет статуса, а затем ставит в очередь персонажа, с UART, доступным в качестве сопроцессора.

3. Метод вывода зависит как от арки, так и от платы и требует инициализации UART программой загрузки. См. arch/arm/Kconfig.debug , а также CONFIG_DEBUG_UNCOMPRESS и CONFIG_DEBUG_LL