source: rtems/cpukit/score/cpu/sparc/sparc-context-volatile-clobber.S @ 2afb22b

5
Last change on this file since 2afb22b was e2b1c47d, checked in by Sebastian Huber <sebastian.huber@…>, on 02/03/17 at 09:16:40

sparc: Fix volatile clobber

Do not adjust the stack pointer, since this is already done by the
restor instruction.

Update #2270.

  • Property mode set to 100644
File size: 3.2 KB
Line 
1/*
2 * Copyright (c) 2015 embedded brains GmbH.  All rights reserved.
3 *
4 *  embedded brains GmbH
5 *  Dornierstr. 4
6 *  82178 Puchheim
7 *  Germany
8 *  <rtems@embedded-brains.de>
9 *
10 * The license and distribution terms for this file may be
11 * found in the file LICENSE in this distribution or at
12 * http://www.rtems.org/license/LICENSE.
13 */
14
15#ifdef HAVE_CONFIG_H
16  #include "config.h"
17#endif
18
19#include <rtems/asm.h>
20#include <rtems/score/cpuimpl.h>
21
22#define SCRATCH_0 (SPARC_MINIMUM_STACK_FRAME_SIZE)
23#define SCRATCH_1 (SCRATCH_0 + 0x04)
24#define FRAME_END (SCRATCH_1 + 0x04)
25#define FRAME_SIZE \
26  ((FRAME_END + CPU_STACK_ALIGNMENT - 1) & ~(CPU_STACK_ALIGNMENT - 1))
27
28.macro clobber_register reg
29        sub     %g2, 1, %g2
30        mov     %g2, \reg
31.endm
32
33.macro clobber_fp_register reg
34        sub     %g2, 1, %g2
35        st      %g2, [%sp + SCRATCH_0]
36        ld      [%sp + SCRATCH_0], \reg
37.endm
38
39        .section        ".bss"
40        .align 4
41
42        /*
43         * Use a global variable to vary the clobbered windows in each
44         * invocation to test the window overflow and underflow conditions.
45         */
46window_clobber_count:
47        .skip   4
48
49        .section        ".text"
50        .align  4
51
52        PUBLIC(_CPU_Context_volatile_clobber)
53SYM(_CPU_Context_volatile_clobber):
54
55        /* Increment number of flushed windows by one */
56        sethi   %hi(window_clobber_count), %o1
57        ld      [%o1 + %lo(window_clobber_count)], %o2
58        add     %o2, 1, %o2
59        st      %o2, [%o1 + %lo(window_clobber_count)]
60
61        /* Clear window counter number */
62        clr     %g1
63
64        /* Save pattern to global register */
65        mov     %o0, %g2
66
67window_clobber:
68
69        /* Switch window */
70
71        save    %sp, -FRAME_SIZE, %sp
72
73        /* Check how many windows shall be flushed */
74        sethi   %hi(window_clobber_count), %o1
75        ld      [%o1 + %lo(window_clobber_count)], %o2
76        st      %o2, [%o1 + %lo(window_clobber_count)]
77        and     %o2, (SPARC_NUMBER_OF_REGISTER_WINDOWS - 1), %o1
78        cmp     %o1, 0
79        bne     no_manual_update
80         nop
81        add     %o1, SPARC_NUMBER_OF_REGISTER_WINDOWS, %o1
82
83no_manual_update:
84        /* Register to determine whether FPU is switched on */
85        mov     %psr, %o2
86        sethi   %hi(SPARC_PSR_EF_MASK), %o3
87        and     %o3, %o2, %o2
88
89        clobber_register        %o3
90        clobber_register        %o4
91        clobber_register        %o5
92        /* Don't overwrite return address $o7 */
93        clobber_register        %g3
94        clobber_register        %g4
95        clobber_register        %y
96
97        cmp     %o2, 0
98        be      window_update_check
99         nop
100
101        clobber_fp_register     %f0
102        clobber_fp_register     %f1
103        clobber_fp_register     %f2
104        clobber_fp_register     %f3
105        clobber_fp_register     %f4
106        clobber_fp_register     %f5
107        clobber_fp_register     %f6
108        clobber_fp_register     %f7
109        clobber_fp_register     %f8
110        clobber_fp_register     %f9
111        clobber_fp_register     %f10
112        clobber_fp_register     %f11
113        clobber_fp_register     %f12
114        clobber_fp_register     %f13
115        clobber_fp_register     %f14
116        clobber_fp_register     %f15
117        clobber_fp_register     %f16
118        clobber_fp_register     %f17
119        clobber_fp_register     %f18
120        clobber_fp_register     %f19
121        clobber_fp_register     %f20
122        clobber_fp_register     %f21
123        clobber_fp_register     %f22
124        clobber_fp_register     %f23
125        clobber_fp_register     %f24
126        clobber_fp_register     %f25
127        clobber_fp_register     %f26
128        clobber_fp_register     %f27
129        clobber_fp_register     %f28
130        clobber_fp_register     %f29
131        clobber_fp_register     %f30
132        clobber_fp_register     %f31
133
134window_update_check:
135
136        /* Counter to how many windows were switched */
137        add     %g1, 1, %g1
138        cmp     %g1, %o1
139        bl      window_clobber
140         nop
141
142restore_check:
143
144        cmp     %g1, 0
145        be      clobber_return
146         nop
147
148        restore
149        sub     %g1, 1, %g1
150        ba      restore_check
151         nop
152
153clobber_return:
154
155        jmp     %o7 + 8
156         nop
Note: See TracBrowser for help on using the repository browser.