1c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org// 2c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org// gettsc.inl 3c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org// 4c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org// gives access to the Pentium's (secret) cycle counter 5c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org// 6c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org// This software was written by Leonard Janke (janke@unixg.ubc.ca) 7c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org// in 1996-7 and is entered, by him, into the public domain. 8c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 9c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#if defined(__WATCOMC__) 10c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgvoid GetTSC(unsigned long&); 11c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#pragma aux GetTSC = 0x0f 0x31 "mov [edi], eax" parm [edi] modify [edx eax]; 12c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#elif defined(__GNUC__) 13c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orginline 14c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgvoid GetTSC(unsigned long& tsc) 15c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org{ 16c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org asm volatile(".byte 15, 49\n\t" 17c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org : "=eax" (tsc) 18c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org : 19c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org : "%edx", "%eax"); 20c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org} 21c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#elif defined(_MSC_VER) 22c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orginline 23c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgvoid GetTSC(unsigned long& tsc) 24c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org{ 25c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org unsigned long a; 26c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org __asm _emit 0fh 27c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org __asm _emit 31h 28c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org __asm mov a, eax; 29c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org tsc=a; 30c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org} 31c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif 32c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 33c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <stdio.h> 34c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <stdlib.h> 35c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/md4.h> 36c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 37c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgextern "C" { 38c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgvoid md4_block_x86(MD4_CTX *ctx, unsigned char *buffer,int num); 39c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org} 40c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 41c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgvoid main(int argc,char *argv[]) 42c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 43c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org unsigned char buffer[64*256]; 44c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org MD4_CTX ctx; 45c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org unsigned long s1,s2,e1,e2; 46c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org unsigned char k[16]; 47c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org unsigned long data[2]; 48c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org unsigned char iv[8]; 49c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int i,num=0,numm; 50c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int j=0; 51c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 52c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (argc >= 2) 53c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org num=atoi(argv[1]); 54c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 55c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (num == 0) num=16; 56c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (num > 250) num=16; 57c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org numm=num+2; 58c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org num*=64; 59c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org numm*=64; 60c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 61c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org for (j=0; j<6; j++) 62c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 63c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org for (i=0; i<10; i++) /**/ 64c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 65c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org md4_block_x86(&ctx,buffer,numm); 66c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org GetTSC(s1); 67c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org md4_block_x86(&ctx,buffer,numm); 68c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org GetTSC(e1); 69c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org GetTSC(s2); 70c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org md4_block_x86(&ctx,buffer,num); 71c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org GetTSC(e2); 72c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org md4_block_x86(&ctx,buffer,num); 73c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 74c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org printf("md4 (%d bytes) %d %d (%.2f)\n",num, 75c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org e1-s1,e2-s2,(double)((e1-s1)-(e2-s2))/2); 76c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 77c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 78c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 79