save_and_restore_state.py revision 9896:e31776cf4743
14158Sgblack@eecs.umich.edu# Copyright (c) 2013 Andreas Sandberg
24158Sgblack@eecs.umich.edu# All rights reserved.
34158Sgblack@eecs.umich.edu#
44158Sgblack@eecs.umich.edu# Redistribution and use in source and binary forms, with or without
54158Sgblack@eecs.umich.edu# modification, are permitted provided that the following conditions are
64158Sgblack@eecs.umich.edu# met: redistributions of source code must retain the above copyright
74158Sgblack@eecs.umich.edu# notice, this list of conditions and the following disclaimer;
84158Sgblack@eecs.umich.edu# redistributions in binary form must reproduce the above copyright
94158Sgblack@eecs.umich.edu# notice, this list of conditions and the following disclaimer in the
104158Sgblack@eecs.umich.edu# documentation and/or other materials provided with the distribution;
114158Sgblack@eecs.umich.edu# neither the name of the copyright holders nor the names of its
124158Sgblack@eecs.umich.edu# contributors may be used to endorse or promote products derived from
134158Sgblack@eecs.umich.edu# this software without specific prior written permission.
144158Sgblack@eecs.umich.edu#
154158Sgblack@eecs.umich.edu# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
164158Sgblack@eecs.umich.edu# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
174158Sgblack@eecs.umich.edu# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
184158Sgblack@eecs.umich.edu# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
194158Sgblack@eecs.umich.edu# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
204158Sgblack@eecs.umich.edu# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
214158Sgblack@eecs.umich.edu# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
224158Sgblack@eecs.umich.edu# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
234158Sgblack@eecs.umich.edu# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
244158Sgblack@eecs.umich.edu# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
254158Sgblack@eecs.umich.edu# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
264158Sgblack@eecs.umich.edu#
274158Sgblack@eecs.umich.edu# Authors: Andreas Sandberg
284158Sgblack@eecs.umich.edu
294158Sgblack@eecs.umich.edu# Register usage:
304158Sgblack@eecs.umich.edu#  t1, t2 == temporaries
314158Sgblack@eecs.umich.edu#  t7 == base address (RIP or SIB)
324158Sgblack@eecs.umich.edu
334158Sgblack@eecs.umich.edu
344158Sgblack@eecs.umich.eduloadX87RegTemplate =  '''
354158Sgblack@eecs.umich.edu    ld t1, seg, %(mode)s, "DISPLACEMENT + 32 + 16 * %(idx)i", dataSize=8
364158Sgblack@eecs.umich.edu    ld t2, seg, %(mode)s, "DISPLACEMENT + 32 + 16 * %(idx)i + 8", dataSize=2
374158Sgblack@eecs.umich.edu    cvtint_fp80 st(%(idx)i), t1, t2
384158Sgblack@eecs.umich.edu'''
394158Sgblack@eecs.umich.edu
404158Sgblack@eecs.umich.edustoreX87RegTemplate = '''
414158Sgblack@eecs.umich.edu    cvtfp80h_int t1, st(%(idx)i)
424158Sgblack@eecs.umich.edu    cvtfp80l_int t2, st(%(idx)i)
434158Sgblack@eecs.umich.edu    st t1, seg, %(mode)s, "DISPLACEMENT + 32 + 16 * %(idx)i", dataSize=8
444158Sgblack@eecs.umich.edu    st t2, seg, %(mode)s, "DISPLACEMENT + 32 + 16 * %(idx)i + 8", dataSize=2
454158Sgblack@eecs.umich.edu'''
464158Sgblack@eecs.umich.edu
474158Sgblack@eecs.umich.eduloadXMMRegTemplate =  '''
484158Sgblack@eecs.umich.edu    ldfp "InstRegIndex(FLOATREG_XMM_LOW(%(idx)i))", seg, %(mode)s, \
494158Sgblack@eecs.umich.edu         "DISPLACEMENT + 160 + 16 * %(idx)i", dataSize=8
504158Sgblack@eecs.umich.edu    ldfp "InstRegIndex(FLOATREG_XMM_HIGH(%(idx)i))", seg, %(mode)s, \
514158Sgblack@eecs.umich.edu         "DISPLACEMENT + 160 + 16 * %(idx)i + 8", dataSize=8
524158Sgblack@eecs.umich.edu'''
534158Sgblack@eecs.umich.edu
544158Sgblack@eecs.umich.edustoreXMMRegTemplate =  '''
554158Sgblack@eecs.umich.edu    stfp "InstRegIndex(FLOATREG_XMM_LOW(%(idx)i))", seg, %(mode)s, \
564158Sgblack@eecs.umich.edu         "DISPLACEMENT + 160 + 16 * %(idx)i", dataSize=8
574158Sgblack@eecs.umich.edu    stfp "InstRegIndex(FLOATREG_XMM_HIGH(%(idx)i))", seg, %(mode)s, \
584158Sgblack@eecs.umich.edu         "DISPLACEMENT + 160 + 16 * %(idx)i + 8", dataSize=8
594158Sgblack@eecs.umich.edu'''
604158Sgblack@eecs.umich.edu
614158Sgblack@eecs.umich.eduloadAllDataRegs = \
624158Sgblack@eecs.umich.edu    "".join([loadX87RegTemplate % { "idx" : i, "mode" : "%(mode)s" }
634158Sgblack@eecs.umich.edu             for i in range(8)]) + \
644158Sgblack@eecs.umich.edu    "".join([loadXMMRegTemplate % { "idx" : i, "mode" : "%(mode)s" }
654158Sgblack@eecs.umich.edu             for i in range(16)])
664158Sgblack@eecs.umich.edu
674158Sgblack@eecs.umich.edustoreAllDataRegs = \
684158Sgblack@eecs.umich.edu    "".join([storeX87RegTemplate % { "idx" : i, "mode" : "%(mode)s" }
694158Sgblack@eecs.umich.edu             for i in range(8)]) + \
704158Sgblack@eecs.umich.edu    "".join([storeXMMRegTemplate % { "idx" : i, "mode" : "%(mode)s" }
714158Sgblack@eecs.umich.edu             for i in range(16)])
724158Sgblack@eecs.umich.edu
734158Sgblack@eecs.umich.edufxsaveCommonTemplate = """
744158Sgblack@eecs.umich.edu    rdval t1, fcw
754158Sgblack@eecs.umich.edu    st t1, seg, %(mode)s, "DISPLACEMENT + 0", dataSize=2
764158Sgblack@eecs.umich.edu
774158Sgblack@eecs.umich.edu    # FSW includes TOP when read
784158Sgblack@eecs.umich.edu    rdval t1, fsw
794158Sgblack@eecs.umich.edu    st t1, seg, %(mode)s, "DISPLACEMENT + 2", dataSize=2
804158Sgblack@eecs.umich.edu
814158Sgblack@eecs.umich.edu    # FTW
824158Sgblack@eecs.umich.edu    rdxftw t1
834158Sgblack@eecs.umich.edu    st t1, seg, %(mode)s, "DISPLACEMENT + 4", dataSize=1
844158Sgblack@eecs.umich.edu
854158Sgblack@eecs.umich.edu    rdval t1, "InstRegIndex(MISCREG_FOP)"
864158Sgblack@eecs.umich.edu    st t1, seg, %(mode)s, "DISPLACEMENT + 6", dataSize=2
874158Sgblack@eecs.umich.edu
884158Sgblack@eecs.umich.edu    rdval t1, "InstRegIndex(MISCREG_MXCSR)"
894158Sgblack@eecs.umich.edu    st t1, seg, %(mode)s, "DISPLACEMENT + 16 + 8", dataSize=4
904158Sgblack@eecs.umich.edu
914158Sgblack@eecs.umich.edu    # MXCSR_MASK, software assumes the default (0xFFBF) if 0.
924158Sgblack@eecs.umich.edu    limm t1, 0xFFFF
934158Sgblack@eecs.umich.edu    st t1, seg, %(mode)s, "DISPLACEMENT + 16 + 12", dataSize=4
944158Sgblack@eecs.umich.edu""" + storeAllDataRegs
954158Sgblack@eecs.umich.edu
964158Sgblack@eecs.umich.edufxsave32Template = """
974158Sgblack@eecs.umich.edu    rdval t1, "InstRegIndex(MISCREG_FIOFF)"
984158Sgblack@eecs.umich.edu    st t1, seg, %(mode)s, "DISPLACEMENT + 8", dataSize=4
994158Sgblack@eecs.umich.edu
100    rdval t1, "InstRegIndex(MISCREG_FISEG)"
101    st t1, seg, %(mode)s, "DISPLACEMENT + 12", dataSize=2
102
103    rdval t1, "InstRegIndex(MISCREG_FOOFF)"
104    st t1, seg, %(mode)s, "DISPLACEMENT + 16 + 0", dataSize=4
105
106    rdval t1, "InstRegIndex(MISCREG_FOSEG)"
107    st t1, seg, %(mode)s, "DISPLACEMENT + 16 + 4", dataSize=2
108"""
109
110fxsave64Template = """
111    rdval t1, "InstRegIndex(MISCREG_FIOFF)"
112    st t1, seg, %(mode)s, "DISPLACEMENT + 8", dataSize=8
113
114    rdval t1, "InstRegIndex(MISCREG_FOOFF)"
115    st t1, seg, %(mode)s, "DISPLACEMENT + 16 + 0", dataSize=8
116"""
117
118fxrstorCommonTemplate = """
119    ld t1, seg, %(mode)s, "DISPLACEMENT + 0", dataSize=2
120    wrval fcw, t1
121
122    # FSW includes TOP when read
123    ld t1, seg, %(mode)s, "DISPLACEMENT + 2", dataSize=2
124    wrval fsw, t1
125    srli t1, t1, 11, dataSize=2
126    andi t1, t1, 0x7, dataSize=2
127    wrval "InstRegIndex(MISCREG_X87_TOP)", t1
128
129    # FTW
130    ld t1, seg, %(mode)s, "DISPLACEMENT + 4", dataSize=1
131    wrxftw t1
132
133    ld t1, seg, %(mode)s, "DISPLACEMENT + 6", dataSize=2
134    wrval "InstRegIndex(MISCREG_FOP)", t1
135
136    ld t1, seg, %(mode)s, "DISPLACEMENT + 16 + 8", dataSize=4
137    wrval "InstRegIndex(MISCREG_MXCSR)", t1
138""" + loadAllDataRegs
139
140fxrstor32Template = """
141    ld t1, seg, %(mode)s, "DISPLACEMENT + 8", dataSize=4
142    wrval "InstRegIndex(MISCREG_FIOFF)", t1
143
144    ld t1, seg, %(mode)s, "DISPLACEMENT + 12", dataSize=2
145    wrval "InstRegIndex(MISCREG_FISEG)", t1
146
147    ld t1, seg, %(mode)s, "DISPLACEMENT + 16 + 0", dataSize=4
148    wrval "InstRegIndex(MISCREG_FOOFF)", t1
149
150    ld t1, seg, %(mode)s, "DISPLACEMENT + 16 + 4", dataSize=2
151    wrval "InstRegIndex(MISCREG_FOSEG)", t1
152"""
153
154fxrstor64Template = """
155    limm t2, 0, dataSize=8
156
157    ld t1, seg, %(mode)s, "DISPLACEMENT + 8", dataSize=8
158    wrval "InstRegIndex(MISCREG_FIOFF)", t1
159    wrval "InstRegIndex(MISCREG_FISEG)", t2
160
161    ld t1, seg, %(mode)s, "DISPLACEMENT + 16 + 0", dataSize=8
162    wrval "InstRegIndex(MISCREG_FOOFF)", t1
163    wrval "InstRegIndex(MISCREG_FOSEG)", t2
164"""
165
166microcode = '''
167def macroop FXSAVE_M {
168''' + fxsave32Template % { "mode" : "sib" } + '''
169};
170
171def macroop FXSAVE_P {
172    rdip t7
173''' + fxsave32Template % { "mode" : "riprel" } + '''
174};
175
176def macroop FXSAVE64_M {
177''' + fxsave64Template % { "mode" : "sib" } + '''
178};
179
180def macroop FXSAVE64_P {
181    rdip t7
182''' + fxsave64Template % { "mode" : "riprel" } + '''
183};
184
185def macroop FXRSTOR_M {
186''' + fxrstor32Template % { "mode" : "sib" } + '''
187};
188
189def macroop FXRSTOR_P {
190    rdip t7
191''' + fxrstor32Template % { "mode" : "riprel" } + '''
192};
193
194def macroop FXRSTOR64_M {
195''' + fxrstor64Template % { "mode" : "sib" } + '''
196};
197
198def macroop FXRSTOR64_P {
199    rdip t7
200''' + fxrstor64Template % { "mode" : "riprel" } + '''
201};
202'''
203