segmentation.py revision 6644:57fba079b7ff
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, dataSize=8 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 limm t5, (1 << 9) 183 or t1, t1, t5 184 st t1, tsg, [8, t4, t0], dataSize=8 185}; 186 187def macroop LTR_M 188{ 189 ld t5, seg, sib, disp, dataSize=2 190 chks t5, t0, TRCheck 191 limm t4, 0, dataSize=8 192 srli t4, t5, 3, dataSize=2 193 ldst t1, tsg, [8, t4, t0], dataSize=8 194 ld t2, tsg, [8, t4, t0], 8, dataSize=8 195 chks t5, t1, TSSCheck 196 wrdh t3, t1, t2 197 wrdl tr, t1, t5 198 wrbase tr, t3, dataSize=8 199 limm t5, (1 << 9) 200 or t1, t1, t5 201 st t1, tsg, [8, t4, t0], dataSize=8 202}; 203 204def macroop LTR_P 205{ 206 rdip t7 207 ld t5, seg, riprel, disp, dataSize=2 208 chks t5, t0, TRCheck 209 limm t4, 0, dataSize=8 210 srli t4, t5, 3, dataSize=2 211 ldst t1, tsg, [8, t4, t0], dataSize=8 212 ld t2, tsg, [8, t4, t0], 8, dataSize=8 213 chks t5, t1, TSSCheck 214 wrdh t3, t1, t2 215 wrdl tr, t1, t5 216 wrbase tr, t3, dataSize=8 217 limm t5, (1 << 9) 218 or t1, t1, t5 219 st t1, tsg, [8, t4, t0], dataSize=8 220}; 221 222def macroop LLDT_R 223{ 224 chks reg, t0, InGDTCheck, flags=(EZF,) 225 br label("end"), flags=(CEZF,) 226 limm t4, 0, dataSize=8 227 srli t4, reg, 3, dataSize=2 228 ldst t1, tsg, [8, t4, t0], dataSize=8 229 ld t2, tsg, [8, t4, t0], 8, dataSize=8 230 chks reg, t1, LDTCheck 231 wrdh t3, t1, t2 232 wrdl tr, t1, reg 233 wrbase tr, t3, dataSize=8 234end: 235 fault "NoFault" 236}; 237 238def macroop LLDT_M 239{ 240 ld t5, seg, sib, disp, dataSize=2 241 chks t5, t0, InGDTCheck, flags=(EZF,) 242 br label("end"), flags=(CEZF,) 243 limm t4, 0, dataSize=8 244 srli t4, t5, 3, dataSize=2 245 ldst t1, tsg, [8, t4, t0], dataSize=8 246 ld t2, tsg, [8, t4, t0], 8, dataSize=8 247 chks t5, t1, LDTCheck 248 wrdh t3, t1, t2 249 wrdl tr, t1, t5 250 wrbase tr, t3, dataSize=8 251end: 252 fault "NoFault" 253}; 254 255def macroop LLDT_P 256{ 257 rdip t7 258 ld t5, seg, riprel, disp, dataSize=2 259 chks t5, t0, InGDTCheck, flags=(EZF,) 260 br label("end"), flags=(CEZF,) 261 limm t4, 0, dataSize=8 262 srli t4, t5, 3, dataSize=2 263 ldst t1, tsg, [8, t4, t0], dataSize=8 264 ld t2, tsg, [8, t4, t0], 8, dataSize=8 265 chks t5, t1, LDTCheck 266 wrdh t3, t1, t2 267 wrdl tr, t1, t5 268 wrbase tr, t3, dataSize=8 269end: 270 fault "NoFault" 271}; 272 273def macroop SWAPGS 274{ 275 rdval t1, kernel_gs_base, dataSize=8 276 rdbase t2, gs, dataSize=8 277 wrbase gs, t1, dataSize=8 278 wrval kernel_gs_base, t2, dataSize=8 279}; 280''' 281