diff options
Diffstat (limited to 'c/src/lib/libbsp/arm/shared/start/start.S')
-rw-r--r-- | c/src/lib/libbsp/arm/shared/start/start.S | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/c/src/lib/libbsp/arm/shared/start/start.S b/c/src/lib/libbsp/arm/shared/start/start.S index cb66d82483..7cd6cdb161 100644 --- a/c/src/lib/libbsp/arm/shared/start/start.S +++ b/c/src/lib/libbsp/arm/shared/start/start.S @@ -5,7 +5,7 @@ */ /* - * Copyright (c) 2008-2014 embedded brains GmbH. All rights reserved. + * Copyright (c) 2008, 2017 embedded brains GmbH. All rights reserved. * * embedded brains GmbH * Obere Lagerstr. 30 @@ -13,6 +13,9 @@ * Germany * <rtems@embedded-brains.de> * + * Copyright 2016 Fent Innovative Software Solutions (FENTISS). + * All rights reserved. + * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at * http://www.rtems.org/license/LICENSE. @@ -26,6 +29,14 @@ #include <bsp/irq.h> #include <bsp/linker-symbols.h> +#ifdef RTEMS_PARAVIRT_XTRATUM +#define MSR_OPCODE 5 +#define MRC_OPCODE 13 +#define XM_SI(si) udf si +#else +#define XM_SI(si) +#endif + /* External symbols */ .extern bsp_reset .extern boot_card @@ -171,6 +182,10 @@ bsp_start_hyp_vector_table_end: /* Start entry */ _start: +#ifdef RTEMS_PARAVIRT_XTRATUM + ldr r1, =pctrl_addr + str r0, [r1] +#endif /* * We do not save the context since we do not return to the boot @@ -185,6 +200,7 @@ _start: #ifdef RTEMS_SMP /* Read MPIDR */ + XM_SI(MRC_OPCODE) mrc p15, 0, r0, c0, c0, 5 /* Calculate stack offset */ @@ -196,6 +212,7 @@ _start: mrs r4, cpsr /* save original procesor status value */ #ifdef BSP_START_IN_HYP_SUPPORT orr r0, r4, #(ARM_PSR_I | ARM_PSR_F) + XM_SI(MSR_OPCODE) msr cpsr, r4 and r0, r4, #ARM_PSR_M_MASK @@ -215,12 +232,14 @@ bsp_start_skip_hyp_svc_switch: * Set SVC mode, disable interrupts and enable ARM instructions. */ mov r0, #(ARM_PSR_M_SVC | ARM_PSR_I | ARM_PSR_F) + XM_SI(MSR_OPCODE) msr cpsr, r0 /* Initialize stack pointer registers for the various modes */ /* Enter IRQ mode and set up the IRQ stack pointer */ mov r0, #(ARM_PSR_M_IRQ | ARM_PSR_I | ARM_PSR_F) + XM_SI(MSR_OPCODE) msr cpsr, r0 ldr sp, =bsp_stack_irq_end #ifdef RTEMS_SMP @@ -229,6 +248,7 @@ bsp_start_skip_hyp_svc_switch: /* Enter FIQ mode and set up the FIQ stack pointer */ mov r0, #(ARM_PSR_M_FIQ | ARM_PSR_I | ARM_PSR_F) + XM_SI(MSR_OPCODE) msr cpsr, r0 ldr sp, =bsp_stack_fiq_end #ifdef RTEMS_SMP @@ -241,6 +261,7 @@ bsp_start_skip_hyp_svc_switch: /* Enter ABT mode and set up the ABT stack pointer */ mov r0, #(ARM_PSR_M_ABT | ARM_PSR_I | ARM_PSR_F) + XM_SI(MSR_OPCODE) msr cpsr, r0 ldr sp, =bsp_stack_abt_end #ifdef RTEMS_SMP @@ -249,6 +270,7 @@ bsp_start_skip_hyp_svc_switch: /* Enter UND mode and set up the UND stack pointer */ mov r0, #(ARM_PSR_M_UND | ARM_PSR_I | ARM_PSR_F) + XM_SI(MSR_OPCODE) msr cpsr, r0 ldr sp, =bsp_stack_und_end #ifdef RTEMS_SMP @@ -257,6 +279,7 @@ bsp_start_skip_hyp_svc_switch: /* Enter SVC mode and set up the SVC stack pointer */ mov r0, #(ARM_PSR_M_SVC | ARM_PSR_I | ARM_PSR_F) + XM_SI(MSR_OPCODE) msr cpsr, r0 ldr sp, =bsp_stack_svc_end #ifdef RTEMS_SMP @@ -267,6 +290,7 @@ bsp_start_skip_hyp_svc_switch: #ifdef ARM_MULTILIB_VFP /* Read CPACR */ + XM_SI(MRC_OPCODE) mrc p15, 0, r0, c1, c0, 2 /* Enable CP10 and CP11 */ @@ -346,6 +370,12 @@ bsp_vector_table_copy_done: /* Branch to start hook 1 */ bl bsp_start_hook_1 +#ifdef RTEMS_PARAVIRT_XTRATUM + ldr r1, =pctrl_addr + ldr r0, [r1] + blx init_libxm +#endif + /* Branch to boot card */ mov r0, #0 bl boot_card @@ -436,3 +466,9 @@ twiddle: .set bsp_start_vector_table_size, bsp_start_vector_table_end - bsp_start_vector_table_begin .set bsp_vector_table_size, bsp_start_vector_table_size + +#ifdef RTEMS_PARAVIRT_XTRATUM +.align 4 +pctrl_addr: + .word 0 +#endif |