save_and_restore_state.py revision 9896:e31776cf4743
1# Copyright (c) 2013 Andreas Sandberg 2# All rights reserved. 3# 4# Redistribution and use in source and binary forms, with or without 5# modification, are permitted provided that the following conditions are 6# met: redistributions of source code must retain the above copyright 7# notice, this list of conditions and the following disclaimer; 8# redistributions in binary form must reproduce the above copyright 9# notice, this list of conditions and the following disclaimer in the 10# documentation and/or other materials provided with the distribution; 11# neither the name of the copyright holders nor the names of its 12# contributors may be used to endorse or promote products derived from 13# this software without specific prior written permission. 14# 15# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 18# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 19# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 21# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26# 27# Authors: Andreas Sandberg 28 29# Register usage: 30# t1, t2 == temporaries 31# t7 == base address (RIP or SIB) 32 33 34loadX87RegTemplate = ''' 35 ld t1, seg, %(mode)s, "DISPLACEMENT + 32 + 16 * %(idx)i", dataSize=8 36 ld t2, seg, %(mode)s, "DISPLACEMENT + 32 + 16 * %(idx)i + 8", dataSize=2 37 cvtint_fp80 st(%(idx)i), t1, t2 38''' 39 40storeX87RegTemplate = ''' 41 cvtfp80h_int t1, st(%(idx)i) 42 cvtfp80l_int t2, st(%(idx)i) 43 st t1, seg, %(mode)s, "DISPLACEMENT + 32 + 16 * %(idx)i", dataSize=8 44 st t2, seg, %(mode)s, "DISPLACEMENT + 32 + 16 * %(idx)i + 8", dataSize=2 45''' 46 47loadXMMRegTemplate = ''' 48 ldfp "InstRegIndex(FLOATREG_XMM_LOW(%(idx)i))", seg, %(mode)s, \ 49 "DISPLACEMENT + 160 + 16 * %(idx)i", dataSize=8 50 ldfp "InstRegIndex(FLOATREG_XMM_HIGH(%(idx)i))", seg, %(mode)s, \ 51 "DISPLACEMENT + 160 + 16 * %(idx)i + 8", dataSize=8 52''' 53 54storeXMMRegTemplate = ''' 55 stfp "InstRegIndex(FLOATREG_XMM_LOW(%(idx)i))", seg, %(mode)s, \ 56 "DISPLACEMENT + 160 + 16 * %(idx)i", dataSize=8 57 stfp "InstRegIndex(FLOATREG_XMM_HIGH(%(idx)i))", seg, %(mode)s, \ 58 "DISPLACEMENT + 160 + 16 * %(idx)i + 8", dataSize=8 59''' 60 61loadAllDataRegs = \ 62 "".join([loadX87RegTemplate % { "idx" : i, "mode" : "%(mode)s" } 63 for i in range(8)]) + \ 64 "".join([loadXMMRegTemplate % { "idx" : i, "mode" : "%(mode)s" } 65 for i in range(16)]) 66 67storeAllDataRegs = \ 68 "".join([storeX87RegTemplate % { "idx" : i, "mode" : "%(mode)s" } 69 for i in range(8)]) + \ 70 "".join([storeXMMRegTemplate % { "idx" : i, "mode" : "%(mode)s" } 71 for i in range(16)]) 72 73fxsaveCommonTemplate = """ 74 rdval t1, fcw 75 st t1, seg, %(mode)s, "DISPLACEMENT + 0", dataSize=2 76 77 # FSW includes TOP when read 78 rdval t1, fsw 79 st t1, seg, %(mode)s, "DISPLACEMENT + 2", dataSize=2 80 81 # FTW 82 rdxftw t1 83 st t1, seg, %(mode)s, "DISPLACEMENT + 4", dataSize=1 84 85 rdval t1, "InstRegIndex(MISCREG_FOP)" 86 st t1, seg, %(mode)s, "DISPLACEMENT + 6", dataSize=2 87 88 rdval t1, "InstRegIndex(MISCREG_MXCSR)" 89 st t1, seg, %(mode)s, "DISPLACEMENT + 16 + 8", dataSize=4 90 91 # MXCSR_MASK, software assumes the default (0xFFBF) if 0. 92 limm t1, 0xFFFF 93 st t1, seg, %(mode)s, "DISPLACEMENT + 16 + 12", dataSize=4 94""" + storeAllDataRegs 95 96fxsave32Template = """ 97 rdval t1, "InstRegIndex(MISCREG_FIOFF)" 98 st t1, seg, %(mode)s, "DISPLACEMENT + 8", dataSize=4 99 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