Commit 4d907d60f992b1747a8676e5f788ba971e0e322a
0 parents
Exists in
master
First Checkpoint
Showing 8 changed files with 493 additions and 0 deletions Side-by-side Diff
osproject.c
View file @
4d907d6
... | ... | @@ -0,0 +1,54 @@ |
1 | +/* | |
2 | + * * hello.c The simplest kernel module. | |
3 | + * */ | |
4 | +#include <stdio.h> | |
5 | + | |
6 | +#define ARMV7_PMNC_E (1 << 0) /* Enable all counters */ | |
7 | +#define ARMV7_PMNC_P (1 << 1) /* Reset all counters */ | |
8 | +#define ARMV7_PMNC_C (1 << 2) /* Cycle counter reset */ | |
9 | +#define ARMV7_PMNC_D (1 << 3) /* CCNT counts every 64th cpu cycle */ | |
10 | +#define ARMV7_PMNC_X (1 << 4) /* Export to ETM */ | |
11 | +#define ARMV7_PMNC_DP (1 << 5) /* Disable CCNT if non-invasive debug*/ | |
12 | +#define ARMV7_PMNC_N_SHIFT 11 /* Number of counters supported */ | |
13 | +#define ARMV7_PMNC_N_MASK 0x1f | |
14 | +#define ARMV7_PMNC_MASK 0x3f /* Mask for writable bits */ | |
15 | + | |
16 | +/*101b9173 | |
17 | +static u32 armv7_pmnc_read(void) | |
18 | +{ | |
19 | + u32 val; | |
20 | + asm volatile("mrc p15, 0, %0, c9, c12, 0" : "=r"(val)); | |
21 | + return val; | |
22 | +} | |
23 | + | |
24 | +static void armv7_pmnc_write(u32 val) | |
25 | +{ | |
26 | + val &= ARMV7_PMNC_MASK; | |
27 | + isb(); | |
28 | + asm volatile("mcr p15, 0, %0, c9, c12, 0" :: "r"(val)); | |
29 | +} | |
30 | +*/ | |
31 | + | |
32 | +static void dummy() | |
33 | +{ | |
34 | +} | |
35 | + | |
36 | +int main() | |
37 | +{ | |
38 | + unsigned int regr; | |
39 | + unsigned int i; | |
40 | + unsigned int a, b; | |
41 | + | |
42 | + printf("CSE237A: Hello world.\n"); | |
43 | + asm volatile("mrc p15, 0, %0, c9, c14, 0" : "=r" (regr)); | |
44 | + printf("regr: %x\n", regr); | |
45 | + | |
46 | + for (i = 0; i < 10; i++) { | |
47 | + asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r" (a)); | |
48 | + asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r" (b)); | |
49 | + printf("c[%u]: %u\n", i, b - a); | |
50 | + } | |
51 | + | |
52 | + | |
53 | + return 1; | |
54 | +} |
osproject_cswitch.c
View file @
4d907d6
... | ... | @@ -0,0 +1,80 @@ |
1 | +/* | |
2 | + * cswitch.c -- | |
3 | + * | |
4 | + * Simple program to test context switching by sending short | |
5 | + * messages back and forth through a pipe. Invocation: | |
6 | + * | |
7 | + * cswitch count | |
8 | + * | |
9 | + * Count tells how many times a one-byte message should be sent | |
10 | + * back and forth between two processes. | |
11 | + * | |
12 | + * Copyright 1987, 1989 Regents of the University of California | |
13 | + * Permission to use, copy, modify, and distribute this | |
14 | + * software and its documentation for any purpose and without | |
15 | + * fee is hereby granted, provided that the above copyright | |
16 | + * notice appear in all copies. The University of California | |
17 | + * makes no representations about the suitability of this | |
18 | + * software for any purpose. It is provided "as is" without | |
19 | + * express or implied warranty. | |
20 | + */ | |
21 | + | |
22 | +#ifndef lint | |
23 | +static char rcsid[] = "$Header: /sprite/src/benchmarks/cswitch/RCS/cswitch.c,v 1.1 89/08/31 13:19:37 ouster Exp $ SPRITE (Berkeley)"; | |
24 | +#endif not lint | |
25 | + | |
26 | +#include <stdio.h> | |
27 | +#include <sys/time.h> | |
28 | + | |
29 | +main(argc,argv) | |
30 | + int argc; | |
31 | + char **argv; | |
32 | +{ | |
33 | + int count, i, toSlave[2], fromSlave[2]; | |
34 | + int pid; | |
35 | + char buffer[10]; | |
36 | + struct timeval begin ,end; | |
37 | + int micros; | |
38 | + double timePer; | |
39 | + extern int errno; | |
40 | + | |
41 | + if (argc != 2 ) { | |
42 | + fprintf(stderr, "Ping takes one argument: count.\n"); | |
43 | + return; | |
44 | + } | |
45 | + count = 0; | |
46 | + sscanf(argv[1], "%d", &count); | |
47 | + pipe(toSlave); | |
48 | + pipe(fromSlave); | |
49 | + pid = fork(); | |
50 | + if (pid == 0) { | |
51 | + write(fromSlave[1], "a", 1); | |
52 | + while (1) { | |
53 | + read(toSlave[0], buffer, 1); | |
54 | + if (buffer[0] != 'a') { | |
55 | + exit(0); | |
56 | + } | |
57 | + write(fromSlave[1], "a", 1); | |
58 | + } | |
59 | + } | |
60 | + if (pid == -1) { | |
61 | + fprintf(stderr, "Couldn't fork slave process: error %d.\n", | |
62 | + errno); | |
63 | + return; | |
64 | + } | |
65 | + read(fromSlave[0], buffer, 1); | |
66 | + gettimeofday(&begin, (struct timezone *) NULL); | |
67 | + for (i = 0; i < count; i++) { | |
68 | + write(toSlave[1], "a", 1); | |
69 | + read(fromSlave[0], buffer, 1); | |
70 | + } | |
71 | + gettimeofday(&end, (struct timezone *) NULL); | |
72 | + micros = 1000000*(end.tv_sec - begin.tv_sec) | |
73 | + + end.tv_usec - begin.tv_usec; | |
74 | + write(toSlave[1], "b", 1); | |
75 | + timePer = micros; | |
76 | + timePer /= count * 1000; | |
77 | + | |
78 | + printf("Elapsed time per ping (2 context switches): %.2f milliseconds.\n", | |
79 | + timePer); | |
80 | +} |
osproject_pipe.c
View file @
4d907d6
... | ... | @@ -0,0 +1,86 @@ |
1 | +#include <sys/types.h> | |
2 | +#include <unistd.h> | |
3 | +#include <stdio.h> | |
4 | +#include <stdlib.h> | |
5 | +#include <signal.h> | |
6 | + | |
7 | +/* Read characters from the pipe and echo them to stdout. */ | |
8 | + | |
9 | +unsigned int time1, time2; | |
10 | +unsigned int avg = 0; | |
11 | + | |
12 | +int read_from_pipe (int file) | |
13 | +{ | |
14 | + | |
15 | + unsigned int c; | |
16 | + FILE *stream = fdopen (file, "r"); | |
17 | + fread(&c, sizeof(c), 1, stream); | |
18 | + //while ((c = fgetc (stream)) != EOF) | |
19 | + // putchar (c); | |
20 | + fclose (stream); | |
21 | + return c; | |
22 | + | |
23 | +} | |
24 | + | |
25 | +/* Write some random text to the pipe. */ | |
26 | + | |
27 | +void write_to_pipe (int file) | |
28 | +{ | |
29 | + unsigned int c; | |
30 | + asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r" (c)); | |
31 | + FILE *stream; | |
32 | + stream = fdopen (file, "w"); | |
33 | + fwrite(&c, sizeof(c), 1, stream); | |
34 | +// fprintf (stream, "hello, world!\n"); | |
35 | +// fprintf (stream, "goodbye, world!\n"); | |
36 | + fclose (stream); | |
37 | + | |
38 | +} | |
39 | + | |
40 | +int main (void) | |
41 | +{ | |
42 | + pid_t pid; | |
43 | + int mypipe[2]; | |
44 | + int i = 0; | |
45 | + unsigned int regr; | |
46 | + | |
47 | + /* Create the pipe. */ | |
48 | + if (pipe (mypipe)) { | |
49 | + printf ("Pipe failed.\n"); | |
50 | + return EXIT_FAILURE; | |
51 | + } | |
52 | + | |
53 | + asm volatile("mrc p15, 0, %0, c9, c14, 0" : "=r" (regr)); | |
54 | + printf("regr: %x\n", regr); | |
55 | + asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r" (regr)); | |
56 | + /* Create the child process. */ | |
57 | + if ((pid = fork()) == -1) | |
58 | + exit(1); | |
59 | + | |
60 | + if (pid) { | |
61 | + while(i < 100) { | |
62 | + /* This is the child process. Close other end first. */ | |
63 | + printf("parent process\n"); | |
64 | + close (mypipe[1]); | |
65 | + time1 = read_from_pipe (mypipe[0]); | |
66 | + asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r" (time2)); | |
67 | + printf("time2: %u, time1: %u, avg: %u\n", time2, time1, time2 - time1); | |
68 | + avg += (time2 - time1); | |
69 | + i++; | |
70 | + } | |
71 | + //kill(pid, SIGKILL); | |
72 | + } else { | |
73 | + while( i < 100) { | |
74 | + /* This is the parent process. Close other end first. */ | |
75 | + printf("child process\n"); | |
76 | + close (mypipe[0]); | |
77 | + //asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r" (time1)); | |
78 | + write_to_pipe (mypipe[1]); | |
79 | + usleep(1000); | |
80 | + i++; | |
81 | + } | |
82 | + } | |
83 | + | |
84 | + printf("Avg switching time: %u\n", avg); | |
85 | + return 0; | |
86 | +} |
osproject_syscall.c
View file @
4d907d6
... | ... | @@ -0,0 +1,23 @@ |
1 | +#include <stdio.h> | |
2 | + | |
3 | +int main() | |
4 | +{ | |
5 | + unsigned int regr; | |
6 | + unsigned int i; | |
7 | + unsigned int a, b; | |
8 | + | |
9 | + asm volatile("mrc p15, 0, %0, c9, c14, 0" : "=r" (regr)); | |
10 | + printf("regr: %x\n", regr); | |
11 | + | |
12 | + regr = 0; | |
13 | + while ( regr < 10) | |
14 | + { | |
15 | + asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r" (a)); | |
16 | + i = getpid(); | |
17 | + asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r" (b)); | |
18 | + | |
19 | + printf("PID: %u, Time for getpid: %u\n", i, b - a); | |
20 | + regr++; | |
21 | + } | |
22 | + return 1; | |
23 | +} |
osproject_task.c
View file @
4d907d6
... | ... | @@ -0,0 +1,31 @@ |
1 | +#include <stdio.h> | |
2 | + | |
3 | +int main() | |
4 | +{ | |
5 | + unsigned int regr; | |
6 | + unsigned int a, b; | |
7 | + unsigned int avg; | |
8 | + asm volatile("mrc p15, 0, %0, c9, c14, 0" : "=r" (regr)); | |
9 | + printf("regr: %x\n", regr); | |
10 | + | |
11 | + for (regr = 0; regr < 100; regr++) { | |
12 | + asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r" (a)); | |
13 | + asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r" (b)); | |
14 | + regr += (b - a); | |
15 | + } | |
16 | + | |
17 | + regr /= 100; | |
18 | + printf("Measurement overhead: %u\n", regr); | |
19 | + regr = 0; | |
20 | + while (regr < 100) { | |
21 | + asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r" (a)); | |
22 | + fork(); | |
23 | + asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r" (b)); | |
24 | + printf("Time for fork: %u\n", b - a); | |
25 | + avg += (b - a); | |
26 | + regr++; | |
27 | + } | |
28 | + | |
29 | + printf("Fork avg: %u\n", avg); | |
30 | + return 1; | |
31 | +} |
osproject_thread.c
View file @
4d907d6
... | ... | @@ -0,0 +1,39 @@ |
1 | +#include<stdio.h> | |
2 | +#include<string.h> | |
3 | +#include<pthread.h> | |
4 | +#include<stdlib.h> | |
5 | +#include<unistd.h> | |
6 | + | |
7 | +pthread_t tid[100]; | |
8 | + | |
9 | +void* doSomeThing(void *arg) | |
10 | +{ | |
11 | +} | |
12 | + | |
13 | +int main(void) | |
14 | +{ | |
15 | + int i = 0; | |
16 | + int err; | |
17 | + int avg = 0; | |
18 | + int a, b; | |
19 | + | |
20 | + printf("Entering the thing\n"); | |
21 | + | |
22 | + asm volatile("mrc p15, 0, %0, c9, c14, 0" : "=r" (err)); | |
23 | + printf("regr: %x\n", err); | |
24 | + | |
25 | + while(i < 100) { | |
26 | + asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r" (a)); | |
27 | + err = pthread_create(&(tid[i]), NULL, &doSomeThing, NULL); | |
28 | + asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r" (b)); | |
29 | + if (err != 0) | |
30 | + printf("Error in thread creation\n"); | |
31 | + //printf("Time for fork: %u\n", b - a); | |
32 | + avg += (b - a); | |
33 | + pthread_cancel(tid[i]); | |
34 | + i++; | |
35 | + } | |
36 | + | |
37 | + printf("Avg thread creation time is %d\n", avg/100); | |
38 | + return 1; | |
39 | +} |
osproject_threadpipe.c
View file @
4d907d6
... | ... | @@ -0,0 +1,69 @@ |
1 | +#include<stdio.h> | |
2 | +#include<string.h> | |
3 | +#include<pthread.h> | |
4 | +#include<stdlib.h> | |
5 | +#include<unistd.h> | |
6 | +#include<sys/types.h> | |
7 | +#include<sys/time.h> | |
8 | + | |
9 | +int fd[2]; | |
10 | +int n = 0; | |
11 | +long now = 0; | |
12 | + | |
13 | +unsigned int time1, time2, time3; | |
14 | +unsigned int avg = 0; | |
15 | + | |
16 | +void * writeThread() | |
17 | +{ | |
18 | +// for(n=1000;n>0;n--) | |
19 | +// { | |
20 | + asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r" (time1)); | |
21 | + write(fd[1],(void*)&time1,sizeof(time1)); | |
22 | + | |
23 | + usleep(1000); | |
24 | +// } | |
25 | + return 0; | |
26 | +} | |
27 | + | |
28 | +void * readThread() | |
29 | +{ | |
30 | + unsigned int switchTime; | |
31 | +// for(n=1000;n>0;n--) | |
32 | +// { | |
33 | + read(fd[0],(void*)&time3,sizeof(time3)); | |
34 | + asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r" (time2)); | |
35 | + switchTime = time2 - time3; | |
36 | + avg = avg + switchTime; | |
37 | +// } | |
38 | + avg = avg/1000; | |
39 | + return 0; | |
40 | +} | |
41 | + | |
42 | + | |
43 | + | |
44 | + | |
45 | +int main(int argc, char ** argv) { | |
46 | + | |
47 | + pthread_t tid1,tid2; | |
48 | + int i = 0; | |
49 | + unsigned int regr; | |
50 | + | |
51 | + /* Create the pipe. */ | |
52 | + if (pipe (fd)) { | |
53 | + printf ("Pipe failed.\n"); | |
54 | + return EXIT_FAILURE; | |
55 | + } | |
56 | + | |
57 | + asm volatile("mrc p15, 0, %0, c9, c14, 0" : "=r" (regr)); | |
58 | + printf("regr: %x\n", regr); | |
59 | + if (regr == 0) | |
60 | + exit(1); | |
61 | + printf("here\n"); | |
62 | + pthread_create(&tid1,NULL,writeThread,NULL); | |
63 | + pthread_create(&tid2,NULL,readThread,NULL); | |
64 | + /*pthread_join(tid1,NULL); | |
65 | + * pthread_join(tid2,NULL); | |
66 | + * */ | |
67 | + printf("%u",avg); | |
68 | + return 0; | |
69 | +} |
osproject_time.c
View file @
4d907d6
... | ... | @@ -0,0 +1,111 @@ |
1 | +#include <stdio.h> | |
2 | + | |
3 | +/* | |
4 | +static void dummy() | |
5 | +{ | |
6 | +} | |
7 | +*/ | |
8 | + | |
9 | +int dummy1(int a) | |
10 | +{ | |
11 | + int i = a; | |
12 | + return i; | |
13 | +} | |
14 | + | |
15 | +int dummy2(int a, int b) | |
16 | +{ | |
17 | + int i = b; | |
18 | + return i; | |
19 | +} | |
20 | + | |
21 | +int dummy3(int a, int b, int c) | |
22 | +{ | |
23 | + int i = c; | |
24 | + return i; | |
25 | +} | |
26 | + | |
27 | +int dummy4(int a, int b, int c, int d) | |
28 | +{ | |
29 | + int i = d; | |
30 | + return i; | |
31 | +} | |
32 | + | |
33 | +int dummy5(int a, int b, int c, int d, int e) | |
34 | +{ | |
35 | + int i = e; | |
36 | + return i; | |
37 | +} | |
38 | + | |
39 | +int dummy6(int a, int b, int c, int d, int e, int f) | |
40 | +{ | |
41 | + int i = f; | |
42 | + return i; | |
43 | +} | |
44 | + | |
45 | +int dummy7(int a, int b, int c, int d, int e, int f, int g) | |
46 | +{ | |
47 | + int i = g; | |
48 | + return i; | |
49 | +} | |
50 | + | |
51 | +int main() | |
52 | +{ | |
53 | + unsigned int regr; | |
54 | + unsigned int a, b; | |
55 | + unsigned int c1, c2, c3, c4, c5, c6, c7; | |
56 | + int d; | |
57 | + | |
58 | + printf("CSE237A: Hello world.\n"); | |
59 | + asm volatile("mrc p15, 0, %0, c9, c14, 0" : "=r" (regr)); | |
60 | + printf("regr: %x\n", regr); | |
61 | + | |
62 | +/* | |
63 | + for (i = 0; i < 10; i++) { | |
64 | + asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r" (a)); | |
65 | + asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r" (b)); | |
66 | + printf("c[%u]: %u\n", i, b - a); | |
67 | + } | |
68 | + | |
69 | + asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r" (a)); | |
70 | + dummy(); | |
71 | + asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r" (b)); | |
72 | + printf("Procedure call overhead: %u\n", b - a); | |
73 | +*/ | |
74 | + asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r" (a)); | |
75 | + d = dummy1(1); | |
76 | + asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r" (b)); | |
77 | + printf("Procedure call overhead with one arg: %u\n", b - a); | |
78 | + | |
79 | + asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r" (a)); | |
80 | + d = dummy2(c1, 2); | |
81 | + asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r" (b)); | |
82 | + printf("Procedure call overhead with 2 args: %u\n", b - a); | |
83 | + | |
84 | + asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r" (a)); | |
85 | + d = dummy3(c1, c2, 3); | |
86 | + asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r" (b)); | |
87 | + printf("Procedure call overhead with 3 args: %u\n", b - a); | |
88 | + | |
89 | + asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r" (a)); | |
90 | + d = dummy4(c1, c2, c3, 4); | |
91 | + asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r" (b)); | |
92 | + printf("Procedure call overhead with 4 args: %u\n", b - a); | |
93 | + | |
94 | + asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r" (a)); | |
95 | + d = dummy5(c1, c2, c3, c4, 5); | |
96 | + asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r" (b)); | |
97 | + printf("Procedure call overhead with 5 args: %u\n", b - a); | |
98 | + | |
99 | + asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r" (a)); | |
100 | + d = dummy6(c1, c2, c3, c4, c5, 6); | |
101 | + asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r" (b)); | |
102 | + printf("Procedure call overhead with 6 args: %u\n", b - a); | |
103 | + | |
104 | + asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r" (a)); | |
105 | + d = dummy7(c1, c2, c3, c4, c5, c6, 7); | |
106 | + asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r" (b)); | |
107 | + printf("Procedure call overhead with 7 args: %u\n", b - a); | |
108 | + printf("d: %d\n", d); | |
109 | + | |
110 | + return 0; | |
111 | +} |