summaryrefslogtreecommitdiffstats
path: root/src/ssx/ppc405/ppc405_thread_init.S
blob: 8b5392c33cbb64c6171be308bd0d867e80c691f5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# IBM_PROLOG_BEGIN_TAG
# This is an automatically generated prolog.
#
# $Source: src/ssx/ppc405/ppc405_thread_init.S $
#
# OpenPOWER OnChipController Project
#
# Contributors Listed Below - COPYRIGHT 2014,2016
# [+] International Business Machines Corp.
#
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied. See the License for the specific language governing
# permissions and limitations under the License.
#
# IBM_PROLOG_END_TAG

/// \file ppc405_thread_init.S
/// \brief PPC405-specific thread initialization
///
/// The entry points in this file are routines that are typically used during
/// initialization, and their code space could be deallocated and recovered if
/// no longer needed by the application after initialization.
// *INDENT-OFF*

        .nolist
#include "ssx.h"
        .list
        
/// \fn void __ssx_thread_context_initialize(SsxThread *thread, SsxThreadRoutine thread_routine, void *private)
/// \brief Create the initial thread context on the stack
///
/// The non-reserved GPRs are prepatterned with 0x0000\<rn\>\<rn\> where \<rn\> is
/// the register number (as decimal).  The initial context is set up with the
/// thread running in the default machine context, and when the thread is
/// switched in it will begin executing at the entry point of the thread
/// routine with the \c private parameter in R3.  The LR is initialized such
/// that when the thread returns, it will return to the entry point of \c
/// ssx_complete().
#ifdef DOXYGEN_ONLY
void 
__ssx_thread_context_initialize(SsxThread        *thread, 
                                SsxThreadRoutine thread_routine, 
                                void             *private);
#endif
        
/// \cond

        .global_function __ssx_thread_context_initialize

__ssx_thread_context_initialize:

        ## R3 = thread (param)
        ## R4 = thread_routine (param)
        ## R5 = private (param)
        ## R6 = thread stack pointer (computed)
        ## R7 = scratch

        .macro  _gpr_init, prefix, reg, val
        li      %r7, \val
        stw     %r7, \prefix\reg(%r6)
        .endm

        ## Initialize a fast context on the thread stack. The CR is cleared,
        ## the LR = ssx_complete(), R3 has the private parameter.

        lwz     %r6, SSX_THREAD_OFFSET_SAVED_STACK_POINTER(%r3)
        
        stwu    %r6, -SSX_FAST_CTX_SIZE(%r6)

        li      %r7, 0
        stw     %r7, SSX_FAST_CTX_CR(%r6)

        _liw    %r7, ssx_complete
        stw     %r7, SSX_FAST_CTX_LR(%r6)

        stw     %r5, SSX_FAST_CTX_GPR3(%r6)

        _gpr_init SSX_FAST_CTX_GPR, 4, 0x0404
        _gpr_init SSX_FAST_CTX_GPR, 5, 0x0505
        _gpr_init SSX_FAST_CTX_GPR, 6, 0x0606
        _gpr_init SSX_FAST_CTX_GPR, 7, 0x0707

        ## Initialize the (volatile - fast) context on the thread stack.  XER
        ## and CTR are clear, SRR0 = thread_routine, SRR1 = default machine
        ## context.

        stwu    %r6, -SSX_VOL_FAST_CTX_SIZE(%r6)

        li      %r7, 0
        stw     %r7, SSX_VOL_FAST_CTX_XER(%r6)
        stw     %r7, SSX_VOL_FAST_CTX_CTR(%r6)

        stw     %r4, SSX_VOL_FAST_CTX_SRR0(%r6)

        _lwzsd  %r7, __ssx_thread_machine_context_default
        stw     %r7, SSX_VOL_FAST_CTX_SRR1(%r6)

        _gpr_init SSX_VOL_FAST_CTX_GPR, 0,  0x0000
        _gpr_init SSX_VOL_FAST_CTX_GPR, 8,  0x0808
        _gpr_init SSX_VOL_FAST_CTX_GPR, 9,  0x0909
        _gpr_init SSX_VOL_FAST_CTX_GPR, 10, 0x1010
        _gpr_init SSX_VOL_FAST_CTX_GPR, 11  0x1111
        _gpr_init SSX_VOL_FAST_CTX_GPR, 12  0x1212

        ## Initialize the non-volatile context on the thread stack.

        stwu    %r6, -SSX_NON_VOL_CTX_SIZE(%r6)

        _gpr_init SSX_NON_VOL_CTX_GPR, 14, 0x1414       
        _gpr_init SSX_NON_VOL_CTX_GPR, 15, 0x1515       
        _gpr_init SSX_NON_VOL_CTX_GPR, 16, 0x1616       
        _gpr_init SSX_NON_VOL_CTX_GPR, 17, 0x1717       
        _gpr_init SSX_NON_VOL_CTX_GPR, 18, 0x1818       
        _gpr_init SSX_NON_VOL_CTX_GPR, 19, 0x1919       
        _gpr_init SSX_NON_VOL_CTX_GPR, 20, 0x2020       
        _gpr_init SSX_NON_VOL_CTX_GPR, 21, 0x2121       
        _gpr_init SSX_NON_VOL_CTX_GPR, 22, 0x2222       
        _gpr_init SSX_NON_VOL_CTX_GPR, 23, 0x2323       
        _gpr_init SSX_NON_VOL_CTX_GPR, 24, 0x2424       
        _gpr_init SSX_NON_VOL_CTX_GPR, 25, 0x2525       
        _gpr_init SSX_NON_VOL_CTX_GPR, 26, 0x2626       
        _gpr_init SSX_NON_VOL_CTX_GPR, 27, 0x2727       
        _gpr_init SSX_NON_VOL_CTX_GPR, 28, 0x2828       
        _gpr_init SSX_NON_VOL_CTX_GPR, 29, 0x2929       
        _gpr_init SSX_NON_VOL_CTX_GPR, 30, 0x3030       
        _gpr_init SSX_NON_VOL_CTX_GPR, 31, 0x3131

        ## Initialization is done - the stack pointer is stored back in the
        ## thread.

        stw     %r6, SSX_THREAD_OFFSET_SAVED_STACK_POINTER(%r3)
        blr

        .epilogue __ssx_thread_context_initialize

// *INDENT-ON*
/// \endcond
OpenPOWER on IntegriCloud