forked from Imagelibrary/rtems
bsps/arm: Move HYP to SVC change to start.S
This fixes the corruption of r3 by the call to bsp_start_arm_drop_hyp_mode(). Moving the code makes it easier to review changes in start.S. Close #3773.
This commit is contained in:
@@ -1,76 +0,0 @@
|
|||||||
/**
|
|
||||||
* @file
|
|
||||||
*
|
|
||||||
* @brief Boot and system start code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 2016 Pavel Pisa <pisa@cmp.felk.cvut.cz>
|
|
||||||
*
|
|
||||||
* Czech Technical University in Prague
|
|
||||||
* Zikova 1903/4
|
|
||||||
* 166 36 Praha 6
|
|
||||||
* Czech Republic
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <rtems/asm.h>
|
|
||||||
#include <rtems/score/cpu.h>
|
|
||||||
|
|
||||||
#include <bspopts.h>
|
|
||||||
#include <bsp/irq.h>
|
|
||||||
#include <bsp/linker-symbols.h>
|
|
||||||
|
|
||||||
.extern bsp_start_hyp_vector_table_begin
|
|
||||||
.globl bsp_start_arm_drop_hyp_mode
|
|
||||||
.globl bsp_arm_drop_hyp_mode_only
|
|
||||||
|
|
||||||
.arm
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The routine is called from startup code and it should
|
|
||||||
* preserve all registers except r2 and r3. r0 can be used
|
|
||||||
* as pass though argument in some cases, a1 is used for
|
|
||||||
* CPU stack offset during startup and r4 to r6 to preserve
|
|
||||||
* booloader arguments
|
|
||||||
*/
|
|
||||||
|
|
||||||
bsp_start_arm_drop_hyp_mode:
|
|
||||||
ldr r2, bsp_start_hyp_vector_table_begin_addr
|
|
||||||
mcr p15, 4, r2, c12, c0, 0
|
|
||||||
|
|
||||||
mov r2, #0
|
|
||||||
mcr p15, 4, r2, c1, c1, 0
|
|
||||||
mcr p15, 4, r2, c1, c1, 2
|
|
||||||
mcr p15, 4, r2, c1, c1, 3
|
|
||||||
/*
|
|
||||||
* HSCTLR.TE
|
|
||||||
* optional start of hypervisor handlers in Thumb mode
|
|
||||||
* orr r0, #(1 << 30)
|
|
||||||
*/
|
|
||||||
mcr p15, 4, r2, c1, c0, 0 /* HSCTLR */
|
|
||||||
mrc p15, 4, r2, c1, c1, 1 /* HDCR */
|
|
||||||
and r2, #0x1f /* Preserve HPMN */
|
|
||||||
mcr p15, 4, r2, c1, c1, 1 /* HDCR */
|
|
||||||
|
|
||||||
bsp_arm_drop_hyp_mode_only:
|
|
||||||
/* Prepare SVC mode for eret */
|
|
||||||
mrs r2, cpsr
|
|
||||||
bic r2, r2, #ARM_PSR_M_MASK
|
|
||||||
orr r2, r2, #ARM_PSR_M_SVC
|
|
||||||
msr spsr_cxsf, r2
|
|
||||||
|
|
||||||
adr r2, 1f
|
|
||||||
.inst 0xe12ef302 /* msr ELR_hyp, r2 */
|
|
||||||
mov r2, sp
|
|
||||||
mov r3, lr
|
|
||||||
.inst 0xe160006e /* eret */
|
|
||||||
1: mov sp, r2
|
|
||||||
mov lr, r3
|
|
||||||
bx lr
|
|
||||||
|
|
||||||
bsp_start_hyp_vector_table_begin_addr:
|
|
||||||
.word bsp_start_hyp_vector_table_begin
|
|
||||||
@@ -13,6 +13,13 @@
|
|||||||
* Germany
|
* Germany
|
||||||
* <rtems@embedded-brains.de>
|
* <rtems@embedded-brains.de>
|
||||||
*
|
*
|
||||||
|
* Copyright (c) 2016 Pavel Pisa <pisa@cmp.felk.cvut.cz>
|
||||||
|
*
|
||||||
|
* Czech Technical University in Prague
|
||||||
|
* Zikova 1903/4
|
||||||
|
* 166 36 Praha 6
|
||||||
|
* Czech Republic
|
||||||
|
*
|
||||||
* The license and distribution terms for this file may be
|
* The license and distribution terms for this file may be
|
||||||
* found in the file LICENSE in this distribution or at
|
* found in the file LICENSE in this distribution or at
|
||||||
* http://www.rtems.org/license/LICENSE.
|
* http://www.rtems.org/license/LICENSE.
|
||||||
@@ -200,13 +207,44 @@ _start:
|
|||||||
bne .L_skip_hyp_svc_switch
|
bne .L_skip_hyp_svc_switch
|
||||||
|
|
||||||
/* Boot loader starts kernel in HYP mode, switch to SVC necessary */
|
/* Boot loader starts kernel in HYP mode, switch to SVC necessary */
|
||||||
|
|
||||||
ldr r1, =bsp_stack_hyp_size
|
ldr r1, =bsp_stack_hyp_size
|
||||||
mov sp, r3
|
mov sp, r3
|
||||||
sub r3, r3, r1
|
sub r3, r3, r1
|
||||||
bl bsp_start_arm_drop_hyp_mode
|
|
||||||
|
ldr r2, =bsp_start_hyp_vector_table_begin
|
||||||
|
mcr p15, 4, r2, c12, c0, 0
|
||||||
|
|
||||||
|
mov r2, #0
|
||||||
|
mcr p15, 4, r2, c1, c1, 0
|
||||||
|
mcr p15, 4, r2, c1, c1, 2
|
||||||
|
mcr p15, 4, r2, c1, c1, 3
|
||||||
|
/*
|
||||||
|
* HSCTLR.TE
|
||||||
|
* optional start of hypervisor handlers in Thumb mode
|
||||||
|
* orr r0, #(1 << 30)
|
||||||
|
*/
|
||||||
|
mcr p15, 4, r2, c1, c0, 0 /* HSCTLR */
|
||||||
|
mrc p15, 4, r2, c1, c1, 1 /* HDCR */
|
||||||
|
and r2, #0x1f /* Preserve HPMN */
|
||||||
|
mcr p15, 4, r2, c1, c1, 1 /* HDCR */
|
||||||
|
|
||||||
|
/* Prepare SVC mode for eret */
|
||||||
|
mrs r2, cpsr
|
||||||
|
bic r2, r2, #ARM_PSR_M_MASK
|
||||||
|
orr r2, r2, #ARM_PSR_M_SVC
|
||||||
|
msr spsr_cxsf, r2
|
||||||
|
|
||||||
|
adr r2, .L_hyp_to_svc_return
|
||||||
|
.inst 0xe12ef302 /* msr ELR_hyp, r2 */
|
||||||
|
mov r2, sp
|
||||||
|
.inst 0xe160006e /* eret */
|
||||||
|
.L_hyp_to_svc_return:
|
||||||
|
mov sp, r2
|
||||||
|
|
||||||
.L_skip_hyp_svc_switch:
|
.L_skip_hyp_svc_switch:
|
||||||
#endif
|
#endif /* BSP_START_IN_HYP_SUPPORT */
|
||||||
|
|
||||||
/* Initialize stack pointer registers for the various modes */
|
/* Initialize stack pointer registers for the various modes */
|
||||||
|
|
||||||
/* Enter FIQ mode and set up the FIQ stack pointer */
|
/* Enter FIQ mode and set up the FIQ stack pointer */
|
||||||
|
|||||||
@@ -45,9 +45,6 @@ librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/start/sbrk.c
|
|||||||
librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/start/stackalloc.c
|
librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/start/stackalloc.c
|
||||||
librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/shared/start/bsp-start-memcpy.S
|
librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/shared/start/bsp-start-memcpy.S
|
||||||
librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/shared/cp15/arm-cp15-set-ttb-entries.c
|
librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/shared/cp15/arm-cp15-set-ttb-entries.c
|
||||||
if BSP_START_IN_HYP_SUPPORT
|
|
||||||
librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/shared/start/bsp-start-in-hyp-support.S
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Startup
|
# Startup
|
||||||
librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/raspberrypi/start/bspstart.c
|
librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/raspberrypi/start/bspstart.c
|
||||||
|
|||||||
Reference in New Issue
Block a user