system_calls.py revision 6222
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. 606062Sgblack@eecs.umich.edu limm t1, "(uint64_t)(-1)", dataSize=8 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 676062Sgblack@eecs.umich.edu limm t3, "~RFBit", dataSize=8 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 806222Sgblack@eecs.umich.edu limm t4, ((0 << 0) | (0 << 2) | (0 << 3) | \ 816222Sgblack@eecs.umich.edu (1 << 4) | (0 << 5) | (1 << 6) | \ 826222Sgblack@eecs.umich.edu (1 << 7) | (10 << 8) | (0 << 12) | \ 836222Sgblack@eecs.umich.edu (1 << 13) | (0 << 14) | (1 << 15)), dataSize=8 845907Sgblack@eecs.umich.edu wrattr cs, t4 855907Sgblack@eecs.umich.edu 865907Sgblack@eecs.umich.edu # Set up SS. 875907Sgblack@eecs.umich.edu addi t3, t3, 8 885907Sgblack@eecs.umich.edu wrsel ss, t3 895907Sgblack@eecs.umich.edu wrbase ss, t0, dataSize=8 905907Sgblack@eecs.umich.edu wrlimit ss, t1, dataSize=4 915907Sgblack@eecs.umich.edu # Writable, readable, not expandDown, 925907Sgblack@eecs.umich.edu # dpl=0, defaultSize=0, not long mode 936222Sgblack@eecs.umich.edu limm t4, ((0 << 0) | (0 << 2) | (1 << 3) | \ 946222Sgblack@eecs.umich.edu (0 << 4) | (0 << 5) | (1 << 6) | \ 956222Sgblack@eecs.umich.edu (1 << 7) | (2 << 8) | (1 << 12) | \ 966222Sgblack@eecs.umich.edu (1 << 13) | (0 << 14) | (1 << 15)), dataSize=8 975907Sgblack@eecs.umich.edu wrattr ss, t4 985907Sgblack@eecs.umich.edu 995907Sgblack@eecs.umich.edu # Set the new rip. 1005907Sgblack@eecs.umich.edu rdval t7, lstar 1015907Sgblack@eecs.umich.edu wrip t0, t7 1025907Sgblack@eecs.umich.edu 1035907Sgblack@eecs.umich.edu # Mask the flags against sf_mask and leave RF turned off. 1045907Sgblack@eecs.umich.edu rdval t3, sf_mask, dataSize=8 1055907Sgblack@eecs.umich.edu xor t3, t3, t1, dataSize=8 1065907Sgblack@eecs.umich.edu and t3, t3, r11, dataSize=8 1075907Sgblack@eecs.umich.edu wrflags t3, t0 1085907Sgblack@eecs.umich.edu}; 1095907Sgblack@eecs.umich.edu 1105907Sgblack@eecs.umich.edudef macroop SYSCALL_COMPAT 1115907Sgblack@eecs.umich.edu{ 1125907Sgblack@eecs.umich.edu # All 1s. 1136062Sgblack@eecs.umich.edu limm t1, "(uint64_t)(-1)", dataSize=8 1145907Sgblack@eecs.umich.edu 1155907Sgblack@eecs.umich.edu # Save the next RIP. 1165907Sgblack@eecs.umich.edu rdip rcx 1175907Sgblack@eecs.umich.edu 1185907Sgblack@eecs.umich.edu # Stick rflags with RF masked into r11. 1195907Sgblack@eecs.umich.edu rflags t2 1206062Sgblack@eecs.umich.edu limm t3, "~RFBit", dataSize=8 1215907Sgblack@eecs.umich.edu andi r11, t2, t3, dataSize=8 1225907Sgblack@eecs.umich.edu 1235907Sgblack@eecs.umich.edu rdval t3, star 1245907Sgblack@eecs.umich.edu srli t3, t3, 32, dataSize=8 1255907Sgblack@eecs.umich.edu andi t3, t3, 0xFC, dataSize=1 1265907Sgblack@eecs.umich.edu 1275907Sgblack@eecs.umich.edu # Set up CS. 1285907Sgblack@eecs.umich.edu wrsel cs, t3 1295907Sgblack@eecs.umich.edu wrbase cs, t0, dataSize=8 1305907Sgblack@eecs.umich.edu wrlimit cs, t1, dataSize=4 1315907Sgblack@eecs.umich.edu # Not writable, read/execute-able, not expandDown, 1325907Sgblack@eecs.umich.edu # dpl=0, defaultSize=0, long mode 1336222Sgblack@eecs.umich.edu limm t4, ((0 << 0) | (0 << 2) | (0 << 3) | \ 1346222Sgblack@eecs.umich.edu (1 << 4) | (0 << 5) | (1 << 6) | \ 1356222Sgblack@eecs.umich.edu (1 << 7) | (10 << 8) | (0 << 12) | \ 1366222Sgblack@eecs.umich.edu (1 << 13) | (0 << 14) | (1 << 15)), dataSize=8 1375907Sgblack@eecs.umich.edu wrattr cs, t4 1385907Sgblack@eecs.umich.edu 1395907Sgblack@eecs.umich.edu # Set up SS. 1405907Sgblack@eecs.umich.edu addi t3, t3, 8 1415907Sgblack@eecs.umich.edu wrsel ss, t3 1425907Sgblack@eecs.umich.edu wrbase ss, t0, dataSize=8 1435907Sgblack@eecs.umich.edu wrlimit ss, t1, dataSize=4 1445907Sgblack@eecs.umich.edu # Writable, readable, not expandDown, 1455907Sgblack@eecs.umich.edu # dpl=0, defaultSize=0, not long mode 1466222Sgblack@eecs.umich.edu limm t4, ((0 << 0) | (0 << 2) | (1 << 3) | \ 1476222Sgblack@eecs.umich.edu (0 << 4) | (0 << 5) | (1 << 6) | \ 1486222Sgblack@eecs.umich.edu (1 << 7) | (2 << 8) | (1 << 12) | \ 1496222Sgblack@eecs.umich.edu (1 << 13) | (0 << 14) | (1 << 15)), dataSize=8 1505907Sgblack@eecs.umich.edu wrattr ss, t4 1515907Sgblack@eecs.umich.edu 1525907Sgblack@eecs.umich.edu # Set the new rip. 1535907Sgblack@eecs.umich.edu rdval t7, cstar 1545907Sgblack@eecs.umich.edu wrip t0, t7 1555907Sgblack@eecs.umich.edu 1565907Sgblack@eecs.umich.edu # Mask the flags against sf_mask and leave RF turned off. 1575907Sgblack@eecs.umich.edu rdval t3, sf_mask, dataSize=8 1585907Sgblack@eecs.umich.edu xor t3, t3, t1, dataSize=8 1595907Sgblack@eecs.umich.edu and t3, t3, r11, dataSize=8 1605907Sgblack@eecs.umich.edu wrflags t3, t0 1615907Sgblack@eecs.umich.edu}; 1625907Sgblack@eecs.umich.edu 1635907Sgblack@eecs.umich.edudef macroop SYSCALL_LEGACY 1645907Sgblack@eecs.umich.edu{ 1655907Sgblack@eecs.umich.edu panic "The syscall instruction isn't implemented in legacy mode." 1665907Sgblack@eecs.umich.edu}; 1675908Sgblack@eecs.umich.edu 1685908Sgblack@eecs.umich.edudef macroop SYSRET_TO_64 1695908Sgblack@eecs.umich.edu{ 1705908Sgblack@eecs.umich.edu # All 1s. 1716062Sgblack@eecs.umich.edu limm t1, "(uint64_t)(-1)", dataSize=8 1725908Sgblack@eecs.umich.edu 1735908Sgblack@eecs.umich.edu rdval t3, star 1745908Sgblack@eecs.umich.edu srli t3, t3, 48, dataSize=8 1755908Sgblack@eecs.umich.edu ori t3, t3, 3, dataSize=1 1765908Sgblack@eecs.umich.edu 1775908Sgblack@eecs.umich.edu # Set rflags to r11 with RF and VM cleared. 1786062Sgblack@eecs.umich.edu limm t4, "~(RFBit | VMBit)", dataSize=8 1795908Sgblack@eecs.umich.edu and t4, t4, r11, dataSize=8 1805908Sgblack@eecs.umich.edu wrflags t4, t0 1815908Sgblack@eecs.umich.edu 1825908Sgblack@eecs.umich.edu # Set up CS. 1835908Sgblack@eecs.umich.edu addi t4, t3, 16, dataSize=8 1845908Sgblack@eecs.umich.edu wrsel cs, t4 1855908Sgblack@eecs.umich.edu wrbase cs, t0, dataSize=8 1865908Sgblack@eecs.umich.edu wrlimit cs, t1, dataSize=4 1875908Sgblack@eecs.umich.edu # Not writable, read/execute-able, not expandDown, 1885908Sgblack@eecs.umich.edu # dpl=3, defaultSize=0, long mode 1896222Sgblack@eecs.umich.edu limm t4, ((3 << 0) | (0 << 2) | (0 << 3) | \ 1906222Sgblack@eecs.umich.edu (1 << 4) | (0 << 5) | (1 << 6) | \ 1916222Sgblack@eecs.umich.edu (1 << 7) | (10 << 8) | (0 << 12) | \ 1926222Sgblack@eecs.umich.edu (1 << 13) | (0 << 14) | (1 << 15)), dataSize=8 1935908Sgblack@eecs.umich.edu wrattr cs, t4 1945908Sgblack@eecs.umich.edu 1955908Sgblack@eecs.umich.edu # Only the selector is changed for SS. 1965908Sgblack@eecs.umich.edu addi t4, t3, 8, dataSize=8 1975908Sgblack@eecs.umich.edu wrsel ss, t4 1985908Sgblack@eecs.umich.edu 1995908Sgblack@eecs.umich.edu # Set the RIP back. 2005908Sgblack@eecs.umich.edu wrip rcx, t0, dataSize=8 2015908Sgblack@eecs.umich.edu}; 2025908Sgblack@eecs.umich.edu 2035908Sgblack@eecs.umich.edudef macroop SYSRET_TO_COMPAT 2045908Sgblack@eecs.umich.edu{ 2055908Sgblack@eecs.umich.edu # All 1s. 2066062Sgblack@eecs.umich.edu limm t1, "(uint64_t)(-1)", dataSize=8 2075908Sgblack@eecs.umich.edu 2085908Sgblack@eecs.umich.edu rdval t3, star 2095908Sgblack@eecs.umich.edu srli t3, t3, 48, dataSize=8 2105908Sgblack@eecs.umich.edu ori t3, t3, 3, dataSize=1 2115908Sgblack@eecs.umich.edu 2125908Sgblack@eecs.umich.edu # Set rflags to r11 with RF and VM cleared. 2136062Sgblack@eecs.umich.edu limm t4, "~(RFBit | VMBit)", dataSize=8 2145908Sgblack@eecs.umich.edu and t4, t4, r11, dataSize=8 2155908Sgblack@eecs.umich.edu wrflags t4, t0 2165908Sgblack@eecs.umich.edu 2175908Sgblack@eecs.umich.edu # Set up CS. 2185908Sgblack@eecs.umich.edu wrsel cs, t3 2195908Sgblack@eecs.umich.edu wrbase cs, t0, dataSize=8 2205908Sgblack@eecs.umich.edu wrlimit cs, t1, dataSize=4 2215908Sgblack@eecs.umich.edu # Not writable, read/execute-able, not expandDown, 2225908Sgblack@eecs.umich.edu # dpl=3, defaultSize=1, not long mode 2236222Sgblack@eecs.umich.edu limm t4, ((3 << 0) | (0 << 2) | (0 << 3) | \ 2246222Sgblack@eecs.umich.edu (1 << 4) | (0 << 5) | (1 << 6) | \ 2256222Sgblack@eecs.umich.edu (1 << 7) | (10 << 8) | (0 << 12) | \ 2266222Sgblack@eecs.umich.edu (1 << 13) | (0 << 14) | (1 << 15)), dataSize=8 2275908Sgblack@eecs.umich.edu wrattr cs, t4 2285908Sgblack@eecs.umich.edu 2295908Sgblack@eecs.umich.edu # Only the selector is changed for SS. 2305908Sgblack@eecs.umich.edu addi t4, t3, 8, dataSize=8 2315908Sgblack@eecs.umich.edu wrsel ss, t4 2325908Sgblack@eecs.umich.edu 2335908Sgblack@eecs.umich.edu # Set the RIP back. 2345908Sgblack@eecs.umich.edu wrip rcx, t0, dataSize=8 2355908Sgblack@eecs.umich.edu}; 2365908Sgblack@eecs.umich.edu 2375908Sgblack@eecs.umich.edudef macroop SYSRET_NON_64 2385908Sgblack@eecs.umich.edu{ 2395908Sgblack@eecs.umich.edu panic "The sysret instruction isn't implemented in legacy mode." 2405908Sgblack@eecs.umich.edu}; 2415907Sgblack@eecs.umich.edu''' 2425081Sgblack@eecs.umich.edu#let {{ 2435081Sgblack@eecs.umich.edu# class SYSENTER(Inst): 2445543Ssaidi@eecs.umich.edu# "GenFault ${new UnimpInstFault}" 2455081Sgblack@eecs.umich.edu# class SYSEXIT(Inst): 2465543Ssaidi@eecs.umich.edu# "GenFault ${new UnimpInstFault}" 2475081Sgblack@eecs.umich.edu#}}; 248