15081Sgblack@eecs.umich.edu# Copyright (c) 2007 The Hewlett-Packard Development Company 25081Sgblack@eecs.umich.edu# All rights reserved. 35081Sgblack@eecs.umich.edu# 47087Snate@binkert.org# The license below extends only to copyright in the software and shall 57087Snate@binkert.org# not be construed as granting a license to any other intellectual 67087Snate@binkert.org# property including but not limited to intellectual property relating 77087Snate@binkert.org# to a hardware implementation of the functionality of the software 87087Snate@binkert.org# licensed hereunder. You may use the software subject to the license 97087Snate@binkert.org# terms below provided that you ensure that this notice is replicated 107087Snate@binkert.org# unmodified and in its entirety in all distributions of the software, 117087Snate@binkert.org# modified or unmodified, in source code or in binary form. 125081Sgblack@eecs.umich.edu# 137087Snate@binkert.org# Redistribution and use in source and binary forms, with or without 147087Snate@binkert.org# modification, are permitted provided that the following conditions are 157087Snate@binkert.org# met: redistributions of source code must retain the above copyright 167087Snate@binkert.org# notice, this list of conditions and the following disclaimer; 177087Snate@binkert.org# redistributions in binary form must reproduce the above copyright 187087Snate@binkert.org# notice, this list of conditions and the following disclaimer in the 197087Snate@binkert.org# documentation and/or other materials provided with the distribution; 207087Snate@binkert.org# neither the name of the copyright holders nor the names of its 215081Sgblack@eecs.umich.edu# contributors may be used to endorse or promote products derived from 227087Snate@binkert.org# this software without specific prior written permission. 235081Sgblack@eecs.umich.edu# 245081Sgblack@eecs.umich.edu# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 255081Sgblack@eecs.umich.edu# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 265081Sgblack@eecs.umich.edu# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 275081Sgblack@eecs.umich.edu# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 285081Sgblack@eecs.umich.edu# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 295081Sgblack@eecs.umich.edu# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 305081Sgblack@eecs.umich.edu# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 315081Sgblack@eecs.umich.edu# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 325081Sgblack@eecs.umich.edu# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 335081Sgblack@eecs.umich.edu# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 345081Sgblack@eecs.umich.edu# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 355081Sgblack@eecs.umich.edu# 365081Sgblack@eecs.umich.edu# Authors: Gabe Black 375081Sgblack@eecs.umich.edu 385907Sgblack@eecs.umich.edumicrocode = ''' 395907Sgblack@eecs.umich.edudef macroop SYSCALL_64 405907Sgblack@eecs.umich.edu{ 415907Sgblack@eecs.umich.edu # All 1s. 426062Sgblack@eecs.umich.edu limm t1, "(uint64_t)(-1)", dataSize=8 435907Sgblack@eecs.umich.edu 445907Sgblack@eecs.umich.edu # Save the next RIP. 455907Sgblack@eecs.umich.edu rdip rcx 4611320Ssteve.reinhardt@amd.com 475907Sgblack@eecs.umich.edu # Stick rflags with RF masked into r11. 485907Sgblack@eecs.umich.edu rflags t2 496062Sgblack@eecs.umich.edu limm t3, "~RFBit", dataSize=8 506344Sgblack@eecs.umich.edu and r11, t2, t3, dataSize=8 515907Sgblack@eecs.umich.edu 525907Sgblack@eecs.umich.edu rdval t3, star 535907Sgblack@eecs.umich.edu srli t3, t3, 32, dataSize=8 545907Sgblack@eecs.umich.edu andi t3, t3, 0xFC, dataSize=1 555907Sgblack@eecs.umich.edu 565907Sgblack@eecs.umich.edu # Set up CS. 575907Sgblack@eecs.umich.edu wrsel cs, t3 585907Sgblack@eecs.umich.edu wrbase cs, t0, dataSize=8 595907Sgblack@eecs.umich.edu wrlimit cs, t1, dataSize=4 605907Sgblack@eecs.umich.edu # Not writable, read/execute-able, not expandDown, 615907Sgblack@eecs.umich.edu # dpl=0, defaultSize=0, long mode 626222Sgblack@eecs.umich.edu limm t4, ((0 << 0) | (0 << 2) | (0 << 3) | \ 636222Sgblack@eecs.umich.edu (1 << 4) | (0 << 5) | (1 << 6) | \ 646222Sgblack@eecs.umich.edu (1 << 7) | (10 << 8) | (0 << 12) | \ 656222Sgblack@eecs.umich.edu (1 << 13) | (0 << 14) | (1 << 15)), dataSize=8 665907Sgblack@eecs.umich.edu wrattr cs, t4 675907Sgblack@eecs.umich.edu 685907Sgblack@eecs.umich.edu # Set up SS. 695907Sgblack@eecs.umich.edu addi t3, t3, 8 705907Sgblack@eecs.umich.edu wrsel ss, t3 715907Sgblack@eecs.umich.edu wrbase ss, t0, dataSize=8 725907Sgblack@eecs.umich.edu wrlimit ss, t1, dataSize=4 735907Sgblack@eecs.umich.edu # Writable, readable, not expandDown, 745907Sgblack@eecs.umich.edu # dpl=0, defaultSize=0, not long mode 756222Sgblack@eecs.umich.edu limm t4, ((0 << 0) | (0 << 2) | (1 << 3) | \ 766222Sgblack@eecs.umich.edu (0 << 4) | (0 << 5) | (1 << 6) | \ 776222Sgblack@eecs.umich.edu (1 << 7) | (2 << 8) | (1 << 12) | \ 786222Sgblack@eecs.umich.edu (1 << 13) | (0 << 14) | (1 << 15)), dataSize=8 795907Sgblack@eecs.umich.edu wrattr ss, t4 805907Sgblack@eecs.umich.edu 815907Sgblack@eecs.umich.edu # Set the new rip. 827932Stharris@microsoft.com rdval t7, lstar, dataSize=8 837932Stharris@microsoft.com wrip t0, t7, dataSize=8 845907Sgblack@eecs.umich.edu 855907Sgblack@eecs.umich.edu # Mask the flags against sf_mask and leave RF turned off. 865907Sgblack@eecs.umich.edu rdval t3, sf_mask, dataSize=8 875907Sgblack@eecs.umich.edu xor t3, t3, t1, dataSize=8 885907Sgblack@eecs.umich.edu and t3, t3, r11, dataSize=8 895907Sgblack@eecs.umich.edu wrflags t3, t0 905907Sgblack@eecs.umich.edu}; 915907Sgblack@eecs.umich.edu 925907Sgblack@eecs.umich.edudef macroop SYSCALL_COMPAT 935907Sgblack@eecs.umich.edu{ 945907Sgblack@eecs.umich.edu # All 1s. 956062Sgblack@eecs.umich.edu limm t1, "(uint64_t)(-1)", dataSize=8 965907Sgblack@eecs.umich.edu 975907Sgblack@eecs.umich.edu # Save the next RIP. 985907Sgblack@eecs.umich.edu rdip rcx 9911320Ssteve.reinhardt@amd.com 1005907Sgblack@eecs.umich.edu # Stick rflags with RF masked into r11. 1015907Sgblack@eecs.umich.edu rflags t2 1026062Sgblack@eecs.umich.edu limm t3, "~RFBit", dataSize=8 1036344Sgblack@eecs.umich.edu and r11, t2, t3, dataSize=8 1045907Sgblack@eecs.umich.edu 1055907Sgblack@eecs.umich.edu rdval t3, star 1065907Sgblack@eecs.umich.edu srli t3, t3, 32, dataSize=8 1075907Sgblack@eecs.umich.edu andi t3, t3, 0xFC, dataSize=1 1085907Sgblack@eecs.umich.edu 1095907Sgblack@eecs.umich.edu # Set up CS. 1105907Sgblack@eecs.umich.edu wrsel cs, t3 1115907Sgblack@eecs.umich.edu wrbase cs, t0, dataSize=8 1125907Sgblack@eecs.umich.edu wrlimit cs, t1, dataSize=4 1135907Sgblack@eecs.umich.edu # Not writable, read/execute-able, not expandDown, 1145907Sgblack@eecs.umich.edu # dpl=0, defaultSize=0, long mode 1156222Sgblack@eecs.umich.edu limm t4, ((0 << 0) | (0 << 2) | (0 << 3) | \ 1166222Sgblack@eecs.umich.edu (1 << 4) | (0 << 5) | (1 << 6) | \ 1176222Sgblack@eecs.umich.edu (1 << 7) | (10 << 8) | (0 << 12) | \ 1186222Sgblack@eecs.umich.edu (1 << 13) | (0 << 14) | (1 << 15)), dataSize=8 1195907Sgblack@eecs.umich.edu wrattr cs, t4 1205907Sgblack@eecs.umich.edu 1215907Sgblack@eecs.umich.edu # Set up SS. 1225907Sgblack@eecs.umich.edu addi t3, t3, 8 1235907Sgblack@eecs.umich.edu wrsel ss, t3 1245907Sgblack@eecs.umich.edu wrbase ss, t0, dataSize=8 1255907Sgblack@eecs.umich.edu wrlimit ss, t1, dataSize=4 1265907Sgblack@eecs.umich.edu # Writable, readable, not expandDown, 1275907Sgblack@eecs.umich.edu # dpl=0, defaultSize=0, not long mode 1286222Sgblack@eecs.umich.edu limm t4, ((0 << 0) | (0 << 2) | (1 << 3) | \ 1296222Sgblack@eecs.umich.edu (0 << 4) | (0 << 5) | (1 << 6) | \ 1306222Sgblack@eecs.umich.edu (1 << 7) | (2 << 8) | (1 << 12) | \ 1316222Sgblack@eecs.umich.edu (1 << 13) | (0 << 14) | (1 << 15)), dataSize=8 1325907Sgblack@eecs.umich.edu wrattr ss, t4 1335907Sgblack@eecs.umich.edu 1345907Sgblack@eecs.umich.edu # Set the new rip. 1355907Sgblack@eecs.umich.edu rdval t7, cstar 1365907Sgblack@eecs.umich.edu wrip t0, t7 1375907Sgblack@eecs.umich.edu 1385907Sgblack@eecs.umich.edu # Mask the flags against sf_mask and leave RF turned off. 1395907Sgblack@eecs.umich.edu rdval t3, sf_mask, dataSize=8 1405907Sgblack@eecs.umich.edu xor t3, t3, t1, dataSize=8 1415907Sgblack@eecs.umich.edu and t3, t3, r11, dataSize=8 1425907Sgblack@eecs.umich.edu wrflags t3, t0 1435907Sgblack@eecs.umich.edu}; 1445907Sgblack@eecs.umich.edu 1455907Sgblack@eecs.umich.edudef macroop SYSCALL_LEGACY 1465907Sgblack@eecs.umich.edu{ 1475907Sgblack@eecs.umich.edu panic "The syscall instruction isn't implemented in legacy mode." 1485907Sgblack@eecs.umich.edu}; 1495908Sgblack@eecs.umich.edu 1505908Sgblack@eecs.umich.edudef macroop SYSRET_TO_64 1515908Sgblack@eecs.umich.edu{ 1525908Sgblack@eecs.umich.edu # All 1s. 1536062Sgblack@eecs.umich.edu limm t1, "(uint64_t)(-1)", dataSize=8 1545908Sgblack@eecs.umich.edu 1555908Sgblack@eecs.umich.edu rdval t3, star 1565908Sgblack@eecs.umich.edu srli t3, t3, 48, dataSize=8 1575908Sgblack@eecs.umich.edu ori t3, t3, 3, dataSize=1 1585908Sgblack@eecs.umich.edu 1595908Sgblack@eecs.umich.edu # Set rflags to r11 with RF and VM cleared. 1606062Sgblack@eecs.umich.edu limm t4, "~(RFBit | VMBit)", dataSize=8 1615908Sgblack@eecs.umich.edu and t4, t4, r11, dataSize=8 1625908Sgblack@eecs.umich.edu wrflags t4, t0 1635908Sgblack@eecs.umich.edu 1645908Sgblack@eecs.umich.edu # Set up CS. 1655908Sgblack@eecs.umich.edu addi t4, t3, 16, dataSize=8 1665908Sgblack@eecs.umich.edu wrsel cs, t4 1675908Sgblack@eecs.umich.edu wrbase cs, t0, dataSize=8 1685908Sgblack@eecs.umich.edu wrlimit cs, t1, dataSize=4 1695908Sgblack@eecs.umich.edu # Not writable, read/execute-able, not expandDown, 1705908Sgblack@eecs.umich.edu # dpl=3, defaultSize=0, long mode 1716222Sgblack@eecs.umich.edu limm t4, ((3 << 0) | (0 << 2) | (0 << 3) | \ 1726222Sgblack@eecs.umich.edu (1 << 4) | (0 << 5) | (1 << 6) | \ 1736222Sgblack@eecs.umich.edu (1 << 7) | (10 << 8) | (0 << 12) | \ 1746222Sgblack@eecs.umich.edu (1 << 13) | (0 << 14) | (1 << 15)), dataSize=8 1755908Sgblack@eecs.umich.edu wrattr cs, t4 1765908Sgblack@eecs.umich.edu 1775908Sgblack@eecs.umich.edu # Only the selector is changed for SS. 1785908Sgblack@eecs.umich.edu addi t4, t3, 8, dataSize=8 1795908Sgblack@eecs.umich.edu wrsel ss, t4 1805908Sgblack@eecs.umich.edu 1815908Sgblack@eecs.umich.edu # Set the RIP back. 1825908Sgblack@eecs.umich.edu wrip rcx, t0, dataSize=8 1835908Sgblack@eecs.umich.edu}; 1845908Sgblack@eecs.umich.edu 1855908Sgblack@eecs.umich.edudef macroop SYSRET_TO_COMPAT 1865908Sgblack@eecs.umich.edu{ 1875908Sgblack@eecs.umich.edu # All 1s. 1886062Sgblack@eecs.umich.edu limm t1, "(uint64_t)(-1)", dataSize=8 1895908Sgblack@eecs.umich.edu 1905908Sgblack@eecs.umich.edu rdval t3, star 1915908Sgblack@eecs.umich.edu srli t3, t3, 48, dataSize=8 1925908Sgblack@eecs.umich.edu ori t3, t3, 3, dataSize=1 1935908Sgblack@eecs.umich.edu 1945908Sgblack@eecs.umich.edu # Set rflags to r11 with RF and VM cleared. 1956062Sgblack@eecs.umich.edu limm t4, "~(RFBit | VMBit)", dataSize=8 1965908Sgblack@eecs.umich.edu and t4, t4, r11, dataSize=8 1975908Sgblack@eecs.umich.edu wrflags t4, t0 1985908Sgblack@eecs.umich.edu 1995908Sgblack@eecs.umich.edu # Set up CS. 2005908Sgblack@eecs.umich.edu wrsel cs, t3 2015908Sgblack@eecs.umich.edu wrbase cs, t0, dataSize=8 2025908Sgblack@eecs.umich.edu wrlimit cs, t1, dataSize=4 2035908Sgblack@eecs.umich.edu # Not writable, read/execute-able, not expandDown, 2045908Sgblack@eecs.umich.edu # dpl=3, defaultSize=1, not long mode 2056222Sgblack@eecs.umich.edu limm t4, ((3 << 0) | (0 << 2) | (0 << 3) | \ 2066222Sgblack@eecs.umich.edu (1 << 4) | (0 << 5) | (1 << 6) | \ 2076222Sgblack@eecs.umich.edu (1 << 7) | (10 << 8) | (0 << 12) | \ 2086222Sgblack@eecs.umich.edu (1 << 13) | (0 << 14) | (1 << 15)), dataSize=8 2095908Sgblack@eecs.umich.edu wrattr cs, t4 2105908Sgblack@eecs.umich.edu 2115908Sgblack@eecs.umich.edu # Only the selector is changed for SS. 2125908Sgblack@eecs.umich.edu addi t4, t3, 8, dataSize=8 2135908Sgblack@eecs.umich.edu wrsel ss, t4 2145908Sgblack@eecs.umich.edu 2155908Sgblack@eecs.umich.edu # Set the RIP back. 2165908Sgblack@eecs.umich.edu wrip rcx, t0, dataSize=8 2175908Sgblack@eecs.umich.edu}; 2185908Sgblack@eecs.umich.edu 2195908Sgblack@eecs.umich.edudef macroop SYSRET_NON_64 2205908Sgblack@eecs.umich.edu{ 2215908Sgblack@eecs.umich.edu panic "The sysret instruction isn't implemented in legacy mode." 2225908Sgblack@eecs.umich.edu}; 2235907Sgblack@eecs.umich.edu''' 2245081Sgblack@eecs.umich.edu#let {{ 2255081Sgblack@eecs.umich.edu# class SYSENTER(Inst): 2265543Ssaidi@eecs.umich.edu# "GenFault ${new UnimpInstFault}" 2275081Sgblack@eecs.umich.edu# class SYSEXIT(Inst): 2285543Ssaidi@eecs.umich.edu# "GenFault ${new UnimpInstFault}" 2295081Sgblack@eecs.umich.edu#}}; 230