aboutsummaryrefslogtreecommitdiff
path: root/el3_payload/uart.S
blob: b7c5e9444fd02922ffef02c3a53ba9921af5cd8d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/*
 * 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