Commit 6397bf6a authored by danh-arm's avatar danh-arm
Browse files

Merge pull request #172 from soby-mathew/sm/asm_assert

Introduce asm assert and optimize crash reporting
parents 9fd41277 8c106902
...@@ -37,6 +37,8 @@ ...@@ -37,6 +37,8 @@
.weak platform_is_primary_cpu .weak platform_is_primary_cpu
.weak platform_check_mpidr .weak platform_check_mpidr
.weak plat_report_exception .weak plat_report_exception
.weak plat_crash_console_init
.weak plat_crash_console_putc
/* ----------------------------------------------------- /* -----------------------------------------------------
* int platform_get_core_pos(int mpidr); * int platform_get_core_pos(int mpidr);
...@@ -79,3 +81,20 @@ func platform_check_mpidr ...@@ -79,3 +81,20 @@ func platform_check_mpidr
*/ */
func plat_report_exception func plat_report_exception
ret ret
/* -----------------------------------------------------
* Placeholder function which should be redefined by
* each platform.
* -----------------------------------------------------
*/
func plat_crash_console_init
mov x0, #0
ret
/* -----------------------------------------------------
* Placeholder function which should be redefined by
* each platform.
* -----------------------------------------------------
*/
func plat_crash_console_putc
ret
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include <asm_macros.S> #include <asm_macros.S>
#include <bl_common.h> #include <bl_common.h>
#include <gic_v2.h> #include <gic_v2.h>
#include <pl011.h>
#include "../drivers/pwrc/fvp_pwrc.h" #include "../drivers/pwrc/fvp_pwrc.h"
#include "../fvp_def.h" #include "../fvp_def.h"
...@@ -39,6 +40,8 @@ ...@@ -39,6 +40,8 @@
.globl plat_secondary_cold_boot_setup .globl plat_secondary_cold_boot_setup
.globl platform_mem_init .globl platform_mem_init
.globl plat_report_exception .globl plat_report_exception
.globl plat_crash_console_init
.globl plat_crash_console_putc
.macro fvp_choose_gicmmap param1, param2, x_tmp, w_tmp, res .macro fvp_choose_gicmmap param1, param2, x_tmp, w_tmp, res
ldr \x_tmp, =VE_SYSREGS_BASE + V2M_SYS_ID ldr \x_tmp, =VE_SYSREGS_BASE + V2M_SYS_ID
...@@ -187,3 +190,30 @@ func plat_report_exception ...@@ -187,3 +190,30 @@ func plat_report_exception
add x1, x1, #V2M_SYS_LED add x1, x1, #V2M_SYS_LED
str w0, [x1] str w0, [x1]
ret ret
/* Define a crash console for the plaform */
#define FVP_CRASH_CONSOLE_BASE PL011_UART0_BASE
/* ---------------------------------------------
* int plat_crash_console_init(void)
* Function to initialize the crash console
* without a C Runtime to print crash report.
* Clobber list : x0, x1, x2
* ---------------------------------------------
*/
func plat_crash_console_init
mov_imm x0, FVP_CRASH_CONSOLE_BASE
mov_imm x1, PL011_UART0_CLK_IN_HZ
mov_imm x2, PL011_BAUDRATE
b console_core_init
/* ---------------------------------------------
* int plat_crash_console_putc(void)
* Function to print a character on the crash
* console without a C Runtime.
* Clobber list : x1, x2
* ---------------------------------------------
*/
func plat_crash_console_putc
mov_imm x1, FVP_CRASH_CONSOLE_BASE
b console_core_putc
...@@ -73,7 +73,7 @@ void bl1_early_platform_setup(void) ...@@ -73,7 +73,7 @@ void bl1_early_platform_setup(void)
const size_t bl1_size = BL1_RAM_LIMIT - BL1_RAM_BASE; const size_t bl1_size = BL1_RAM_LIMIT - BL1_RAM_BASE;
/* Initialize the console to provide early debug support */ /* Initialize the console to provide early debug support */
console_init(PL011_UART0_BASE); console_init(PL011_UART0_BASE, PL011_UART0_CLK_IN_HZ, PL011_BAUDRATE);
/* Allow BL1 to see the whole Trusted RAM */ /* Allow BL1 to see the whole Trusted RAM */
bl1_tzram_layout.total_base = TZRAM_BASE; bl1_tzram_layout.total_base = TZRAM_BASE;
......
...@@ -168,7 +168,7 @@ struct entry_point_info *bl2_plat_get_bl31_ep_info(void) ...@@ -168,7 +168,7 @@ struct entry_point_info *bl2_plat_get_bl31_ep_info(void)
void bl2_early_platform_setup(meminfo_t *mem_layout) void bl2_early_platform_setup(meminfo_t *mem_layout)
{ {
/* Initialize the console to provide early debug support */ /* Initialize the console to provide early debug support */
console_init(PL011_UART0_BASE); console_init(PL011_UART0_BASE, PL011_UART0_CLK_IN_HZ, PL011_BAUDRATE);
/* Setup the BL2 memory layout */ /* Setup the BL2 memory layout */
bl2_tzram_layout = *mem_layout; bl2_tzram_layout = *mem_layout;
......
...@@ -143,7 +143,7 @@ void bl31_early_platform_setup(bl31_params_t *from_bl2, ...@@ -143,7 +143,7 @@ void bl31_early_platform_setup(bl31_params_t *from_bl2,
void *plat_params_from_bl2) void *plat_params_from_bl2)
{ {
/* Initialize the console to provide early debug support */ /* Initialize the console to provide early debug support */
console_init(PL011_UART0_BASE); console_init(PL011_UART0_BASE, PL011_UART0_CLK_IN_HZ, PL011_BAUDRATE);
/* Initialize the platform config for future decision making */ /* Initialize the platform config for future decision making */
fvp_config_setup(); fvp_config_setup();
......
...@@ -72,7 +72,7 @@ void bl32_early_platform_setup(void) ...@@ -72,7 +72,7 @@ void bl32_early_platform_setup(void)
* Initialize a different console than already in use to display * Initialize a different console than already in use to display
* messages from TSP * messages from TSP
*/ */
console_init(PL011_UART1_BASE); console_init(PL011_UART1_BASE, PL011_UART1_CLK_IN_HZ, PL011_BAUDRATE);
/* Initialize the platform config for future decision making */ /* Initialize the platform config for future decision making */
fvp_config_setup(); fvp_config_setup();
......
...@@ -198,6 +198,13 @@ ...@@ -198,6 +198,13 @@
#define PL011_UART2_BASE 0x1c0b0000 #define PL011_UART2_BASE 0x1c0b0000
#define PL011_UART3_BASE 0x1c0c0000 #define PL011_UART3_BASE 0x1c0c0000
#define PL011_BAUDRATE 115200
#define PL011_UART0_CLK_IN_HZ 24000000
#define PL011_UART1_CLK_IN_HZ 24000000
#define PL011_UART2_CLK_IN_HZ 24000000
#define PL011_UART3_CLK_IN_HZ 24000000
/******************************************************************************* /*******************************************************************************
* TrustZone address space controller related constants * TrustZone address space controller related constants
******************************************************************************/ ******************************************************************************/
......
...@@ -27,31 +27,79 @@ ...@@ -27,31 +27,79 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#include <cci400.h>
#include <gic_v2.h> #include <gic_v2.h>
#include <plat_config.h> #include <plat_config.h>
#include "platform_def.h"
.section .rodata.gic_reg_name, "aS" .section .rodata.gic_reg_name, "aS"
gic_regs: .asciz "gic_iar", "gic_ctlr", "" gic_regs:
.asciz "gic_hppir", "gic_ahppir", "gic_ctlr", ""
gicd_pend_reg:
.asciz "gicd_ispendr regs (Offsets 0x200 - 0x278)\n Offset:\t\t\tvalue\n"
newline:
.asciz "\n"
spacer:
.asciz ":\t\t0x"
/* Currently we have only 2 GIC registers to report */
#define GIC_REG_SIZE (2 * 8)
/* --------------------------------------------- /* ---------------------------------------------
* The below macro prints out relevant GIC * The below macro prints out relevant GIC
* registers whenever an unhandled exception is * registers whenever an unhandled exception is
* taken in BL31. * taken in BL31.
* Clobbers: x0 - x10, x16, sp
* --------------------------------------------- * ---------------------------------------------
*/ */
.macro plat_print_gic_regs .macro plat_print_gic_regs
adr x0, plat_config; adr x0, plat_config
ldr w0, [x0, #CONFIG_GICC_BASE_OFFSET] ldr w16, [x0, #CONFIG_GICC_BASE_OFFSET]
/* gic base address is now in x0 */ cbz x16, 1f
ldr w1, [x0, #GICC_IAR] /* gic base address is now in x16 */
ldr w2, [x0, #GICC_CTLR] adr x6, gic_regs /* Load the gic reg list to x6 */
sub sp, sp, #GIC_REG_SIZE /* Load the gic regs to gp regs used by str_in_crash_buf_print */
stp x1, x2, [sp] /* we store the gic registers as 64 bit */ ldr w8, [x16, #GICC_HPPIR]
adr x0, gic_regs ldr w9, [x16, #GICC_AHPPIR]
mov x1, sp ldr w10, [x16, #GICC_CTLR]
bl print_string_value /* Store to the crash buf and print to cosole */
add sp, sp, #GIC_REG_SIZE bl str_in_crash_buf_print
/* Print the GICD_ISPENDR regs */
add x7, x16, #GICD_ISPENDR
adr x4, gicd_pend_reg
bl asm_print_str
2:
sub x4, x7, x16
cmp x4, #0x280
b.eq 1f
bl asm_print_hex
adr x4, spacer
bl asm_print_str
ldr x4, [x7], #8
bl asm_print_hex
adr x4, newline
bl asm_print_str
b 2b
1:
.endm
.section .rodata.cci_reg_name, "aS"
cci_iface_regs:
.asciz "cci_snoop_ctrl_cluster0", "cci_snoop_ctrl_cluster1" , ""
/* ------------------------------------------------
* The below macro prints out relevant interconnect
* registers whenever an unhandled exception is
* taken in BL31.
* Clobbers: x0 - x9, sp
* ------------------------------------------------
*/
.macro plat_print_interconnect_regs
adr x6, cci_iface_regs
/* Store in x7 the base address of the first interface */
mov_imm x7, (CCI400_BASE + SLAVE_IFACE3_OFFSET)
ldr w8, [x7, #SNOOP_CTRL_REG]
/* Store in x7 the base address of the second interface */
mov_imm x7, (CCI400_BASE + SLAVE_IFACE4_OFFSET)
ldr w9, [x7, #SNOOP_CTRL_REG]
/* Store to the crash buf and print to console */
bl str_in_crash_buf_print
.endm .endm
...@@ -45,8 +45,7 @@ $(eval $(call add_define,TSP_RAM_LOCATION_ID)) ...@@ -45,8 +45,7 @@ $(eval $(call add_define,TSP_RAM_LOCATION_ID))
PLAT_INCLUDES := -Iplat/fvp/include/ PLAT_INCLUDES := -Iplat/fvp/include/
PLAT_BL_COMMON_SOURCES := drivers/arm/pl011/pl011.c \ PLAT_BL_COMMON_SOURCES := drivers/arm/pl011/pl011_console.S \
drivers/arm/pl011/pl011_console.c \
drivers/io/io_fip.c \ drivers/io/io_fip.c \
drivers/io/io_memmap.c \ drivers/io/io_memmap.c \
drivers/io/io_semihosting.c \ drivers/io/io_semihosting.c \
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment