EFI_UINT32 getCPUTick(void)␊ |
{␊ |
␉uint32_t out;␊ |
␉/*␊ |
␉ * Note: shl $32, %edx leaves 0 in %edx, and or to %eax does nothing - zenith432␊ |
␉ */␊ |
␉__asm__ volatile (␊ |
␉␉"rdtsc\n"␊ |
␉␉"shl $32,%%edx\n"␊ |
|
␊ |
␉␉␉␉seedBuffer[index] = (edi & 0xff);␊ |
#else␊ |
␉␉␉␉ecx = (cpuTick >> 8);␉␉␉␉␉␉// mov␉␉%rax,␉%rcx␊ |
␉␉␉␉rcx = (cpuTick >> 8);␉␉␉␉␉␉// mov␉␉%rax,␉%rcx␊ |
␉␉␉␉// shr␉␉$0x8,␉%rcx␊ |
␉␉␉␉edx = (cpuTick >> 0x10);␉␉␉␉␉// mov␉␉%rax,␉%rdx␊ |
␉␉␉␉rdx = (cpuTick >> 0x10);␉␉␉␉␉// mov␉␉%rax,␉%rdx␊ |
␉␉␉␉// shr␉␉$0x10,␉%rdx␊ |
␉␉␉␉edi = esi;␉␉␉␉␉␉␉// mov␉␉%rsi,␉%rdi␊ |
␉␉␉␉edi = (edi ^ cpuTick);␉␉␉␉␉␉// xor␉␉%rax,␉%rdi␊ |
␉␉␉␉edi = (edi ^ ecx);␉␉␉␉␉␉// xor␉␉%rcx,␉%rdi␊ |
␉␉␉␉edi = (edi ^ edx);␉␉␉␉␉␉// xor␉␉%rdx,␉%rdi␊ |
␉␉␉␉/*␊ |
␉␉␉␉ * Note: In x86 assembly, rXX is upper part of eXX register.␊ |
␉␉␉␉ * In C they're different variables.␊ |
␉␉␉␉ * The code is identical with or without RANDOMSEED. - zenith432␊ |
␉␉␉␉ */␊ |
␉␉␉␉rdi = rsi = esi;␉␉␉␉␉␉// mov␉␉%rsi,␉%rdi␊ |
␉␉␉␉rdi = (rdi ^ cpuTick);␉␉␉␉␉␉// xor␉␉%rax,␉%rdi␊ |
␉␉␉␉rdi = (rdi ^ rcx);␉␉␉␉␉␉// xor␉␉%rcx,␉%rdi␊ |
␉␉␉␉rdi = (rdi ^ rdx);␉␉␉␉␉␉// xor␉␉%rdx,␉%rdi␊ |
␉␉␉␉edi = (EFI_UINT32) rdi;␊ |
␊ |
␉␉␉␉seedBuffer[index] = (edi & 0xff);␉␉␉␉// mov␉␉%dil,␉(%r15,%r12,1)␊ |
␉␉␉␉seedBuffer[index] = (rdi & 0xff);␉␉␉␉// mov␉␉%dil,␉(%r15,%r12,1)␊ |
#endif␊ |
␉␉␉␉edi = (edi & 0x2f);␉␉␉␉␉␉// and␉␉$0x2f,␉%edi␊ |
␉␉␉␉edi = (edi + esi);␉␉␉␉␉␉// add␉␉%esi,␉%edi␊ |