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