segmentation.py revision 5937
1# Copyright (c) 2007 The Hewlett-Packard Development Company 2# All rights reserved. 3# 4# Redistribution and use of this software in source and binary forms, 5# with or without modification, are permitted provided that the 6# following conditions are met: 7# 8# The software must be used only for Non-Commercial Use which means any 9# use which is NOT directed to receiving any direct monetary 10# compensation for, or commercial advantage from such use. Illustrative 11# examples of non-commercial use are academic research, personal study, 12# teaching, education and corporate research & development. 13# Illustrative examples of commercial use are distributing products for 14# commercial advantage and providing services using the software for 15# commercial advantage. 16# 17# If you wish to use this software or functionality therein that may be 18# covered by patents for commercial use, please contact: 19# Director of Intellectual Property Licensing 20# Office of Strategy and Technology 21# Hewlett-Packard Company 22# 1501 Page Mill Road 23# Palo Alto, California 94304 24# 25# Redistributions of source code must retain the above copyright notice, 26# this list of conditions and the following disclaimer. Redistributions 27# in binary form must reproduce the above copyright notice, this list of 28# conditions and the following disclaimer in the documentation and/or 29# other materials provided with the distribution. Neither the name of 30# the COPYRIGHT HOLDER(s), HEWLETT-PACKARD COMPANY, nor the names of its 31# contributors may be used to endorse or promote products derived from 32# this software without specific prior written permission. No right of 33# sublicense is granted herewith. Derivatives of the software and 34# output created using the software may be prepared, but only for 35# Non-Commercial Uses. Derivatives of the software may be shared with 36# others provided: (i) the others agree to abide by the list of 37# conditions herein which includes the Non-Commercial Use restrictions; 38# and (ii) such Derivatives of the software include the above copyright 39# notice to acknowledge the contribution from this software where 40# applicable, this list of conditions and the disclaimer below. 41# 42# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 43# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 44# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 45# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 46# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 47# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 48# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 49# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 50# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 51# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 52# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 53# 54# Authors: Gabe Black 55 56microcode = ''' 57def macroop LGDT_M 58{ 59 .adjust_env maxOsz 60 61 # Get the limit 62 ld t1, seg, sib, disp, dataSize=2 63 # Get the base 64 ld t2, seg, sib, 'adjustedDisp + 2' 65 wrbase tsg, t2 66 wrlimit tsg, t1 67}; 68 69def macroop LGDT_P 70{ 71 .adjust_env maxOsz 72 73 rdip t7 74 # Get the limit 75 ld t1, seg, riprel, disp, dataSize=2 76 # Get the base 77 ld t2, seg, riprel, 'adjustedDisp + 2' 78 wrbase tsg, t2 79 wrlimit tsg, t1 80}; 81 82# 83# These versions are for when the original data size was 16 bits. The base is 84# still 32 bits, but the top byte is zeroed before being used. 85# 86 87def macroop LGDT_16_M 88{ 89 .adjust_env maxOsz 90 91 # Get the limit 92 ld t1, seg, sib, disp, dataSize=2 93 # Get the base 94 ld t2, seg, sib, 'adjustedDisp + 2', dataSize=4 95 zexti t2, t2, 23, dataSize=8 96 wrbase tsg, t2 97 wrlimit tsg, t1 98}; 99 100def macroop LGDT_16_P 101{ 102 .adjust_env maxOsz 103 104 rdip t7 105 # Get the limit 106 ld t1, seg, riprel, disp, dataSize=2 107 # Get the base 108 ld t2, seg, riprel, 'adjustedDisp + 2', dataSize=4 109 zexti t2, t2, 23, dataSize=8 110 wrbase tsg, t2 111 wrlimit tsg, t1 112}; 113 114def macroop LIDT_M 115{ 116 .adjust_env maxOsz 117 118 # Get the limit 119 ld t1, seg, sib, disp, dataSize=2 120 # Get the base 121 ld t2, seg, sib, 'adjustedDisp + 2' 122 wrbase idtr, t2 123 wrlimit idtr, t1 124}; 125 126def macroop LIDT_P 127{ 128 .adjust_env maxOsz 129 130 rdip t7 131 # Get the limit 132 ld t1, seg, riprel, disp, dataSize=2 133 # Get the base 134 ld t2, seg, riprel, 'adjustedDisp + 2' 135 wrbase idtr, t2 136 wrlimit idtr, t1 137}; 138 139# 140# These versions are for when the original data size was 16 bits. The base is 141# still 32 bits, but the top byte is zeroed before being used. 142# 143 144def macroop LIDT_16_M 145{ 146 .adjust_env maxOsz 147 148 # Get the limit 149 ld t1, seg, sib, disp, dataSize=2 150 # Get the base 151 ld t2, seg, sib, 'adjustedDisp + 2', dataSize=4 152 zexti t2, t2, 23, dataSize=8 153 wrbase idtr, t2 154 wrlimit idtr, t1 155}; 156 157def macroop LIDT_16_P 158{ 159 .adjust_env maxOsz 160 161 rdip t7 162 # Get the limit 163 ld t1, seg, riprel, disp, dataSize=2 164 # Get the base 165 ld t2, seg, riprel, 'adjustedDisp + 2', dataSize=4 166 zexti t2, t2, 23, dataSize=8 167 wrbase idtr, t2 168 wrlimit idtr, t1 169}; 170 171def macroop LTR_R 172{ 173 chks reg, t0, TRCheck 174 limm t4, 0 175 srli t4, reg, 3, dataSize=2 176 ldst t1, tsg, [8, t4, t0], dataSize=8 177 ld t2, tsg, [8, t4, t0], 8, dataSize=8 178 chks reg, t1, TSSCheck 179 wrdh t3, t1, t2 180 wrdl tr, t1, reg 181 wrbase tr, t3, dataSize=8 182 ori t1, t1, (1 << 9) 183 st t1, tsg, [8, t4, t0], dataSize=8 184}; 185 186def macroop LTR_M 187{ 188 ld t5, seg, sib, disp, dataSize=2 189 chks t5, t0, TRCheck 190 limm t4, 0 191 srli t4, t5, 3, dataSize=2 192 ldst t1, tsg, [8, t4, t0], dataSize=8 193 ld t2, tsg, [8, t4, t0], 8, dataSize=8 194 chks t5, t1, TSSCheck 195 wrdh t3, t1, t2 196 wrdl tr, t1, t5 197 wrbase tr, t3, dataSize=8 198 ori t1, t1, (1 << 9) 199 st t1, tsg, [8, t4, t0], dataSize=8 200}; 201 202def macroop LTR_P 203{ 204 rdip t7 205 ld t5, seg, riprel, disp, dataSize=2 206 chks t5, t0, TRCheck 207 limm t4, 0 208 srli t4, t5, 3, dataSize=2 209 ldst t1, tsg, [8, t4, t0], dataSize=8 210 ld t2, tsg, [8, t4, t0], 8, dataSize=8 211 chks t5, t1, TSSCheck 212 wrdh t3, t1, t2 213 wrdl tr, t1, t5 214 wrbase tr, t3, dataSize=8 215 ori t1, t1, (1 << 9) 216 st t1, tsg, [8, t4, t0], dataSize=8 217}; 218 219def macroop LLDT_R 220{ 221 chks reg, t0, InGDTCheck, flags=(EZF,) 222 br label("end"), flags=(CEZF,) 223 limm t4, 0 224 srli t4, reg, 3, dataSize=2 225 ldst t1, tsg, [8, t4, t0], dataSize=8 226 ld t2, tsg, [8, t4, t0], 8, dataSize=8 227 chks reg, t1, LDTCheck 228 wrdh t3, t1, t2 229 wrdl tr, t1, reg 230 wrbase tr, t3, dataSize=8 231end: 232 fault "NoFault" 233}; 234 235def macroop LLDT_M 236{ 237 ld t5, seg, sib, disp, dataSize=2 238 chks t5, t0, InGDTCheck, flags=(EZF,) 239 br label("end"), flags=(CEZF,) 240 limm t4, 0 241 srli t4, t5, 3, dataSize=2 242 ldst t1, tsg, [8, t4, t0], dataSize=8 243 ld t2, tsg, [8, t4, t0], 8, dataSize=8 244 chks t5, t1, LDTCheck 245 wrdh t3, t1, t2 246 wrdl tr, t1, t5 247 wrbase tr, t3, dataSize=8 248end: 249 fault "NoFault" 250}; 251 252def macroop LLDT_P 253{ 254 rdip t7 255 ld t5, seg, riprel, disp, dataSize=2 256 chks t5, t0, InGDTCheck, flags=(EZF,) 257 br label("end"), flags=(CEZF,) 258 limm t4, 0 259 srli t4, t5, 3, dataSize=2 260 ldst t1, tsg, [8, t4, t0], dataSize=8 261 ld t2, tsg, [8, t4, t0], 8, dataSize=8 262 chks t5, t1, LDTCheck 263 wrdh t3, t1, t2 264 wrdl tr, t1, t5 265 wrbase tr, t3, dataSize=8 266end: 267 fault "NoFault" 268}; 269 270def macroop SWAPGS 271{ 272 rdval t1, kernel_gs_base, dataSize=8 273 rdbase t2, gs, dataSize=8 274 wrbase gs, t1, dataSize=8 275 wrval kernel_gs_base, t2, dataSize=8 276}; 277''' 278