Skip to content

Commit 6d234a6

Browse files
committed
[X86] Zero some outputs of Kelocker intrinsics in error case
Reviewed By: WangPengfei Differential Revision: https://reviews.llvm.org/D104766
1 parent c94c8d8 commit 6d234a6

File tree

3 files changed

+1387
-248
lines changed

3 files changed

+1387
-248
lines changed

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 64 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14736,46 +14736,88 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID,
1473614736
case X86::BI__builtin_ia32_aesenc256kl_u8:
1473714737
case X86::BI__builtin_ia32_aesdec256kl_u8: {
1473814738
Intrinsic::ID IID;
14739+
StringRef StrNoErr, StrErr, StrEnd;
1473914740
switch (BuiltinID) {
1474014741
default: llvm_unreachable("Unexpected builtin");
1474114742
case X86::BI__builtin_ia32_aesenc128kl_u8:
1474214743
IID = Intrinsic::x86_aesenc128kl;
14744+
StrNoErr = "aesenc128kl_no_error";
14745+
StrErr = "aesenc128kl_error";
14746+
StrEnd = "aesenc128kl_end";
1474314747
break;
1474414748
case X86::BI__builtin_ia32_aesdec128kl_u8:
1474514749
IID = Intrinsic::x86_aesdec128kl;
14750+
StrNoErr = "aesdec128kl_no_error";
14751+
StrErr = "aesdec128kl_error";
14752+
StrEnd = "aesdec128kl_end";
1474614753
break;
1474714754
case X86::BI__builtin_ia32_aesenc256kl_u8:
1474814755
IID = Intrinsic::x86_aesenc256kl;
14756+
StrNoErr = "aesenc256kl_no_error";
14757+
StrErr = "aesenc256kl_error";
14758+
StrEnd = "aesenc256kl_end";
1474914759
break;
1475014760
case X86::BI__builtin_ia32_aesdec256kl_u8:
1475114761
IID = Intrinsic::x86_aesdec256kl;
14762+
StrNoErr = "aesdec256kl_no_error";
14763+
StrErr = "aesdec256kl_error";
14764+
StrEnd = "aesdec256kl_end";
1475214765
break;
1475314766
}
1475414767

1475514768
Value *Call = Builder.CreateCall(CGM.getIntrinsic(IID), {Ops[1], Ops[2]});
1475614769

14757-
Builder.CreateDefaultAlignedStore(Builder.CreateExtractValue(Call, 1),
14758-
Ops[0]);
14770+
BasicBlock *NoError = createBasicBlock(StrNoErr, this->CurFn);
14771+
BasicBlock *Error = createBasicBlock(StrErr, this->CurFn);
14772+
BasicBlock *End = createBasicBlock(StrEnd, this->CurFn);
14773+
14774+
Value *Ret = Builder.CreateExtractValue(Call, 0);
14775+
Value *Succ = Builder.CreateTrunc(Ret, Builder.getInt1Ty());
14776+
Value *Out = Builder.CreateExtractValue(Call, 1);
14777+
Builder.CreateCondBr(Succ, NoError, Error);
14778+
14779+
Builder.SetInsertPoint(NoError);
14780+
Builder.CreateDefaultAlignedStore(Out, Ops[0]);
14781+
Builder.CreateBr(End);
1475914782

14783+
Builder.SetInsertPoint(Error);
14784+
Constant *Zero = llvm::Constant::getNullValue(Out->getType());
14785+
Builder.CreateDefaultAlignedStore(Zero, Ops[0]);
14786+
Builder.CreateBr(End);
14787+
14788+
Builder.SetInsertPoint(End);
1476014789
return Builder.CreateExtractValue(Call, 0);
1476114790
}
1476214791
case X86::BI__builtin_ia32_aesencwide128kl_u8:
1476314792
case X86::BI__builtin_ia32_aesdecwide128kl_u8:
1476414793
case X86::BI__builtin_ia32_aesencwide256kl_u8:
1476514794
case X86::BI__builtin_ia32_aesdecwide256kl_u8: {
1476614795
Intrinsic::ID IID;
14796+
StringRef StrNoErr, StrErr, StrEnd;
1476714797
switch (BuiltinID) {
1476814798
case X86::BI__builtin_ia32_aesencwide128kl_u8:
1476914799
IID = Intrinsic::x86_aesencwide128kl;
14800+
StrNoErr = "aesencwide128kl_no_error";
14801+
StrErr = "aesencwide128kl_error";
14802+
StrEnd = "aesencwide128kl_end";
1477014803
break;
1477114804
case X86::BI__builtin_ia32_aesdecwide128kl_u8:
1477214805
IID = Intrinsic::x86_aesdecwide128kl;
14806+
StrNoErr = "aesdecwide128kl_no_error";
14807+
StrErr = "aesdecwide128kl_error";
14808+
StrEnd = "aesdecwide128kl_end";
1477314809
break;
1477414810
case X86::BI__builtin_ia32_aesencwide256kl_u8:
1477514811
IID = Intrinsic::x86_aesencwide256kl;
14812+
StrNoErr = "aesencwide256kl_no_error";
14813+
StrErr = "aesencwide256kl_error";
14814+
StrEnd = "aesencwide256kl_end";
1477614815
break;
1477714816
case X86::BI__builtin_ia32_aesdecwide256kl_u8:
1477814817
IID = Intrinsic::x86_aesdecwide256kl;
14818+
StrNoErr = "aesdecwide256kl_no_error";
14819+
StrErr = "aesdecwide256kl_error";
14820+
StrEnd = "aesdecwide256kl_end";
1477914821
break;
1478014822
}
1478114823

@@ -14789,12 +14831,32 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID,
1478914831

1479014832
Value *Call = Builder.CreateCall(CGM.getIntrinsic(IID), InOps);
1479114833

14834+
BasicBlock *NoError = createBasicBlock(StrNoErr, this->CurFn);
14835+
BasicBlock *Error = createBasicBlock(StrErr, this->CurFn);
14836+
BasicBlock *End = createBasicBlock(StrEnd, this->CurFn);
14837+
14838+
Value *Ret = Builder.CreateExtractValue(Call, 0);
14839+
Value *Succ = Builder.CreateTrunc(Ret, Builder.getInt1Ty());
14840+
Builder.CreateCondBr(Succ, NoError, Error);
14841+
14842+
Builder.SetInsertPoint(NoError);
1479214843
for (int i = 0; i != 8; ++i) {
1479314844
Value *Extract = Builder.CreateExtractValue(Call, i + 1);
1479414845
Value *Ptr = Builder.CreateConstGEP1_32(Ops[0], i);
1479514846
Builder.CreateAlignedStore(Extract, Ptr, Align(16));
1479614847
}
14848+
Builder.CreateBr(End);
14849+
14850+
Builder.SetInsertPoint(Error);
14851+
for (int i = 0; i != 8; ++i) {
14852+
Value *Out = Builder.CreateExtractValue(Call, i + 1);
14853+
Constant *Zero = llvm::Constant::getNullValue(Out->getType());
14854+
Value *Ptr = Builder.CreateConstGEP1_32(Ops[0], i);
14855+
Builder.CreateAlignedStore(Zero, Ptr, Align(16));
14856+
}
14857+
Builder.CreateBr(End);
1479714858

14859+
Builder.SetInsertPoint(End);
1479814860
return Builder.CreateExtractValue(Call, 0);
1479914861
}
1480014862
}

