Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:24:24

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /**
0004  *  @file
0005  *
0006  *  @ingroup RTEMSScoreCPUMicroBlaze
0007  *
0008  *  @brief MicroBlaze context validate implementation
0009  */
0010 
0011 /*
0012  * COPYRIGHT (C) 2021 On-Line Applications Research Corporation (OAR).
0013  *
0014  * Redistribution and use in source and binary forms, with or without
0015  * modification, are permitted provided that the following conditions
0016  * are met:
0017  * 1. Redistributions of source code must retain the above copyright
0018  *    notice, this list of conditions and the following disclaimer.
0019  * 2. Redistributions in binary form must reproduce the above copyright
0020  *    notice, this list of conditions and the following disclaimer in the
0021  *    documentation and/or other materials provided with the distribution.
0022  *
0023  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0024  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0025  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0026  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0027  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0028  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0029  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0030  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0031  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0032  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0033  * POSSIBILITY OF SUCH DAMAGE.
0034  */
0035 
0036 #ifdef HAVE_CONFIG_H
0037   #include "config.h"
0038 #endif
0039 
0040 #include <rtems/asm.h>
0041 
0042 #define FRAME_OFFSET_R19 0
0043 #define FRAME_OFFSET_R20 4
0044 #define FRAME_OFFSET_R21 8
0045 #define FRAME_OFFSET_R22 12
0046 #define FRAME_OFFSET_R23 16
0047 #define FRAME_OFFSET_R24 20
0048 #define FRAME_OFFSET_R25 24
0049 #define FRAME_OFFSET_R26 28
0050 #define FRAME_OFFSET_R27 32
0051 #define FRAME_OFFSET_R28 36
0052 #define FRAME_OFFSET_R29 40
0053 #define FRAME_OFFSET_R30 44
0054 #define FRAME_OFFSET_R31 48
0055 
0056 #define FRAME_SIZE (FRAME_OFFSET_R31 + 4)
0057 
0058 .text
0059 .align 4
0060 
0061 PUBLIC(_CPU_Context_validate)
0062 
0063 SYM(_CPU_Context_validate):
0064 
0065     /* Save */
0066     addik r1, r1, -FRAME_SIZE
0067     swi r19, r1, FRAME_OFFSET_R19
0068     swi r20, r1, FRAME_OFFSET_R20
0069     swi r21, r1, FRAME_OFFSET_R21
0070     swi r22, r1, FRAME_OFFSET_R22
0071     swi r23, r1, FRAME_OFFSET_R23
0072     swi r24, r1, FRAME_OFFSET_R24
0073     swi r25, r1, FRAME_OFFSET_R25
0074     swi r26, r1, FRAME_OFFSET_R26
0075     swi r27, r1, FRAME_OFFSET_R27
0076     swi r28, r1, FRAME_OFFSET_R28
0077     swi r29, r1, FRAME_OFFSET_R29
0078     swi r30, r1, FRAME_OFFSET_R30
0079     swi r31, r1, FRAME_OFFSET_R31
0080 
0081     /* Fill */
0082 
0083     add r4, r0, r3
0084 
0085     /* r7 contains the stack pointer */
0086     add r7, r0, r1
0087 
0088 .macro fill_register reg
0089     addi r4, r4, 1
0090     add \reg, r0, r4
0091 .endm
0092 
0093     fill_register r21
0094     fill_register r22
0095     fill_register r23
0096     fill_register r24
0097     fill_register r25
0098     fill_register r26
0099     fill_register r27
0100     fill_register r28
0101     fill_register r29
0102     fill_register r30
0103     fill_register r31
0104 
0105     /* Check */
0106 check:
0107 
0108 .macro check_register reg
0109     addi r4, r4, 1
0110     cmp r6, \reg, r4
0111     bnei r6, restore
0112 .endm
0113 
0114     cmp r6, r7, r1
0115     bnei r6, restore
0116 
0117     add r4, r0, r3
0118 
0119     check_register r21
0120     check_register r22
0121     check_register r23
0122     check_register r24
0123     check_register r25
0124     check_register r26
0125     check_register r27
0126     check_register r28
0127     check_register r29
0128     check_register r30
0129     check_register r31
0130 
0131     brai check
0132 
0133     /* Restore */
0134 restore:
0135 
0136     lwi r19, r1, FRAME_OFFSET_R19
0137     lwi r20, r1, FRAME_OFFSET_R20
0138     lwi r21, r1, FRAME_OFFSET_R21
0139     lwi r22, r1, FRAME_OFFSET_R22
0140     lwi r23, r1, FRAME_OFFSET_R23
0141     lwi r24, r1, FRAME_OFFSET_R24
0142     lwi r25, r1, FRAME_OFFSET_R25
0143     lwi r26, r1, FRAME_OFFSET_R26
0144     lwi r27, r1, FRAME_OFFSET_R27
0145     lwi r28, r1, FRAME_OFFSET_R28
0146     lwi r29, r1, FRAME_OFFSET_R29
0147     lwi r30, r1, FRAME_OFFSET_R30
0148     lwi r31, r1, FRAME_OFFSET_R31
0149 
0150     addik r1, r1, FRAME_SIZE
0151 
0152     bra r15