Index: kernel/arch/amd64/src/asm.S
===================================================================
--- kernel/arch/amd64/src/asm.S	(revision 06f10ac669769c5153b94682f2807b60a365293a)
+++ kernel/arch/amd64/src/asm.S	(revision 7572eb645c6de21d2eba77fbba0209b2a92b02e2)
@@ -411,4 +411,6 @@
 FUNCTION_BEGIN(early_putuchar)
 
+#if (defined(CONFIG_DEBUG_EARLY_PRINT))
+
 #if (defined(CONFIG_L4RE_UVMM_EARLY_PRINT))
 	xorl %eax, %eax  /* RAX==0: uvmm's print hypercall */
@@ -543,4 +545,6 @@
 #endif
 
+#endif
+
 	ret
 FUNCTION_END(early_putuchar)
Index: kernel/arch/arm64/include/arch/machine_func.h
===================================================================
--- kernel/arch/arm64/include/arch/machine_func.h	(revision 06f10ac669769c5153b94682f2807b60a365293a)
+++ kernel/arch/arm64/include/arch/machine_func.h	(revision 7572eb645c6de21d2eba77fbba0209b2a92b02e2)
@@ -50,4 +50,5 @@
 	size_t (*machine_get_irq_count)(void);
 	const char *(*machine_get_platform_name)(void);
+	void (*machine_early_uart_output)(char32_t);
 };
 
@@ -60,4 +61,5 @@
 extern size_t machine_get_irq_count(void);
 extern const char *machine_get_platform_name(void);
+extern void machine_early_uart_output(char32_t);
 
 #endif
Index: kernel/arch/arm64/src/arm64.c
===================================================================
--- kernel/arch/arm64/src/arm64.c	(revision 06f10ac669769c5153b94682f2807b60a365293a)
+++ kernel/arch/arm64/src/arm64.c	(revision 7572eb645c6de21d2eba77fbba0209b2a92b02e2)
@@ -40,4 +40,5 @@
 #include <arch/exception.h>
 #include <arch/machine_func.h>
+#include <console/console.h>
 #include <interrupt.h>
 #include <proc/scheduler.h>
@@ -256,4 +257,14 @@
 }
 
+void early_putuchar(char32_t c)
+{
+#ifdef CONFIG_DEBUG_EARLY_PRINT
+	if (c == '\n')
+		machine_early_uart_output('\r');
+
+	machine_early_uart_output(c);
+#endif
+}
+
 /** @}
  */
Index: kernel/arch/arm64/src/asm.S
===================================================================
--- kernel/arch/arm64/src/asm.S	(revision 06f10ac669769c5153b94682f2807b60a365293a)
+++ kernel/arch/arm64/src/asm.S	(revision 7572eb645c6de21d2eba77fbba0209b2a92b02e2)
@@ -55,8 +55,4 @@
 FUNCTION_END(memcpy_from_uspace_failover_address)
 FUNCTION_END(memcpy_to_uspace_failover_address)
-
-FUNCTION_BEGIN(early_putuchar)
-	ret
-FUNCTION_END(early_putuchar)
 
 /** Flush instruction caches
Index: kernel/arch/arm64/src/mach/hikey960/hikey960.c
===================================================================
--- kernel/arch/arm64/src/mach/hikey960/hikey960.c	(revision 06f10ac669769c5153b94682f2807b60a365293a)
+++ kernel/arch/arm64/src/mach/hikey960/hikey960.c	(revision 7572eb645c6de21d2eba77fbba0209b2a92b02e2)
@@ -122,4 +122,17 @@
 }
 
+static void hikey960_early_uart_output(char32_t c)
+{
+	volatile uint32_t *uartdr = (volatile uint32_t *)
+	    PA2KA(HIKEY960_UART_ADDRESS);
+	volatile uint32_t *uartfr = (volatile uint32_t *)
+	    PA2KA(HIKEY960_UART_ADDRESS + 24);
+
+	while (*uartfr & 0x20U) {
+	}
+
+	*uartdr = c;
+}
+
 struct arm_machine_ops hikey960_machine_ops = {
 	hikey960_init,
@@ -129,5 +142,6 @@
 	hikey960_enable_vtimer_irq,
 	hikey960_get_irq_count,
-	hikey960_get_platform_name
+	hikey960_get_platform_name,
+	hikey960_early_uart_output
 };
 
Index: kernel/arch/arm64/src/machine_func.c
===================================================================
--- kernel/arch/arm64/src/machine_func.c	(revision 06f10ac669769c5153b94682f2807b60a365293a)
+++ kernel/arch/arm64/src/machine_func.c	(revision 7572eb645c6de21d2eba77fbba0209b2a92b02e2)
@@ -101,4 +101,11 @@
 }
 
+/** Early debugging output. */
+void machine_early_uart_output(char32_t c)
+{
+	if (machine_ops->machine_early_uart_output != NULL)
+		machine_ops->machine_early_uart_output(c);
+}
+
 /** @}
  */
Index: kernel/arch/ia32/src/asm.S
===================================================================
--- kernel/arch/ia32/src/asm.S	(revision 06f10ac669769c5153b94682f2807b60a365293a)
+++ kernel/arch/ia32/src/asm.S	(revision 7572eb645c6de21d2eba77fbba0209b2a92b02e2)
@@ -453,5 +453,5 @@
 FUNCTION_BEGIN(early_putuchar)
 
-#if ((defined(CONFIG_EGA)) && (!defined(CONFIG_FB)))
+#if ((defined(CONFIG_DEBUG_EARLY_PRINT)) && (defined(CONFIG_EGA)) && (!defined(CONFIG_FB)))
 
 	/* Prologue, save preserved registers */
