genode/base-mb/src/kernel/platforms/petalogix_s3adsp1800_mmu/userland_entry.s

281 lines
5.0 KiB
ArmAsm
Executable File

/*
* \brief Userland entry
* \author Martin Stein
* \date 2010-10-05
*
* Enter the userland via '_userland_entry' with execution context denoted in
* '_userland_context'
*/
/*
* Copyright (C) 2010-2012 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU General Public License version 2.
*/
.global _userland_entry
.global _userland_context
.global _kernel_timer_ctrl
.global _kernel_timer_ctrl_start
.macro _START_KERNEL_TIMER
swi r30, r0, _start_kernel_timer__buf_0
swi r31, r0, _start_kernel_timer__buf_1
lwi r30, r0, _kernel_timer_ctrl
lwi r31, r0, _kernel_timer_ctrl_start
swi r31, r30, 0
lwi r30, r0, _start_kernel_timer__buf_0
lwi r31, r0, _start_kernel_timer__buf_1
.endm
.macro _START_KERNEL_TIMER__VARIABLES
.align 4
_start_kernel_timer__buf_0:
.space 1*4
.align 4
_start_kernel_timer__buf_1:
.space 1*4
.endm
.macro _MAY_BE_VERBOSE_USERLAND_ENTRY
/*
_PRINT_CONTEXT
_PRINT_ASCII_RUN
*/
.endm
.macro _MAY_BE_VERBOSE_VARIABLES
/*
_PRINT_CONTEXT__VARIABLES
_PRINT_HEX32__VARIABLES
_PRINT_HEX8__VARIABLES
_PRINT_ASCII_SPACE__VARIABLES
_PRINT_ASCII_BREAK__VARIABLES
_PRINT_ASCII_RUN__VARIABLES
_PRINT_ASCII_STOP__VARIABLES
*/
.endm
.macro _PREPARE_CONTEXT__USES_R2_TO_R31
lwi r15, r0, _userland_context
/* _PRELOAD_R1_R15_RPC_FROM_CONTEXT__USES_R3_R15 */
lwi r3, r15, 1*4
swi r3, r0, _preloaded_r1
lwi r3, r15, 15*4
swi r3, r0, _preloaded_r15
lwi r3, r15, 32*4
swi r3, r0, _preloaded_rpc
/* _LOAD_RPID_FROM_CONTEXT__USES_R3_R15 */
lwi r3, r15, 36*4
mts rpid, r3
/* _SYNCHRONIZING_OP */
bri 4
/* _LOAD_RMSR_FROM_CONTEXT__USES_R3_R4_R15 */
lwi r3, r15, 33*4
mts rmsr, r3
/* _SYNCHRONIZING_OP */
bri 4
/* _LOAD_R2_TO_R13_FROM_CONTEXT__USES_R2_TO_R13_R15 */
lwi r2, r15, 2*4
lwi r3, r15, 3*4
lwi r4, r15, 4*4
lwi r5, r15, 5*4
lwi r6, r15, 6*4
lwi r7, r15, 7*4
lwi r8, r15, 8*4
lwi r9, r15, 9*4
lwi r10, r15, 10*4
lwi r11, r15, 11*4
lwi r12, r15, 12*4
lwi r13, r15, 13*4
/* _LOAD_R18_TO_R31_FROM_CONTEXT__TO_R15_R18_TO_R31 */
lwi r18, r15, 18*4
lwi r19, r15, 19*4
lwi r20, r15, 20*4
lwi r21, r15, 21*4
lwi r22, r15, 22*4
lwi r23, r15, 23*4
lwi r24, r15, 24*4
lwi r25, r15, 25*4
lwi r26, r15, 26*4
lwi r27, r15, 27*4
lwi r28, r15, 28*4
lwi r29, r15, 29*4
lwi r30, r15, 30*4
lwi r31, r15, 31*4
.endm
.macro _EXEC_PREPARED_CONTEXT_CASE_INTERRUPT
lwi r14, r0, _preloaded_rpc
lwi r1, r0, _preloaded_r1
lwi r15, r0, _preloaded_r15
_MAY_BE_VERBOSE_USERLAND_ENTRY
_START_KERNEL_TIMER
rtid r14, 0
or r0, r0, r0
.endm
.macro _EXEC_PREPARED_CONTEXT_CASE_EXCEPTION
lwi r1, r0, _preloaded_r1
lwi r17, r0, _preloaded_rpc
lwi r15, r0, _preloaded_r15
_MAY_BE_VERBOSE_USERLAND_ENTRY
_START_KERNEL_TIMER
rted r17, 0
or r0, r0, r0
.endm
.macro _EXEC_PREPARED_CONTEXT_CASE_SYSCALL
lwi r1, r0, _preloaded_r1
lwi r15, r0, _preloaded_rpc
_MAY_BE_VERBOSE_USERLAND_ENTRY
_START_KERNEL_TIMER
rtbd r15, 8
or r0, r0, r0
.endm
.macro _EXEC_PREPARED_CONTEXT_CASE_INITIAL
lwi r14, r0, _preloaded_rpc
lwi r1, r0, _preloaded_r1
lwi r15, r0, _preloaded_r15
/* _ENABLE_EXCEPTIONS */
msrset r0, 0x100
/*_SYNCHRONIZING_OP */
bri 4
_START_KERNEL_TIMER
rtid r14, 0
or r0, r0, r0
.endm
.macro _SWITCH_USERLAND_BLOCKING_TYPE__USES_R3_R15
lwi r15, r0, _userland_context
/* _LOAD_BLOCKING_TYPE_FROM_CONTEXT__USES_R3_R15 */
lwi r3, r15, 37*4
.endm
.macro _CASE_INITIAL__USES_R4_R3
xori r4, r3, 0
bnei r4, _end_case_initial
.endm
.macro _CASE_INTERRUPT__USES_R4_R3
xori r4, r3, 1
bnei r4, _end_case_interrupt
.endm
.macro _CASE_EXCEPTION__USES_R4_R3
xori r4, r3, 2
bnei r4, _end_case_exception
.endm
.macro _CASE_SYSCALL__USES_R4_R3
xori r4, r3, 3
bnei r4, _end_case_syscall
.endm
/* _BEGIN_READABLE_EXECUTABLE */
.section ".text"
_userland_entry:
_SWITCH_USERLAND_BLOCKING_TYPE__USES_R3_R15
_CASE_INTERRUPT__USES_R4_R3
_PREPARE_CONTEXT__USES_R2_TO_R31
_EXEC_PREPARED_CONTEXT_CASE_INTERRUPT
/* userland execution */
_end_case_interrupt:
_CASE_EXCEPTION__USES_R4_R3
_PREPARE_CONTEXT__USES_R2_TO_R31
_EXEC_PREPARED_CONTEXT_CASE_EXCEPTION
/* userland execution */
_end_case_exception:
_CASE_SYSCALL__USES_R4_R3
_PREPARE_CONTEXT__USES_R2_TO_R31
_EXEC_PREPARED_CONTEXT_CASE_SYSCALL
/* userland execution */
_end_case_syscall:
_CASE_INITIAL__USES_R4_R3
_PREPARE_CONTEXT__USES_R2_TO_R31
_EXEC_PREPARED_CONTEXT_CASE_INITIAL
/* userland execution */
_end_case_initial:
_case_default:
/* _ERROR_UNKNOWN_USERLAND_BLOCKING_TYPE */
brai 0x99000003
/* system halted */
_end_case_default:
_end_switch_userland_blocking_type:
_end_userland_entry:
/* _BEGIN_READABLE_WRITEABLE */
.section ".bss"
.align 4
_kernel_timer_ctrl: .space 1*4
.align 4
_kernel_timer_ctrl_start: .space 1*4
_START_KERNEL_TIMER__VARIABLES
/* _VARIABLES_TO_READ_EXEC_CONTEXT */
.align 4
_preloaded_r1: .space 4
.align 4
_preloaded_r15: .space 4
.align 4
_preloaded_rpc: .space 4
_MAY_BE_VERBOSE_VARIABLES
.align 4
_userland_context: .space 1*4