stcke.c revision b32f58018498ea2225959b0ba11c18f0c433deef
1#include <stdio.h>
2#include<stdlib.h>
3#include<unistd.h>
4
5union stcke {
6	unsigned long buffer[2];
7	struct reader {
8		char pad;
9		unsigned long long time;
10		int time2;
11		short program;
12	} __attribute__ ((packed)) reader;
13};
14
15int stcke(unsigned long *addr)
16{
17
18	int cc;
19	asm volatile (	"stcke %0\n"
20			"ipm %1\n"
21			"srl %1, 28\n"
22		      :"+Q" (*addr), "=d"(cc)::"cc");
23
24	return cc;
25}
26
27unsigned long clockticks_in_msec(unsigned long b, unsigned long a)
28{
29	return (b -a ) / 4096000UL;
30}
31
32int main()
33{
34	union stcke start, end;
35	int cc;
36
37	cc = stcke(start.buffer);
38	if (cc)
39		printf("cc != 0!\n");
40
41	sleep(1);
42	cc = stcke(end.buffer);
43	if (cc)
44		printf("cc != 0!\n");
45
46	unsigned long c = clockticks_in_msec(end.reader.time,
47					     start.reader.time);
48
49	if (c >= 1000 && c < 1500)
50		printf("OK.....Testcase passed\n");
51	else
52		printf("FAILED.....Testcase failed\n");
53
54	return 0;
55
56}
57