system_calls.py revision 6344
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
686344Sgblack@eecs.umich.edu    and 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
1216344Sgblack@eecs.umich.edu    and 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