clang/lib/Headers/keylockerintrin.h

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,10 +230,12 @@ _mm_aesenc128kl_u8(__m128i* __odata, __m128i __idata, const void *__h) {
230230
/// HandleKeyType (Handle[511:0]) != HANDLE_KEY_TYPE_AES256 )
231231
/// IF (IllegalHandle)
232232
/// ZF := 1
233+
/// MEM[__odata+127:__odata] := 0
233234
/// ELSE
234235
/// (UnwrappedKey, Authentic) := UnwrapKeyAndAuthenticate512 (Handle[511:0], IWKey)
235236
/// IF (Authentic == 0)
236237
/// ZF := 1
238+
/// MEM[__odata+127:__odata] := 0
237239
/// ELSE
238240
/// MEM[__odata+127:__odata] := AES256Encrypt (__idata[127:0], UnwrappedKey)
239241
/// ZF := 0
@@ -267,10 +269,12 @@ _mm_aesenc256kl_u8(__m128i* __odata, __m128i __idata, const void *__h) {
267269
/// HandleKeyType (Handle[383:0]) != HANDLE_KEY_TYPE_AES128)
268270
/// IF (IllegalHandle)
269271
/// ZF := 1
272+
/// MEM[__odata+127:__odata] := 0
270273
/// ELSE
271274
/// (UnwrappedKey, Authentic) := UnwrapKeyAndAuthenticate384 (Handle[383:0], IWKey)
272275
/// IF (Authentic == 0)
273276
/// ZF := 1
277+
/// MEM[__odata+127:__odata] := 0
274278
/// ELSE
275279
/// MEM[__odata+127:__odata] := AES128Decrypt (__idata[127:0], UnwrappedKey)
276280
/// ZF := 0
@@ -304,10 +308,12 @@ _mm_aesdec128kl_u8(__m128i* __odata, __m128i __idata, const void *__h) {
304308
/// HandleKeyType (Handle[511:0]) != HANDLE_KEY_TYPE_AES256)
305309
/// IF (IllegalHandle)
306310
/// ZF := 1
311+
/// MEM[__odata+127:__odata] := 0
307312
/// ELSE
308313
/// (UnwrappedKey, Authentic) := UnwrapKeyAndAuthenticate512 (Handle[511:0], IWKey)
309314
/// IF (Authentic == 0)
310315
/// ZF := 1
316+
/// MEM[__odata+127:__odata] := 0
311317
/// ELSE
312318
/// MEM[__odata+127:__odata] := AES256Decrypt (__idata[127:0], UnwrappedKey)
313319
/// ZF := 0
@@ -354,10 +360,16 @@ _mm_aesdec256kl_u8(__m128i* __odata, __m128i __idata, const void *__h) {
354360
/// HandleKeyType (Handle[383:0]) != HANDLE_KEY_TYPE_AES128 )
355361
/// IF (IllegalHandle)
356362
/// ZF := 1
363+
/// FOR i := 0 to 7
364+
/// __odata[i] := 0
365+
/// ENDFOR
357366
/// ELSE
358367
/// (UnwrappedKey, Authentic) := UnwrapKeyAndAuthenticate384 (Handle[383:0], IWKey)
359368
/// IF Authentic == 0
360369
/// ZF := 1
370+
/// FOR i := 0 to 7
371+
/// __odata[i] := 0
372+
/// ENDFOR
361373
/// ELSE
362374
/// FOR i := 0 to 7
363375
/// __odata[i] := AES128Encrypt (__idata[i], UnwrappedKey)
@@ -394,10 +406,16 @@ _mm_aesencwide128kl_u8(__m128i __odata[8], const __m128i __idata[8], const void*
394406
/// HandleKeyType (Handle[511:0]) != HANDLE_KEY_TYPE_AES512 )
395407
/// IF (IllegalHandle)
396408
/// ZF := 1
409+
/// FOR i := 0 to 7
410+
/// __odata[i] := 0
411+
/// ENDFOR
397412
/// ELSE
398413
/// (UnwrappedKey, Authentic) := UnwrapKeyAndAuthenticate512 (Handle[511:0], IWKey)
399414
/// IF Authentic == 0
400415
/// ZF := 1
416+
/// FOR i := 0 to 7
417+
/// __odata[i] := 0
418+
/// ENDFOR
401419
/// ELSE
402420
/// FOR i := 0 to 7
403421
/// __odata[i] := AES256Encrypt (__idata[i], UnwrappedKey)
@@ -434,10 +452,16 @@ _mm_aesencwide256kl_u8(__m128i __odata[8], const __m128i __idata[8], const void*
434452
/// HandleKeyType (Handle) != HANDLE_KEY_TYPE_AES128 )
435453
/// IF (IllegalHandle)
436454
/// ZF := 1
455+
/// FOR i := 0 to 7
456+
/// __odata[i] := 0
457+
/// ENDFOR
437458
/// ELSE
438459
/// (UnwrappedKey, Authentic) := UnwrapKeyAndAuthenticate384 (Handle[383:0], IWKey)
439460
/// IF Authentic == 0
440461
/// ZF := 1
462+
/// FOR i := 0 to 7
463+
/// __odata[i] := 0
464+
/// ENDFOR
441465
/// ELSE
442466
/// FOR i := 0 to 7
443467
/// __odata[i] := AES128Decrypt (__idata[i], UnwrappedKey)
@@ -474,10 +498,16 @@ _mm_aesdecwide128kl_u8(__m128i __odata[8], const __m128i __idata[8], const void*
474498
/// HandleKeyType (Handle) != HANDLE_KEY_TYPE_AES512 )
475499
/// If (IllegalHandle)
476500
/// ZF := 1
501+
/// FOR i := 0 to 7
502+
/// __odata[i] := 0
503+
/// ENDFOR
477504
/// ELSE
478505
/// (UnwrappedKey, Authentic) := UnwrapKeyAndAuthenticate512 (Handle[511:0], IWKey)
479506
/// IF Authentic == 0
480507
/// ZF := 1
508+
/// FOR i := 0 to 7
509+
/// __odata[i] := 0
510+
/// ENDFOR
481511
/// ELSE
482512
/// FOR i := 0 to 7
483513
/// __odata[i] := AES256Decrypt (__idata[i], UnwrappedKey)

0 commit comments

Comments
 (0)