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