diff --git a/arch/aarch64/kernel/entry.S b/arch/aarch64/kernel/entry.S index 95ad16c4b..659dc0572 100644 --- a/arch/aarch64/kernel/entry.S +++ b/arch/aarch64/kernel/entry.S @@ -123,6 +123,9 @@ hcmask: .byte 255,255,255,0 .global host_logical_addr host_logical_addr: .quad 0 +.global uart_mmio +uart_mmio: .dword 0 + start64: //mrs x0, s3_1_c15_c3_0 // Read EL1 Configuration Base Address Register diff --git a/arch/aarch64/kernel/uart.c b/arch/aarch64/kernel/uart.c index 69edd3318..ff0e731e9 100644 --- a/arch/aarch64/kernel/uart.c +++ b/arch/aarch64/kernel/uart.c @@ -33,6 +33,7 @@ #include volatile static unsigned int* mmio = NULL; +extern unsigned int uart_mmio; /* Puts a single character on a serial device */ int uart_putchar(unsigned char c) @@ -59,21 +60,23 @@ int uart_puts(const char *text) int uart_early_init(char* cmdline) { - if (is_uhyve()) - return 0; - - // default value of our QEMU configuration - mmio = (unsigned int*) 0x09000000; + if (is_uhyve()) { + mmio = (unsigned int*) uart_mmio; + } else { + // default value of our QEMU configuration + mmio = (unsigned int*) 0x09000000; + } return 0; } int uart_init(void) { - if (is_uhyve()) - return 0; - - mmio = (unsigned int*) 0x09000000; + if (is_uhyve()) { + mmio = (unsigned int*) uart_mmio; + } else { + mmio = (unsigned int*) 0x09000000; + } return 0; } diff --git a/tools/uhyve-aarch64.c b/tools/uhyve-aarch64.c index efe9560aa..2a4d635c2 100644 --- a/tools/uhyve-aarch64.c +++ b/tools/uhyve-aarch64.c @@ -477,6 +477,8 @@ int load_kernel(uint8_t* mem, char* path) } *((uint64_t*) (mem+paddr-GUEST_OFFSET + 0xbc)) = (uint64_t) guest_mem; + if (verbose) + *((uint32_t*) (mem+paddr-GUEST_OFFSET + 0x174)) = (uint32_t) UHYVE_UART_PORT; } *((uint64_t*) (mem+paddr-GUEST_OFFSET + 0x158)) += memsz; // total kernel size }