Back to home page

LXR

 
 

    


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

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /*
0004  * Copyright (c) 2013 embedded brains GmbH & Co. KG
0005  *
0006  * Redistribution and use in source and binary forms, with or without
0007  * modification, are permitted provided that the following conditions
0008  * are met:
0009  * 1. Redistributions of source code must retain the above copyright
0010  *    notice, this list of conditions and the following disclaimer.
0011  * 2. Redistributions in binary form must reproduce the above copyright
0012  *    notice, this list of conditions and the following disclaimer in the
0013  *    documentation and/or other materials provided with the distribution.
0014  *
0015  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0016  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0017  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0018  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0019  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0020  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0021  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0022  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0023  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0024  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0025  * POSSIBILITY OF SUCH DAMAGE.
0026  */
0027 
0028 #ifdef HAVE_CONFIG_H
0029 #include "config.h"
0030 #endif
0031 
0032 #include <rtems/asm.h>
0033 
0034 #define FRAME_OFFSET_R16 0
0035 #define FRAME_OFFSET_R17 4
0036 #define FRAME_OFFSET_R18 8
0037 #define FRAME_OFFSET_R19 12
0038 #define FRAME_OFFSET_R20 16
0039 #define FRAME_OFFSET_R21 20
0040 #define FRAME_OFFSET_R22 24
0041 #define FRAME_OFFSET_R23 28
0042 #define FRAME_OFFSET_FP 32
0043 #define FRAME_OFFSET_RA 36
0044 
0045 #define FRAME_SIZE (FRAME_OFFSET_RA + 4)
0046 
0047     .set    noat
0048     .section    .text
0049 
0050     .global _CPU_Context_validate
0051 
0052 _CPU_Context_validate:
0053 
0054     /* Save */
0055     subi    sp, sp, FRAME_SIZE
0056     stw r16, FRAME_OFFSET_R16(sp)
0057     stw r17, FRAME_OFFSET_R17(sp)
0058     stw r18, FRAME_OFFSET_R18(sp)
0059     stw r19, FRAME_OFFSET_R19(sp)
0060     stw r20, FRAME_OFFSET_R20(sp)
0061     stw r21, FRAME_OFFSET_R21(sp)
0062     stw r22, FRAME_OFFSET_R22(sp)
0063     stw r23, FRAME_OFFSET_R23(sp)
0064     stw fp, FRAME_OFFSET_FP(sp)
0065     stw ra, FRAME_OFFSET_RA(sp)
0066 
0067     /* Fill */
0068 
0069     /* AT contains the stack pointer */
0070     mov at, sp
0071 
0072     /* R2 is used for temporary values */
0073 
0074     subi    r3, r4, 1
0075     addi    r5, r4, 1
0076     addi    r6, r4, 2
0077     addi    r7, r4, 3
0078     addi    r8, r4, 4
0079     addi    r9, r4, 5
0080     addi    r10, r4, 6
0081     addi    r11, r4, 7
0082     addi    r12, r4, 8
0083     addi    r13, r4, 9
0084     addi    r14, r4, 10
0085     addi    r15, r4, 11
0086     addi    r16, r4, 12
0087     addi    r17, r4, 13
0088     addi    r18, r4, 14
0089     addi    r19, r4, 15
0090     addi    r20, r4, 16
0091     addi    r21, r4, 17
0092     addi    r22, r4, 18
0093     addi    r23, r4, 19
0094     addi    fp, r4, 20
0095     addi    ra, r4, 21
0096 
0097     /* Check */
0098 check:
0099     bne sp, at, restore
0100     subi    r2, r4, 1
0101     bne r2, r3, restore
0102     addi    r2, r4, 1
0103     bne r2, r5, restore
0104     addi    r2, r4, 2
0105     bne r2, r6, restore
0106     addi    r2, r4, 3
0107     bne r2, r7, restore
0108     addi    r2, r4, 4
0109     bne r2, r8, restore
0110     addi    r2, r4, 5
0111     bne r2, r9, restore
0112     addi    r2, r4, 6
0113     bne r2, r10, restore
0114     addi    r2, r4, 7
0115     bne r2, r11, restore
0116     addi    r2, r4, 8
0117     bne r2, r12, restore
0118     addi    r2, r4, 9
0119     bne r2, r13, restore
0120     addi    r2, r4, 10
0121     bne r2, r14, restore
0122     addi    r2, r4, 11
0123     bne r2, r15, restore
0124     addi    r2, r4, 12
0125     bne r2, r16, restore
0126     addi    r2, r4, 13
0127     bne r2, r17, restore
0128     addi    r2, r4, 14
0129     bne r2, r18, restore
0130     addi    r2, r4, 15
0131     bne r2, r19, restore
0132     addi    r2, r4, 16
0133     bne r2, r20, restore
0134     addi    r2, r4, 17
0135     bne r2, r21, restore
0136     addi    r2, r4, 18
0137     bne r2, r22, restore
0138     addi    r2, r4, 19
0139     bne r2, r23, restore
0140     addi    r2, r4, 20
0141     bne r2, fp, restore
0142     addi    r2, r4, 21
0143     bne r2, ra, restore
0144     br  check
0145 
0146     /* Restore */
0147 restore:
0148     ldw ra, FRAME_OFFSET_RA(sp)
0149     ldw fp, FRAME_OFFSET_FP(sp)
0150     ldw r23, FRAME_OFFSET_R23(sp)
0151     ldw r22, FRAME_OFFSET_R22(sp)
0152     ldw r21, FRAME_OFFSET_R21(sp)
0153     ldw r20, FRAME_OFFSET_R20(sp)
0154     ldw r19, FRAME_OFFSET_R19(sp)
0155     ldw r18, FRAME_OFFSET_R18(sp)
0156     ldw r17, FRAME_OFFSET_R17(sp)
0157     ldw r16, FRAME_OFFSET_R16(sp)
0158     addi    sp, sp, FRAME_SIZE
0159     ret