| /* |
| * Copyright (c) 2018, Arm Limited. All rights reserved. |
| * |
| * SPDX-License-Identifier: BSD-3-Clause |
| */ |
| |
| #include "asm_macros.S" |
| #include "platform.h" |
| |
| /* |
| * PL011 UART registers |
| */ |
| /* UART Flag Register */ |
| #define UARTFR 0x018 |
| /* Transmit FIFO full bit in UARTFR register */ |
| #define PL011_UARTFR_TXFF_BIT 5 |
| /* UART Data Register */ |
| #define UARTDR 0x000 |
| |
| .text |
| .global print_string |
| .global print_char |
| |
| /* |
| * void print_char(unsigned int c); |
| * clobbers: x3, x4 |
| */ |
| func print_char |
| ldr x3, =UART_BASE |
| 1: |
| /* Check if the transmit FIFO is full */ |
| ldr w4, [x3, #UARTFR] |
| tbnz w4, #PL011_UARTFR_TXFF_BIT, 1b |
| str w0, [x3, #UARTDR] |
| ret |
| endfunc print_char |
| |
| /* |
| * void print_string(const char *str); |
| * clobbers: x0, x1, x2, x9 |
| */ |
| func print_string |
| ldr x1, =UART_BASE |
| mov x2, x0 |
| 1: |
| ldrb w0, [x2], #1 |
| cmp wzr, w0 |
| b.eq 2f |
| |
| mov x9, x30 |
| bl print_char |
| mov x30, x9 |
| b 1b |
| 2: |
| ret |
| endfunc print_string |