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