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) 2014 Hesham ALMatary <heshamelmatary@gmail.com>
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 #include <rtems/score/cpu.h>
0034 
0035 .section    .text
0036 
0037 PUBLIC(_CPU_Context_validate)
0038 SYM(_CPU_Context_validate):
0039 
0040   l.addi r1, r1, -140
0041 
0042   l.sw  8(r1), r2
0043   l.sw  12(r1), r3
0044   l.sw  16(r1), r4
0045   l.sw  20(r1), r5
0046   l.sw  24(r1), r6
0047   l.sw  28(r1), r7
0048   l.sw  32(r1), r8
0049   l.sw  36(r1), r9
0050   l.sw  40(r1), r10
0051   l.sw  44(r1), r11
0052   l.sw  48(r1), r12
0053   l.sw  52(r1), r13
0054   l.sw  56(r1), r14
0055   l.sw  60(r1), r15
0056   l.sw  64(r1), r16
0057   l.sw  68(r1), r17
0058   l.sw  72(r1), r18
0059   l.sw  76(r1), r19
0060   l.sw  80(r1), r20
0061   l.sw  84(r1), r21
0062   l.sw  88(r1), r22
0063   l.sw  92(r1), r23
0064   l.sw  96(r1), r24
0065   l.sw  100(r1), r25
0066   l.sw  104(r1), r26
0067   l.sw  108(r1), r27
0068   l.sw  112(r1), r28
0069   l.sw  116(r1), r29
0070   l.sw  120(r1), r30
0071   l.sw  124(r1), r31
0072 
0073   /* Fill */
0074 
0075   /* r13 is used for temporary values */
0076   l.add r13, r0, r0
0077 
0078   /* r31 contains the stack pointer */
0079   l.add r31, r1, r0
0080 
0081 .macro fill_register reg
0082   l.addi    r13, r13, 1
0083   l.addi    \reg, r13, 0
0084 .endm
0085 
0086   fill_register r2
0087   fill_register r3
0088   fill_register r4
0089   fill_register r5
0090   fill_register r6
0091   fill_register r7
0092   fill_register r8
0093   fill_register r9
0094   fill_register r10
0095   fill_register r11
0096   fill_register r12
0097   fill_register r13
0098   fill_register r14
0099   fill_register r15
0100   fill_register r16
0101   fill_register r17
0102   fill_register r18
0103   fill_register r19
0104   fill_register r20
0105   fill_register r21
0106   fill_register r22
0107   fill_register r23
0108   fill_register r24
0109   fill_register r25
0110   fill_register r26
0111   fill_register r27
0112   fill_register r28
0113   fill_register r29
0114   fill_register r30
0115   fill_register r31
0116 
0117     /* Check */
0118 check:
0119 
0120 .macro check_register reg
0121     l.addi r13, r13, 1
0122     l.sfne \reg, r13
0123     l.bf   restore
0124     l.nop
0125 .endm
0126 
0127     l.sfne r31, r1
0128     l.bf restore
0129     l.nop
0130 
0131     l.addi r13, r0, 0
0132 
0133     check_register  r2
0134     check_register  r3
0135     check_register  r4
0136     check_register  r5
0137     check_register  r6
0138     check_register  r7
0139     check_register  r8
0140     check_register  r9
0141     check_register  r10
0142   check_register    r11
0143   check_register    r12
0144   check_register    r13
0145   check_register    r14
0146   check_register    r15
0147   check_register    r16
0148   check_register    r17
0149   check_register    r18
0150   check_register    r19
0151   check_register    r20
0152     check_register  r21
0153     check_register  r22
0154     check_register  r23
0155     check_register  r24
0156     check_register  r25
0157     check_register  r26
0158     check_register  r27
0159     check_register  r28
0160     check_register  r29
0161     check_register  r30
0162     check_register  r31
0163 
0164     l.j check
0165     l.nop
0166 
0167 /* Restore */
0168 restore:
0169 
0170   l.lwz  r2,  8(r1)
0171   l.lwz  r3,  12(r1)
0172   l.lwz  r4,  16(r1)
0173   l.lwz  r5,  20(r1)
0174   l.lwz  r6,  24(r1)
0175   l.lwz  r7,  28(r1)
0176   l.lwz  r8,  32(r1)
0177   l.lwz  r9,  36(r1)
0178   l.lwz  r10, 40(r1)
0179   l.lwz  r11, 44(r1)
0180   l.lwz  r12, 48(r1)
0181   l.lwz  r13, 52(r1)
0182   l.lwz  r14, 56(r1)
0183   l.lwz  r15, 60(r1)
0184   l.lwz  r16, 64(r1)
0185   l.lwz  r17, 68(r1)
0186   l.lwz  r18, 72(r1)
0187   l.lwz  r19, 76(r1)
0188   l.lwz  r20, 80(r1)
0189   l.lwz  r21, 84(r1)
0190   l.lwz  r22, 88(r1)
0191   l.lwz  r23, 92(r1)
0192   l.lwz  r24, 96(r1)
0193   l.lwz  r25, 100(r1)
0194   l.lwz  r26, 104(r1)
0195   l.lwz  r27, 108(r1)
0196   l.lwz  r28, 112(r1)
0197   l.lwz  r29, 116(r1)
0198   l.lwz  r30, 120(r1)
0199   l.lwz  r31, 124(r1)
0200 
0201   l.addi r1, r1, 140
0202 
0203   l.jr r9
0204   l.nop