genode/base-mb/src/kernel/platforms/petalogix_s3adsp1800_mmu/include/exec_context.s

528 lines
9.1 KiB
ArmAsm
Executable File

/*
* \brief Access to execution context internals
* \author Martin Stein
* \date 2010-10-06
*/
/*
* 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.
*/
/**********************************************************
** Overwrite specific parts of the execution context **
** **
** \param r15 base address of the execution context **
** \param (rx) value that shall be written - except **
** r1, rpc and r15 - the register itself, **
** otherwise use "prestore" labels or r3 **
**********************************************************/
.macro _SAVE_R2_TO_R13_TO_CONTEXT__USES_R2_TO_R13_R15
swi r2, r15, 2*4
swi r3, r15, 3*4
swi r4, r15, 4*4
swi r5, r15, 5*4
swi r6, r15, 6*4
swi r7, r15, 7*4
swi r8, r15, 8*4
swi r9, r15, 9*4
swi r10, r15, 10*4
swi r11, r15, 11*4
swi r12, r15, 12*4
swi r13, r15, 13*4
.endm
.macro _SAVE_R18_TO_R31_TO_CONTEXT__TO_R15_R18_TO_R31
swi r18, r15, 18*4
swi r19, r15, 19*4
swi r20, r15, 20*4
swi r21, r15, 21*4
swi r22, r15, 22*4
swi r23, r15, 23*4
swi r24, r15, 24*4
swi r25, r15, 25*4
swi r26, r15, 26*4
swi r27, r15, 27*4
swi r28, r15, 28*4
swi r29, r15, 29*4
swi r30, r15, 30*4
swi r31, r15, 31*4
.endm
.macro _SAVE_PRESTORED_R1_R15_RPC_TO_CONTEXT__USES_R3_R15
lwi r3, r0, _prestored_r1
swi r3, r15, 1*4
lwi r3, r0, _prestored_r15
swi r3, r15, 15*4
lwi r3, r0, _prestored_rpc
swi r3, r15, 32*4
.endm
.macro _SAVE_RMSR_TO_CONTEXT__USES_R3_R15
mfs r3, rmsr
swi r3, r15, 33*4
.endm
.macro _SAVE_RPID_TO_CONTEXT__USES_R3_R15
mfs r3, rpid
swi r3, r15, 36*4
.endm
.macro _SAVE_BLOCKING_TYPE_TO_CONTEXT__USES_R3_R15
swi r3, r15, 37*4
.endm
.macro _SAVE_RESR_TO_CONTEXT__USES_R3_R15
mfs r3, resr
swi r3, r15, 35*4
.endm
.macro _SAVE_REAR_TO_CONTEXT__USES_R3_R15
mfs r3, rear
swi r3, r15, 34*4
.endm
/***********************************************************
** Load a specifics values from the execution context **
** **
** \param r15 base address of the execution context **
** \return (rx) value that has been loaded - except **
** r1, rpc and r15 - the register itself, **
** otherwise use "preload" labels or r3 **
***********************************************************/
.macro _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
.endm
.macro _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 _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
.endm
.macro _LOAD_RMSR_FROM_CONTEXT__USES_R3_R4_R15
lwi r3, r15, 33*4
mts rmsr, r3
_SYNCHRONIZING_OP
.endm
.macro _LOAD_RPID_FROM_CONTEXT__USES_R3_R15
lwi r3, r15, 36*4
mts rpid, r3
_SYNCHRONIZING_OP
.endm
.macro _LOAD_BLOCKING_TYPE_FROM_CONTEXT__USES_R3_R15
lwi r3, r15, 37*4
.endm
.macro _VARIABLES_TO_WRITE_EXEC_CONTEXT
.align 4
_prestored_r1: .space 4
.align 4
_prestored_r15: .space 4
.align 4
_prestored_rpc: .space 4
.endm
.macro _VARIABLES_TO_READ_EXEC_CONTEXT
.align 4
_preloaded_r1: .space 4
.align 4
_preloaded_r15: .space 4
.align 4
_preloaded_rpc: .space 4
.endm
/**
* Macros to print out context content
*
* (any value hexadecimal and padded with
* leading zeros to 8 digits)
* output has following format:
*
* r1 r2 r3 r4
* ...
* ...
* r28 r29 r30 r31
* rmsr
*
*/
.macro _4BIT_SHIFT_RIGHT__ARG_30__RET_30
srl r30, r30
srl r30, r30
srl r30, r30
srl r30, r30
.endm
.macro _PRINT_ASCII8__ARG_30
swi r30, r0, 0x84000004
.endm
.macro _PRINT_HEX8__ARG_30
swi r29, r0, _print_hex8__buffer_0
andi r30, r30, 0xf
rsubi r29, r30, 9
addi r30, r30, 48
bgei r29, 8
addi r30, r30, 39
_PRINT_ASCII8__ARG_30
lwi r29, r0, _print_hex8__buffer_0
.endm
.macro _PRINT_HEX32__ARG_31
swi r31, r0, _print_hex32__buffer_1
swi r30, r0, _print_hex32__buffer_0
lwi r31, r0, _print_hex32__buffer_1-3
add r30, r31, r0
_4BIT_SHIFT_RIGHT__ARG_30__RET_30
_PRINT_HEX8__ARG_30
add r30, r31, r0
_PRINT_HEX8__ARG_30
lwi r31, r0, _print_hex32__buffer_1-2
add r30, r31, r0
_4BIT_SHIFT_RIGHT__ARG_30__RET_30
_PRINT_HEX8__ARG_30
add r30, r31, r0
_PRINT_HEX8__ARG_30
lwi r31, r0, _print_hex32__buffer_1-1
add r30, r31, r0
_4BIT_SHIFT_RIGHT__ARG_30__RET_30
_PRINT_HEX8__ARG_30
add r30, r31, r0
_PRINT_HEX8__ARG_30
lwi r31, r0, _print_hex32__buffer_1-0
add r30, r31, r0
_4BIT_SHIFT_RIGHT__ARG_30__RET_30
_PRINT_HEX8__ARG_30
add r30, r31, r0
_PRINT_HEX8__ARG_30
lwi r31, r0, _print_hex32__buffer_1
lwi r30, r0, _print_hex32__buffer_0
.endm
.macro _PRINT_ASCII_SPACE
swi r30, r0, _print_ascii_space__buffer_0
addi r30, r0, 32
_PRINT_ASCII8__ARG_30
lwi r30, r0, _print_ascii_space__buffer_0
.endm
.macro _PRINT_ASCII_BREAK
swi r30, r0, _print_ascii_break__buffer_0
addi r30, r0, 13
_PRINT_ASCII8__ARG_30
addi r30, r0, 10
_PRINT_ASCII8__ARG_30
lwi r30, r0, _print_ascii_break__buffer_0
.endm
.macro _PRINT_ASCII_STOP
swi r30, r0, _print_ascii_stop__buffer_0
addi r30, r0, 115
_PRINT_ASCII8__ARG_30
addi r30, r0, 116
_PRINT_ASCII8__ARG_30
addi r30, r0, 111
_PRINT_ASCII8__ARG_30
addi r30, r0, 112
_PRINT_ASCII8__ARG_30
_PRINT_ASCII_BREAK
lwi r30, r0, _print_ascii_stop__buffer_0
.endm
.macro _PRINT_ASCII_RUN
swi r30, r0, _print_ascii_run__buffer_0
addi r30, r0, 114
_PRINT_ASCII8__ARG_30
addi r30, r0, 117
_PRINT_ASCII8__ARG_30
addi r30, r0, 110
_PRINT_ASCII8__ARG_30
_PRINT_ASCII_BREAK
lwi r30, r0, _print_ascii_run__buffer_0
.endm
.macro _PRINT_CONTEXT
swi r31, r0, _print_context__buffer_0
_PRINT_ASCII_BREAK
add r31, r0, r0
_PRINT_HEX32__ARG_31
_PRINT_ASCII_SPACE
add r31, r0, r1
_PRINT_HEX32__ARG_31
_PRINT_ASCII_SPACE
add r31, r0, r2
_PRINT_HEX32__ARG_31
_PRINT_ASCII_SPACE
add r31, r0, r3
_PRINT_HEX32__ARG_31
_PRINT_ASCII_SPACE
add r31, r0, r4
_PRINT_HEX32__ARG_31
_PRINT_ASCII_SPACE
add r31, r0, r5
_PRINT_HEX32__ARG_31
_PRINT_ASCII_SPACE
add r31, r0, r6
_PRINT_HEX32__ARG_31
_PRINT_ASCII_SPACE
add r31, r0, r7
_PRINT_HEX32__ARG_31
_PRINT_ASCII_BREAK
add r31, r0, r8
_PRINT_HEX32__ARG_31
_PRINT_ASCII_SPACE
add r31, r0, r9
_PRINT_HEX32__ARG_31
_PRINT_ASCII_SPACE
add r31, r0, r10
_PRINT_HEX32__ARG_31
_PRINT_ASCII_SPACE
add r31, r0, r11
_PRINT_HEX32__ARG_31
_PRINT_ASCII_SPACE
add r31, r0, r12
_PRINT_HEX32__ARG_31
_PRINT_ASCII_SPACE
add r31, r0, r13
_PRINT_HEX32__ARG_31
_PRINT_ASCII_SPACE
add r31, r0, r14
_PRINT_HEX32__ARG_31
_PRINT_ASCII_SPACE
add r31, r0, r15
_PRINT_HEX32__ARG_31
_PRINT_ASCII_BREAK
add r31, r0, r16
_PRINT_HEX32__ARG_31
_PRINT_ASCII_SPACE
add r31, r0, r17
_PRINT_HEX32__ARG_31
_PRINT_ASCII_SPACE
add r31, r0, r18
_PRINT_HEX32__ARG_31
_PRINT_ASCII_SPACE
add r31, r0, r19
_PRINT_HEX32__ARG_31
_PRINT_ASCII_SPACE
add r31, r0, r20
_PRINT_HEX32__ARG_31
_PRINT_ASCII_SPACE
add r31, r0, r21
_PRINT_HEX32__ARG_31
_PRINT_ASCII_SPACE
add r31, r0, r22
_PRINT_HEX32__ARG_31
_PRINT_ASCII_SPACE
add r31, r0, r23
_PRINT_HEX32__ARG_31
_PRINT_ASCII_BREAK
add r31, r0, r24
_PRINT_HEX32__ARG_31
_PRINT_ASCII_SPACE
add r31, r0, r25
_PRINT_HEX32__ARG_31
_PRINT_ASCII_SPACE
add r31, r0, r26
_PRINT_HEX32__ARG_31
_PRINT_ASCII_SPACE
add r31, r0, r27
_PRINT_HEX32__ARG_31
_PRINT_ASCII_SPACE
add r31, r0, r28
_PRINT_HEX32__ARG_31
_PRINT_ASCII_SPACE
add r31, r0, r29
_PRINT_HEX32__ARG_31
_PRINT_ASCII_SPACE
add r31, r0, r30
_PRINT_HEX32__ARG_31
_PRINT_ASCII_SPACE
lwi r31, r0, _print_context__buffer_0
_PRINT_HEX32__ARG_31
_PRINT_ASCII_BREAK
mfs r31, rmsr
_PRINT_HEX32__ARG_31
_PRINT_ASCII_SPACE
lwi r31, r0, _current_context_label
_PRINT_HEX32__ARG_31
_PRINT_ASCII_SPACE
lwi r31, r0, _print_context__buffer_0
.endm
.macro _PRINT_ASCII_STOP__VARIABLES
.align 4
_print_ascii_stop__buffer_0: .space 1*4
.endm
.macro _PRINT_ASCII_RUN__VARIABLES
.align 4
_print_ascii_run__buffer_0: .space 1*4
.endm
.macro _PRINT_ASCII_BREAK__VARIABLES
.align 4
_print_ascii_break__buffer_0: .space 1*4
.endm
.macro _PRINT_ASCII_SPACE__VARIABLES
.align 4
_print_ascii_space__buffer_0: .space 1*4
.endm
.macro _PRINT_HEX8__VARIABLES
.align 4
_print_hex8__buffer_0: .space 1*4
.align 4
_print_hex8__buffer_1: .space 1*4
.endm
.macro _PRINT_HEX32__VARIABLES
.align 4
_print_hex32__buffer_0: .space 1*4
.align 4
_print_hex32__buffer_1: .space 1*4
.endm
.macro _PRINT_CONTEXT__VARIABLES
.align 4
_print_context__buffer_0: .space 1*4
.endm