crypto64.isa revision 13171:8d3d2b1f1ca3
17375Sgblack@eecs.umich.edu// -*- mode:c++ -*-
27375Sgblack@eecs.umich.edu//
37375Sgblack@eecs.umich.edu// Copyright (c) 2018 ARM Limited
47375Sgblack@eecs.umich.edu// All rights reserved
57375Sgblack@eecs.umich.edu//
67375Sgblack@eecs.umich.edu// The license below extends only to copyright in the software and shall
77375Sgblack@eecs.umich.edu// not be construed as granting a license to any other intellectual
87375Sgblack@eecs.umich.edu// property including but not limited to intellectual property relating
97375Sgblack@eecs.umich.edu// to a hardware implementation of the functionality of the software
107375Sgblack@eecs.umich.edu// licensed hereunder.  You may use the software subject to the license
117375Sgblack@eecs.umich.edu// terms below provided that you ensure that this notice is replicated
127375Sgblack@eecs.umich.edu// unmodified and in its entirety in all distributions of the software,
137375Sgblack@eecs.umich.edu// modified or unmodified, in source code or in binary form.
147375Sgblack@eecs.umich.edu//
157375Sgblack@eecs.umich.edu// Redistribution and use in source and binary forms, with or without
167375Sgblack@eecs.umich.edu// modification, are permitted provided that the following conditions are
177375Sgblack@eecs.umich.edu// met: redistributions of source code must retain the above copyright
187375Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer;
197375Sgblack@eecs.umich.edu// redistributions in binary form must reproduce the above copyright
207375Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer in the
217375Sgblack@eecs.umich.edu// documentation and/or other materials provided with the distribution;
227375Sgblack@eecs.umich.edu// neither the name of the copyright holders nor the names of its
237375Sgblack@eecs.umich.edu// contributors may be used to endorse or promote products derived from
247375Sgblack@eecs.umich.edu// this software without specific prior written permission.
257375Sgblack@eecs.umich.edu//
267375Sgblack@eecs.umich.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
277375Sgblack@eecs.umich.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
287375Sgblack@eecs.umich.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
297375Sgblack@eecs.umich.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
307375Sgblack@eecs.umich.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
317375Sgblack@eecs.umich.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
327375Sgblack@eecs.umich.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
337375Sgblack@eecs.umich.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
347375Sgblack@eecs.umich.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
357375Sgblack@eecs.umich.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
367375Sgblack@eecs.umich.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
377375Sgblack@eecs.umich.edu//
387375Sgblack@eecs.umich.edu// Authors: Matt Horsnell
397375Sgblack@eecs.umich.edu//          Prakash Ramrakhyani
407375Sgblack@eecs.umich.edu//          Giacomo Travaglini
417375Sgblack@eecs.umich.edu
427375Sgblack@eecs.umich.edulet {{
437375Sgblack@eecs.umich.edu    header_output = ""
447378Sgblack@eecs.umich.edu    decoder_output = ""
457378Sgblack@eecs.umich.edu    exec_output = ""
467382Sgblack@eecs.umich.edu
477375Sgblack@eecs.umich.edu    cryptoEnabledCheckCode = '''
487384Sgblack@eecs.umich.edu        auto crypto_reg = xc->tcBase()->readMiscReg(MISCREG_ID_AA64ISAR0_EL1);
497384Sgblack@eecs.umich.edu        if (!(crypto_reg & %(mask)d)) {
507384Sgblack@eecs.umich.edu            return std::make_shared<UndefinedInstruction>(machInst, true);
517375Sgblack@eecs.umich.edu        }
527375Sgblack@eecs.umich.edu    '''
537375Sgblack@eecs.umich.edu    cryptoRegRegRegPrefix = '''
547375Sgblack@eecs.umich.edu        Crypto crypto;
557375Sgblack@eecs.umich.edu        RegVect srcReg1, srcReg2, destReg;
567375Sgblack@eecs.umich.edu        // Read source and destination registers.
577375Sgblack@eecs.umich.edu    '''
587375Sgblack@eecs.umich.edu    for reg in range(4):
597375Sgblack@eecs.umich.edu        cryptoRegRegRegPrefix += '''
607375Sgblack@eecs.umich.edu            srcReg1.regs[%(reg)d] = htog(AA64FpOp1P%(reg)d_uw);
617375Sgblack@eecs.umich.edu            srcReg2.regs[%(reg)d] = htog(AA64FpOp2P%(reg)d_uw);
627375Sgblack@eecs.umich.edu            destReg.regs[%(reg)d] = htog(AA64FpDestP%(reg)d_uw);
637375Sgblack@eecs.umich.edu        ''' % { "reg" : reg }
647375Sgblack@eecs.umich.edu    cryptoRegRegRegPrefix += '''
657375Sgblack@eecs.umich.edu        unsigned char *output = (unsigned char *)(&destReg.regs[0]);
667375Sgblack@eecs.umich.edu        unsigned char *input  = (unsigned char *)(&srcReg1.regs[0]);
677375Sgblack@eecs.umich.edu        unsigned char *input2 = (unsigned char *)(&srcReg2.regs[0]);
687375Sgblack@eecs.umich.edu    '''
697375Sgblack@eecs.umich.edu
707375Sgblack@eecs.umich.edu    cryptoSuffix = ""
717375Sgblack@eecs.umich.edu    for reg in range(4):
727375Sgblack@eecs.umich.edu        cryptoSuffix += '''
737375Sgblack@eecs.umich.edu            AA64FpDestP%(reg)d_uw = gtoh(destReg.regs[%(reg)d]);
747375Sgblack@eecs.umich.edu        ''' % { "reg" : reg }
757375Sgblack@eecs.umich.edu
767375Sgblack@eecs.umich.edu    cryptoRegRegPrefix = '''
777376Sgblack@eecs.umich.edu        Crypto crypto;
787376Sgblack@eecs.umich.edu        RegVect srcReg1, destReg;
797376Sgblack@eecs.umich.edu        // Read source and destination registers.
807375Sgblack@eecs.umich.edu    '''
817375Sgblack@eecs.umich.edu    for reg in range(4):
827378Sgblack@eecs.umich.edu        cryptoRegRegPrefix += '''
837378Sgblack@eecs.umich.edu            srcReg1.regs[%(reg)d] = htog(AA64FpOp1P%(reg)d_uw);
847378Sgblack@eecs.umich.edu            destReg.regs[%(reg)d] = htog(AA64FpDestP%(reg)d_uw);
857378Sgblack@eecs.umich.edu        ''' % { "reg" : reg }
867378Sgblack@eecs.umich.edu
877378Sgblack@eecs.umich.edu    cryptoRegRegPrefix += '''
887378Sgblack@eecs.umich.edu        // cast into format passed to aes encrypt method.
897378Sgblack@eecs.umich.edu        unsigned char *output = (unsigned char *)(&destReg.regs[0]);
907378Sgblack@eecs.umich.edu        unsigned char *input  = (unsigned char *)(&srcReg1.regs[0]);
917378Sgblack@eecs.umich.edu    '''
927378Sgblack@eecs.umich.edu
937378Sgblack@eecs.umich.edu    def cryptoRegRegRegInst(name, Name, opClass, enable_check, crypto_func):
947378Sgblack@eecs.umich.edu        global header_output, decoder_output, exec_output
957378Sgblack@eecs.umich.edu
967378Sgblack@eecs.umich.edu        crypto_prefix = enable_check + cryptoRegRegRegPrefix
977378Sgblack@eecs.umich.edu        cryptocode = crypto_prefix + crypto_func + cryptoSuffix
987378Sgblack@eecs.umich.edu
997378Sgblack@eecs.umich.edu        cryptoiop = InstObjParams(name, Name, "RegRegRegOp",
1007378Sgblack@eecs.umich.edu                                { "code": cryptocode,
1017378Sgblack@eecs.umich.edu                                  "r_count": 4,
1027378Sgblack@eecs.umich.edu                                  "predicate_test": predicateTest,
1037378Sgblack@eecs.umich.edu                                  "op_class": opClass}, [])
1047378Sgblack@eecs.umich.edu        header_output += RegRegRegOpDeclare.subst(cryptoiop)
1057378Sgblack@eecs.umich.edu        decoder_output += RegRegRegOpConstructor.subst(cryptoiop)
1067378Sgblack@eecs.umich.edu        exec_output += CryptoPredOpExecute.subst(cryptoiop)
1077378Sgblack@eecs.umich.edu
1087382Sgblack@eecs.umich.edu    def cryptoRegRegInst(name, Name, opClass, enable_check, crypto_func):
1097382Sgblack@eecs.umich.edu        global header_output, decoder_output, exec_output
1107382Sgblack@eecs.umich.edu
1117382Sgblack@eecs.umich.edu        crypto_prefix = enable_check + cryptoRegRegPrefix
1127382Sgblack@eecs.umich.edu        cryptocode = crypto_prefix + crypto_func + cryptoSuffix
1137382Sgblack@eecs.umich.edu
1147382Sgblack@eecs.umich.edu        cryptoiop = InstObjParams(name, Name, "RegRegOp",
1157382Sgblack@eecs.umich.edu                                { "code": cryptocode,
1167382Sgblack@eecs.umich.edu                                  "r_count": 4,
1177382Sgblack@eecs.umich.edu                                  "predicate_test": predicateTest,
1187382Sgblack@eecs.umich.edu                                  "op_class": opClass}, [])
1197382Sgblack@eecs.umich.edu        header_output += RegRegOpDeclare.subst(cryptoiop)
1207382Sgblack@eecs.umich.edu        decoder_output += RegRegOpConstructor.subst(cryptoiop)
1217382Sgblack@eecs.umich.edu        exec_output += CryptoPredOpExecute.subst(cryptoiop)
1227382Sgblack@eecs.umich.edu
1237382Sgblack@eecs.umich.edu    aeseCode = "crypto.aesEncrypt(output, input, input2);"
1247382Sgblack@eecs.umich.edu    aesdCode = "crypto.aesDecrypt(output, input, input2);"
1257382Sgblack@eecs.umich.edu    aesmcCode = "crypto.aesMixColumns(output, input);"
1267382Sgblack@eecs.umich.edu    aesimcCode = "crypto.aesInvMixColumns(output, input);"
1277382Sgblack@eecs.umich.edu
1287384Sgblack@eecs.umich.edu    sha1_cCode = "crypto.sha1C(output, input, input2);"
1297384Sgblack@eecs.umich.edu    sha1_pCode = "crypto.sha1P(output, input, input2);"
1307384Sgblack@eecs.umich.edu    sha1_mCode = "crypto.sha1M(output, input, input2);"
1317384Sgblack@eecs.umich.edu    sha1_hCode = "crypto.sha1H(output, input);"
1327384Sgblack@eecs.umich.edu    sha1_su0Code = "crypto.sha1Su0(output, input, input2);"
1337384Sgblack@eecs.umich.edu    sha1_su1Code = "crypto.sha1Su1(output, input);"
1347384Sgblack@eecs.umich.edu
1357384Sgblack@eecs.umich.edu    sha256_hCode = "crypto.sha256H(output, input, input2);"
1367384Sgblack@eecs.umich.edu    sha256_h2Code = "crypto.sha256H2(output, input, input2);"
1377384Sgblack@eecs.umich.edu    sha256_su0Code = "crypto.sha256Su0(output, input);"
1387384Sgblack@eecs.umich.edu    sha256_su1Code = "crypto.sha256Su1(output, input, input2);"
1397384Sgblack@eecs.umich.edu
1407384Sgblack@eecs.umich.edu    aes_enabled = cryptoEnabledCheckCode % { "mask" : 0xF0 }
1417384Sgblack@eecs.umich.edu    cryptoRegRegRegInst("aese", "AESE64", "SimdAesOp",
1427384Sgblack@eecs.umich.edu                        aes_enabled, aeseCode)
1437384Sgblack@eecs.umich.edu    cryptoRegRegRegInst("aesd", "AESD64", "SimdAesOp",
1447384Sgblack@eecs.umich.edu                        aes_enabled, aesdCode)
1457384Sgblack@eecs.umich.edu    cryptoRegRegInst("aesmc", "AESMC64", "SimdAesMixOp",
1467384Sgblack@eecs.umich.edu                     aes_enabled, aesmcCode)
1477384Sgblack@eecs.umich.edu    cryptoRegRegInst("aesimc", "AESIMC64", "SimdAesMixOp",
1487384Sgblack@eecs.umich.edu                     aes_enabled, aesimcCode)
1497384Sgblack@eecs.umich.edu
1507384Sgblack@eecs.umich.edu    sha1_enabled = cryptoEnabledCheckCode % { "mask" : 0xF00 }
1517384Sgblack@eecs.umich.edu    cryptoRegRegRegInst("sha1c", "SHA1C64", "SimdSha1HashOp",
1527384Sgblack@eecs.umich.edu                        sha1_enabled, sha1_cCode)
1537384Sgblack@eecs.umich.edu    cryptoRegRegRegInst("sha1p", "SHA1P64", "SimdSha1HashOp",
1547384Sgblack@eecs.umich.edu                        sha1_enabled, sha1_pCode)
1557384Sgblack@eecs.umich.edu    cryptoRegRegRegInst("sha1m", "SHA1M64", "SimdSha1HashOp",
1567384Sgblack@eecs.umich.edu                        sha1_enabled, sha1_mCode)
1577384Sgblack@eecs.umich.edu    cryptoRegRegInst("sha1h", "SHA1H64", "SimdSha1Hash2Op",
1587384Sgblack@eecs.umich.edu                     sha1_enabled, sha1_hCode)
1597384Sgblack@eecs.umich.edu    cryptoRegRegRegInst("sha1su0", "SHA1SU064", "SimdShaSigma3Op",
1607384Sgblack@eecs.umich.edu                        sha1_enabled, sha1_su0Code)
1617384Sgblack@eecs.umich.edu    cryptoRegRegInst("sha1su1", "SHA1SU164", "SimdShaSigma2Op",
1627384Sgblack@eecs.umich.edu                     sha1_enabled, sha1_su1Code)
1637384Sgblack@eecs.umich.edu
1647384Sgblack@eecs.umich.edu    sha2_enabled = cryptoEnabledCheckCode % { "mask" : 0xF000 }
1657384Sgblack@eecs.umich.edu    cryptoRegRegRegInst("sha256h", "SHA256H64", "SimdSha256HashOp",
1667384Sgblack@eecs.umich.edu                        sha2_enabled, sha256_hCode)
1677384Sgblack@eecs.umich.edu    cryptoRegRegRegInst("sha256h2", "SHA256H264", "SimdSha256Hash2Op",
1687384Sgblack@eecs.umich.edu                        sha2_enabled, sha256_h2Code)
1697384Sgblack@eecs.umich.edu    cryptoRegRegInst("sha256su0", "SHA256SU064", "SimdShaSigma2Op",
1707384Sgblack@eecs.umich.edu                     sha2_enabled, sha256_su0Code)
1717384Sgblack@eecs.umich.edu    cryptoRegRegRegInst("sha256su1", "SHA256SU164", "SimdShaSigma3Op",
1727384Sgblack@eecs.umich.edu                        sha2_enabled, sha256_su1Code)
1737384Sgblack@eecs.umich.edu}};
1747384Sgblack@eecs.umich.edu
1757384Sgblack@eecs.umich.edu