|
From: <sv...@va...> - 2014-12-09 21:01:35
|
Author: sewardj
Date: Tue Dec 9 21:01:28 2014
New Revision: 3036
Log:
Fix incorrect implementation of AESKEYGENASSIST in the case where
the two registers are the same. Fixes #341698.
Modified:
trunk/priv/guest_amd64_helpers.c
Modified: trunk/priv/guest_amd64_helpers.c
==============================================================================
--- trunk/priv/guest_amd64_helpers.c (original)
+++ trunk/priv/guest_amd64_helpers.c Tue Dec 9 21:01:28 2014
@@ -3845,10 +3845,19 @@
V128* argL = (V128*)( ((UChar*)gst) + gstOffL );
V128* argR = (V128*)( ((UChar*)gst) + gstOffR );
- argR->w32[3] = RotWord (SubWord (argL->w32[3])) ^ imm8;
- argR->w32[2] = SubWord (argL->w32[3]);
- argR->w32[1] = RotWord (SubWord (argL->w32[1])) ^ imm8;
- argR->w32[0] = SubWord (argL->w32[1]);
+ // We have to create the result in a temporary in the
+ // case where the src and dst regs are the same. See #341698.
+ V128 tmp;
+
+ tmp.w32[3] = RotWord (SubWord (argL->w32[3])) ^ imm8;
+ tmp.w32[2] = SubWord (argL->w32[3]);
+ tmp.w32[1] = RotWord (SubWord (argL->w32[1])) ^ imm8;
+ tmp.w32[0] = SubWord (argL->w32[1]);
+
+ argR->w32[3] = tmp.w32[3];
+ argR->w32[2] = tmp.w32[2];
+ argR->w32[1] = tmp.w32[1];
+ argR->w32[0] = tmp.w32[0];
}
|