segmentation.py revision 6644:57fba079b7ff
112SN/A# Copyright (c) 2007 The Hewlett-Packard Development Company 21762SN/A# All rights reserved. 312SN/A# 412SN/A# Redistribution and use of this software in source and binary forms, 512SN/A# with or without modification, are permitted provided that the 612SN/A# following conditions are met: 712SN/A# 812SN/A# The software must be used only for Non-Commercial Use which means any 912SN/A# use which is NOT directed to receiving any direct monetary 1012SN/A# compensation for, or commercial advantage from such use. Illustrative 1112SN/A# examples of non-commercial use are academic research, personal study, 1212SN/A# teaching, education and corporate research & development. 1312SN/A# Illustrative examples of commercial use are distributing products for 1412SN/A# commercial advantage and providing services using the software for 1512SN/A# commercial advantage. 1612SN/A# 1712SN/A# If you wish to use this software or functionality therein that may be 1812SN/A# covered by patents for commercial use, please contact: 1912SN/A# Director of Intellectual Property Licensing 2012SN/A# Office of Strategy and Technology 2112SN/A# Hewlett-Packard Company 2212SN/A# 1501 Page Mill Road 2312SN/A# Palo Alto, California 94304 2412SN/A# 2512SN/A# Redistributions of source code must retain the above copyright notice, 2612SN/A# this list of conditions and the following disclaimer. Redistributions 272665Ssaidi@eecs.umich.edu# in binary form must reproduce the above copyright notice, this list of 282665Ssaidi@eecs.umich.edu# conditions and the following disclaimer in the documentation and/or 2912SN/A# other materials provided with the distribution. Neither the name of 3012SN/A# the COPYRIGHT HOLDER(s), HEWLETT-PACKARD COMPANY, nor the names of its 3112SN/A# contributors may be used to endorse or promote products derived from 3212SN/A# this software without specific prior written permission. No right of 3312SN/A# sublicense is granted herewith. Derivatives of the software and 345070Ssaidi@eecs.umich.edu# output created using the software may be prepared, but only for 355090Sgblack@eecs.umich.edu# Non-Commercial Uses. Derivatives of the software may be shared with 3612SN/A# others provided: (i) the others agree to abide by the list of 378229Snate@binkert.org# conditions herein which includes the Non-Commercial Use restrictions; 388229Snate@binkert.org# and (ii) such Derivatives of the software include the above copyright 3912SN/A# notice to acknowledge the contribution from this software where 4012SN/A# applicable, this list of conditions and the disclaimer below. 4112SN/A# 4212SN/A# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 435090Sgblack@eecs.umich.edu# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 445090Sgblack@eecs.umich.edu# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 455090Sgblack@eecs.umich.edu# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 462976Sgblack@eecs.umich.edu# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 472976Sgblack@eecs.umich.edu# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 482976Sgblack@eecs.umich.edu# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 492976Sgblack@eecs.umich.edu# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 502976Sgblack@eecs.umich.edu# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 515070Ssaidi@eecs.umich.edu# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 522976Sgblack@eecs.umich.edu# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 53468SN/A# 547581SAli.Saidi@arm.com# Authors: Gabe Black 55468SN/A 5612SN/Amicrocode = ''' 572479SN/Adef macroop LGDT_M 58360SN/A{ 5912SN/A .adjust_env maxOsz 605070Ssaidi@eecs.umich.edu 615070Ssaidi@eecs.umich.edu # Get the limit 625070Ssaidi@eecs.umich.edu ld t1, seg, sib, disp, dataSize=2 635090Sgblack@eecs.umich.edu # Get the base 645090Sgblack@eecs.umich.edu ld t2, seg, sib, 'adjustedDisp + 2' 6512SN/A wrbase tsg, t2 6612SN/A wrlimit tsg, t1 6712SN/A}; 685090Sgblack@eecs.umich.edu 695090Sgblack@eecs.umich.edudef macroop LGDT_P 703812Ssaidi@eecs.umich.edu{ 713812Ssaidi@eecs.umich.edu .adjust_env maxOsz 723812Ssaidi@eecs.umich.edu 733812Ssaidi@eecs.umich.edu rdip t7 7412SN/A # Get the limit 755070Ssaidi@eecs.umich.edu ld t1, seg, riprel, disp, dataSize=2 765070Ssaidi@eecs.umich.edu # Get the base 773917Ssaidi@eecs.umich.edu ld t2, seg, riprel, 'adjustedDisp + 2' 7812SN/A wrbase tsg, t2 7912SN/A wrlimit tsg, t1 802976Sgblack@eecs.umich.edu}; 812976Sgblack@eecs.umich.edu 822976Sgblack@eecs.umich.edu# 8312SN/A# These versions are for when the original data size was 16 bits. The base is 8412SN/A# still 32 bits, but the top byte is zeroed before being used. 8512SN/A# 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