system_calls.py revision 5908
15081Sgblack@eecs.umich.edu# Copyright (c) 2007 The Hewlett-Packard Development Company 25081Sgblack@eecs.umich.edu# All rights reserved. 35081Sgblack@eecs.umich.edu# 45081Sgblack@eecs.umich.edu# Redistribution and use of this software in source and binary forms, 55081Sgblack@eecs.umich.edu# with or without modification, are permitted provided that the 65081Sgblack@eecs.umich.edu# following conditions are met: 75081Sgblack@eecs.umich.edu# 85081Sgblack@eecs.umich.edu# The software must be used only for Non-Commercial Use which means any 95081Sgblack@eecs.umich.edu# use which is NOT directed to receiving any direct monetary 105081Sgblack@eecs.umich.edu# compensation for, or commercial advantage from such use. Illustrative 115081Sgblack@eecs.umich.edu# examples of non-commercial use are academic research, personal study, 125081Sgblack@eecs.umich.edu# teaching, education and corporate research & development. 135081Sgblack@eecs.umich.edu# Illustrative examples of commercial use are distributing products for 145081Sgblack@eecs.umich.edu# commercial advantage and providing services using the software for 155081Sgblack@eecs.umich.edu# commercial advantage. 165081Sgblack@eecs.umich.edu# 175081Sgblack@eecs.umich.edu# If you wish to use this software or functionality therein that may be 185081Sgblack@eecs.umich.edu# covered by patents for commercial use, please contact: 195081Sgblack@eecs.umich.edu# Director of Intellectual Property Licensing 205081Sgblack@eecs.umich.edu# Office of Strategy and Technology 215081Sgblack@eecs.umich.edu# Hewlett-Packard Company 225081Sgblack@eecs.umich.edu# 1501 Page Mill Road 235081Sgblack@eecs.umich.edu# Palo Alto, California 94304 245081Sgblack@eecs.umich.edu# 255081Sgblack@eecs.umich.edu# Redistributions of source code must retain the above copyright notice, 265081Sgblack@eecs.umich.edu# this list of conditions and the following disclaimer. Redistributions 275081Sgblack@eecs.umich.edu# in binary form must reproduce the above copyright notice, this list of 285081Sgblack@eecs.umich.edu# conditions and the following disclaimer in the documentation and/or 295081Sgblack@eecs.umich.edu# other materials provided with the distribution. Neither the name of 305081Sgblack@eecs.umich.edu# the COPYRIGHT HOLDER(s), HEWLETT-PACKARD COMPANY, nor the names of its 315081Sgblack@eecs.umich.edu# contributors may be used to endorse or promote products derived from 325081Sgblack@eecs.umich.edu# this software without specific prior written permission. No right of 335081Sgblack@eecs.umich.edu# sublicense is granted herewith. Derivatives of the software and 345081Sgblack@eecs.umich.edu# output created using the software may be prepared, but only for 355081Sgblack@eecs.umich.edu# Non-Commercial Uses. Derivatives of the software may be shared with 365081Sgblack@eecs.umich.edu# others provided: (i) the others agree to abide by the list of 375081Sgblack@eecs.umich.edu# conditions herein which includes the Non-Commercial Use restrictions; 385081Sgblack@eecs.umich.edu# and (ii) such Derivatives of the software include the above copyright 395081Sgblack@eecs.umich.edu# notice to acknowledge the contribution from this software where 405081Sgblack@eecs.umich.edu# applicable, this list of conditions and the disclaimer below. 415081Sgblack@eecs.umich.edu# 425081Sgblack@eecs.umich.edu# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 435081Sgblack@eecs.umich.edu# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 445081Sgblack@eecs.umich.edu# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 455081Sgblack@eecs.umich.edu# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 465081Sgblack@eecs.umich.edu# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 475081Sgblack@eecs.umich.edu# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 485081Sgblack@eecs.umich.edu# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 495081Sgblack@eecs.umich.edu# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 505081Sgblack@eecs.umich.edu# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 515081Sgblack@eecs.umich.edu# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 525081Sgblack@eecs.umich.edu# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 535081Sgblack@eecs.umich.edu# 545081Sgblack@eecs.umich.edu# Authors: Gabe Black 555081Sgblack@eecs.umich.edu 565907Sgblack@eecs.umich.edumicrocode = ''' 575907Sgblack@eecs.umich.edudef macroop SYSCALL_64 585907Sgblack@eecs.umich.edu{ 595907Sgblack@eecs.umich.edu # All 1s. 605907Sgblack@eecs.umich.edu limm t1, "(uint64_t)(-1)" 615907Sgblack@eecs.umich.edu 625907Sgblack@eecs.umich.edu # Save the next RIP. 635907Sgblack@eecs.umich.edu rdip rcx 645907Sgblack@eecs.umich.edu 655907Sgblack@eecs.umich.edu # Stick rflags with RF masked into r11. 665907Sgblack@eecs.umich.edu rflags t2 675907Sgblack@eecs.umich.edu limm t3, "~RFBit" 685907Sgblack@eecs.umich.edu andi r11, t2, t3, dataSize=8 695907Sgblack@eecs.umich.edu 705907Sgblack@eecs.umich.edu rdval t3, star 715907Sgblack@eecs.umich.edu srli t3, t3, 32, dataSize=8 725907Sgblack@eecs.umich.edu andi t3, t3, 0xFC, dataSize=1 735907Sgblack@eecs.umich.edu 745907Sgblack@eecs.umich.edu # Set up CS. 755907Sgblack@eecs.umich.edu wrsel cs, t3 765907Sgblack@eecs.umich.edu wrbase cs, t0, dataSize=8 775907Sgblack@eecs.umich.edu wrlimit cs, t1, dataSize=4 785907Sgblack@eecs.umich.edu # Not writable, read/execute-able, not expandDown, 795907Sgblack@eecs.umich.edu # dpl=0, defaultSize=0, long mode 805907Sgblack@eecs.umich.edu limm t4, ((0 << 0) | (1 << 1) | (0 << 2) | \ 815907Sgblack@eecs.umich.edu (0 << 3) | (0 << 5) | (1 << 6)) 825907Sgblack@eecs.umich.edu wrattr cs, t4 835907Sgblack@eecs.umich.edu 845907Sgblack@eecs.umich.edu # Set up SS. 855907Sgblack@eecs.umich.edu addi t3, t3, 8 865907Sgblack@eecs.umich.edu wrsel ss, t3 875907Sgblack@eecs.umich.edu wrbase ss, t0, dataSize=8 885907Sgblack@eecs.umich.edu wrlimit ss, t1, dataSize=4 895907Sgblack@eecs.umich.edu # Writable, readable, not expandDown, 905907Sgblack@eecs.umich.edu # dpl=0, defaultSize=0, not long mode 915907Sgblack@eecs.umich.edu limm t4, ((1 << 0) | (1 << 1) | (0 << 2) | \ 925907Sgblack@eecs.umich.edu (0 << 3) | (0 << 5) | (0 << 6)) 935907Sgblack@eecs.umich.edu wrattr ss, t4 945907Sgblack@eecs.umich.edu 955907Sgblack@eecs.umich.edu # Set the new rip. 965907Sgblack@eecs.umich.edu rdval t7, lstar 975907Sgblack@eecs.umich.edu wrip t0, t7 985907Sgblack@eecs.umich.edu 995907Sgblack@eecs.umich.edu # Mask the flags against sf_mask and leave RF turned off. 1005907Sgblack@eecs.umich.edu rdval t3, sf_mask, dataSize=8 1015907Sgblack@eecs.umich.edu xor t3, t3, t1, dataSize=8 1025907Sgblack@eecs.umich.edu and t3, t3, r11, dataSize=8 1035907Sgblack@eecs.umich.edu wrflags t3, t0 1045907Sgblack@eecs.umich.edu}; 1055907Sgblack@eecs.umich.edu 1065907Sgblack@eecs.umich.edudef macroop SYSCALL_COMPAT 1075907Sgblack@eecs.umich.edu{ 1085907Sgblack@eecs.umich.edu # All 1s. 1095907Sgblack@eecs.umich.edu limm t1, "(uint64_t)(-1)" 1105907Sgblack@eecs.umich.edu 1115907Sgblack@eecs.umich.edu # Save the next RIP. 1125907Sgblack@eecs.umich.edu rdip rcx 1135907Sgblack@eecs.umich.edu 1145907Sgblack@eecs.umich.edu # Stick rflags with RF masked into r11. 1155907Sgblack@eecs.umich.edu rflags t2 1165907Sgblack@eecs.umich.edu limm t3, "~RFBit" 1175907Sgblack@eecs.umich.edu andi r11, t2, t3, dataSize=8 1185907Sgblack@eecs.umich.edu 1195907Sgblack@eecs.umich.edu rdval t3, star 1205907Sgblack@eecs.umich.edu srli t3, t3, 32, dataSize=8 1215907Sgblack@eecs.umich.edu andi t3, t3, 0xFC, dataSize=1 1225907Sgblack@eecs.umich.edu 1235907Sgblack@eecs.umich.edu # Set up CS. 1245907Sgblack@eecs.umich.edu wrsel cs, t3 1255907Sgblack@eecs.umich.edu wrbase cs, t0, dataSize=8 1265907Sgblack@eecs.umich.edu wrlimit cs, t1, dataSize=4 1275907Sgblack@eecs.umich.edu # Not writable, read/execute-able, not expandDown, 1285907Sgblack@eecs.umich.edu # dpl=0, defaultSize=0, long mode 1295907Sgblack@eecs.umich.edu limm t4, ((0 << 0) | (1 << 1) | (0 << 2) | \ 1305907Sgblack@eecs.umich.edu (0 << 3) | (0 << 5) | (1 << 6)) 1315907Sgblack@eecs.umich.edu wrattr cs, t4 1325907Sgblack@eecs.umich.edu 1335907Sgblack@eecs.umich.edu # Set up SS. 1345907Sgblack@eecs.umich.edu addi t3, t3, 8 1355907Sgblack@eecs.umich.edu wrsel ss, t3 1365907Sgblack@eecs.umich.edu wrbase ss, t0, dataSize=8 1375907Sgblack@eecs.umich.edu wrlimit ss, t1, dataSize=4 1385907Sgblack@eecs.umich.edu # Writable, readable, not expandDown, 1395907Sgblack@eecs.umich.edu # dpl=0, defaultSize=0, not long mode 1405907Sgblack@eecs.umich.edu limm t4, ((1 << 0) | (1 << 1) | (0 << 2) | \ 1415907Sgblack@eecs.umich.edu (0 << 3) | (0 << 5) | (0 << 6)) 1425907Sgblack@eecs.umich.edu wrattr ss, t4 1435907Sgblack@eecs.umich.edu 1445907Sgblack@eecs.umich.edu # Set the new rip. 1455907Sgblack@eecs.umich.edu rdval t7, cstar 1465907Sgblack@eecs.umich.edu wrip t0, t7 1475907Sgblack@eecs.umich.edu 1485907Sgblack@eecs.umich.edu # Mask the flags against sf_mask and leave RF turned off. 1495907Sgblack@eecs.umich.edu rdval t3, sf_mask, dataSize=8 1505907Sgblack@eecs.umich.edu xor t3, t3, t1, dataSize=8 1515907Sgblack@eecs.umich.edu and t3, t3, r11, dataSize=8 1525907Sgblack@eecs.umich.edu wrflags t3, t0 1535907Sgblack@eecs.umich.edu}; 1545907Sgblack@eecs.umich.edu 1555907Sgblack@eecs.umich.edudef macroop SYSCALL_LEGACY 1565907Sgblack@eecs.umich.edu{ 1575907Sgblack@eecs.umich.edu panic "The syscall instruction isn't implemented in legacy mode." 1585907Sgblack@eecs.umich.edu}; 1595908Sgblack@eecs.umich.edu 1605908Sgblack@eecs.umich.edudef macroop SYSRET_TO_64 1615908Sgblack@eecs.umich.edu{ 1625908Sgblack@eecs.umich.edu # All 1s. 1635908Sgblack@eecs.umich.edu limm t1, "(uint64_t)(-1)" 1645908Sgblack@eecs.umich.edu 1655908Sgblack@eecs.umich.edu rdval t3, star 1665908Sgblack@eecs.umich.edu srli t3, t3, 48, dataSize=8 1675908Sgblack@eecs.umich.edu ori t3, t3, 3, dataSize=1 1685908Sgblack@eecs.umich.edu 1695908Sgblack@eecs.umich.edu # Set rflags to r11 with RF and VM cleared. 1705908Sgblack@eecs.umich.edu limm t4, "~(RFBit | VMBit)" 1715908Sgblack@eecs.umich.edu and t4, t4, r11, dataSize=8 1725908Sgblack@eecs.umich.edu wrflags t4, t0 1735908Sgblack@eecs.umich.edu 1745908Sgblack@eecs.umich.edu # Set up CS. 1755908Sgblack@eecs.umich.edu addi t4, t3, 16, dataSize=8 1765908Sgblack@eecs.umich.edu wrsel cs, t4 1775908Sgblack@eecs.umich.edu wrbase cs, t0, dataSize=8 1785908Sgblack@eecs.umich.edu wrlimit cs, t1, dataSize=4 1795908Sgblack@eecs.umich.edu # Not writable, read/execute-able, not expandDown, 1805908Sgblack@eecs.umich.edu # dpl=3, defaultSize=0, long mode 1815908Sgblack@eecs.umich.edu limm t4, ((0 << 0) | (1 << 1) | (0 << 2) | \ 1825908Sgblack@eecs.umich.edu (3 << 3) | (0 << 5) | (1 << 6)) 1835908Sgblack@eecs.umich.edu wrattr cs, t4 1845908Sgblack@eecs.umich.edu 1855908Sgblack@eecs.umich.edu # Only the selector is changed for SS. 1865908Sgblack@eecs.umich.edu addi t4, t3, 8, dataSize=8 1875908Sgblack@eecs.umich.edu wrsel ss, t4 1885908Sgblack@eecs.umich.edu 1895908Sgblack@eecs.umich.edu # Set the RIP back. 1905908Sgblack@eecs.umich.edu wrip rcx, t0, dataSize=8 1915908Sgblack@eecs.umich.edu}; 1925908Sgblack@eecs.umich.edu 1935908Sgblack@eecs.umich.edudef macroop SYSRET_TO_COMPAT 1945908Sgblack@eecs.umich.edu{ 1955908Sgblack@eecs.umich.edu # All 1s. 1965908Sgblack@eecs.umich.edu limm t1, "(uint64_t)(-1)" 1975908Sgblack@eecs.umich.edu 1985908Sgblack@eecs.umich.edu rdval t3, star 1995908Sgblack@eecs.umich.edu srli t3, t3, 48, dataSize=8 2005908Sgblack@eecs.umich.edu ori t3, t3, 3, dataSize=1 2015908Sgblack@eecs.umich.edu 2025908Sgblack@eecs.umich.edu # Set rflags to r11 with RF and VM cleared. 2035908Sgblack@eecs.umich.edu limm t4, "~(RFBit | VMBit)" 2045908Sgblack@eecs.umich.edu and t4, t4, r11, dataSize=8 2055908Sgblack@eecs.umich.edu wrflags t4, t0 2065908Sgblack@eecs.umich.edu 2075908Sgblack@eecs.umich.edu # Set up CS. 2085908Sgblack@eecs.umich.edu wrsel cs, t3 2095908Sgblack@eecs.umich.edu wrbase cs, t0, dataSize=8 2105908Sgblack@eecs.umich.edu wrlimit cs, t1, dataSize=4 2115908Sgblack@eecs.umich.edu # Not writable, read/execute-able, not expandDown, 2125908Sgblack@eecs.umich.edu # dpl=3, defaultSize=1, not long mode 2135908Sgblack@eecs.umich.edu limm t4, ((0 << 0) | (1 << 1) | (0 << 2) | \ 2145908Sgblack@eecs.umich.edu (3 << 3) | (1 << 5) | (0 << 6)) 2155908Sgblack@eecs.umich.edu wrattr cs, t4 2165908Sgblack@eecs.umich.edu 2175908Sgblack@eecs.umich.edu # Only the selector is changed for SS. 2185908Sgblack@eecs.umich.edu addi t4, t3, 8, dataSize=8 2195908Sgblack@eecs.umich.edu wrsel ss, t4 2205908Sgblack@eecs.umich.edu 2215908Sgblack@eecs.umich.edu # Set the RIP back. 2225908Sgblack@eecs.umich.edu wrip rcx, t0, dataSize=8 2235908Sgblack@eecs.umich.edu}; 2245908Sgblack@eecs.umich.edu 2255908Sgblack@eecs.umich.edudef macroop SYSRET_NON_64 2265908Sgblack@eecs.umich.edu{ 2275908Sgblack@eecs.umich.edu panic "The sysret instruction isn't implemented in legacy mode." 2285908Sgblack@eecs.umich.edu}; 2295907Sgblack@eecs.umich.edu''' 2305081Sgblack@eecs.umich.edu#let {{ 2315081Sgblack@eecs.umich.edu# class SYSENTER(Inst): 2325543Ssaidi@eecs.umich.edu# "GenFault ${new UnimpInstFault}" 2335081Sgblack@eecs.umich.edu# class SYSEXIT(Inst): 2345543Ssaidi@eecs.umich.edu# "GenFault ${new UnimpInstFault}" 2355081Sgblack@eecs.umich.edu#}}; 236