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