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