| /* |
| * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved. |
| * |
| * SPDX-License-Identifier: BSD-3-Clause |
| */ |
| #ifndef __CONSOLE_MACROS_S__ |
| #define __CONSOLE_MACROS_S__ |
| |
| #include <console.h> |
| |
| /* |
| * This macro encapsulates the common setup that has to be done at the end of |
| * a console driver's register function. It will register all of the driver's |
| * callbacks in the console_t structure and initialize the flags field (by |
| * default consoles are enabled for the "boot" and "crash" states, this can be |
| * changed after registration with the console_set_scope() function). It ends |
| * with a tail call that will include return to the caller. |
| * REQUIRES console_t pointer in x0 and a valid return address in x30. |
| */ |
| .macro finish_console_register _driver |
| /* |
| * Add these weak definitions so we will automatically write a 0 if the |
| * function doesn't exist. I'd rather use .ifdef but that only works if |
| * the function was defined (not just declared .global) above this point |
| * in the file, which we can't guarantee. |
| */ |
| .weak console_\_driver\()_putc |
| .weak console_\_driver\()_getc |
| .weak console_\_driver\()_flush |
| |
| /* Don't use adrp on weak funcs! See GNU ld bugzilla issue 22589. */ |
| ldr x1, =console_\_driver\()_putc |
| str x1, [x0, #CONSOLE_T_PUTC] |
| ldr x1, =console_\_driver\()_getc |
| str x1, [x0, #CONSOLE_T_GETC] |
| ldr x1, =console_\_driver\()_flush |
| str x1, [x0, #CONSOLE_T_FLUSH] |
| mov x1, #(CONSOLE_FLAG_BOOT | CONSOLE_FLAG_CRASH) |
| str x1, [x0, #CONSOLE_T_FLAGS] |
| b console_register |
| .endm |
| |
| #endif /* __CONSOLE_MACROS_S__ */ |