Root/
Source at commit cdde9cf73945d547acd3e96f9508c79e84ad0bf1 created 12 years 9 months ago. By Maarten ter Huurne, MMC: JZ4740: Added support for CPU frequency changing | |
---|---|
1 | #!/usr/bin/python |
2 | # |
3 | # rt-mutex tester |
4 | # |
5 | # (C) 2006 Thomas Gleixner <tglx@linutronix.de> |
6 | # |
7 | # This program is free software; you can redistribute it and/or modify |
8 | # it under the terms of the GNU General Public License version 2 as |
9 | # published by the Free Software Foundation. |
10 | # |
11 | import os |
12 | import sys |
13 | import getopt |
14 | import shutil |
15 | import string |
16 | |
17 | # Globals |
18 | quiet = 0 |
19 | test = 0 |
20 | comments = 0 |
21 | |
22 | sysfsprefix = "/sys/devices/system/rttest/rttest" |
23 | statusfile = "/status" |
24 | commandfile = "/command" |
25 | |
26 | # Command opcodes |
27 | cmd_opcodes = { |
28 | "schedother" : "1", |
29 | "schedfifo" : "2", |
30 | "lock" : "3", |
31 | "locknowait" : "4", |
32 | "lockint" : "5", |
33 | "lockintnowait" : "6", |
34 | "lockcont" : "7", |
35 | "unlock" : "8", |
36 | "signal" : "11", |
37 | "resetevent" : "98", |
38 | "reset" : "99", |
39 | } |
40 | |
41 | test_opcodes = { |
42 | "prioeq" : ["P" , "eq" , None], |
43 | "priolt" : ["P" , "lt" , None], |
44 | "priogt" : ["P" , "gt" , None], |
45 | "nprioeq" : ["N" , "eq" , None], |
46 | "npriolt" : ["N" , "lt" , None], |
47 | "npriogt" : ["N" , "gt" , None], |
48 | "unlocked" : ["M" , "eq" , 0], |
49 | "trylock" : ["M" , "eq" , 1], |
50 | "blocked" : ["M" , "eq" , 2], |
51 | "blockedwake" : ["M" , "eq" , 3], |
52 | "locked" : ["M" , "eq" , 4], |
53 | "opcodeeq" : ["O" , "eq" , None], |
54 | "opcodelt" : ["O" , "lt" , None], |
55 | "opcodegt" : ["O" , "gt" , None], |
56 | "eventeq" : ["E" , "eq" , None], |
57 | "eventlt" : ["E" , "lt" , None], |
58 | "eventgt" : ["E" , "gt" , None], |
59 | } |
60 | |
61 | # Print usage information |
62 | def usage(): |
63 | print "rt-tester.py <-c -h -q -t> <testfile>" |
64 | print " -c display comments after first command" |
65 | print " -h help" |
66 | print " -q quiet mode" |
67 | print " -t test mode (syntax check)" |
68 | print " testfile: read test specification from testfile" |
69 | print " otherwise from stdin" |
70 | return |
71 | |
72 | # Print progress when not in quiet mode |
73 | def progress(str): |
74 | if not quiet: |
75 | print str |
76 | |
77 | # Analyse a status value |
78 | def analyse(val, top, arg): |
79 | |
80 | intval = int(val) |
81 | |
82 | if top[0] == "M": |
83 | intval = intval / (10 ** int(arg)) |
84 | intval = intval % 10 |
85 | argval = top[2] |
86 | elif top[0] == "O": |
87 | argval = int(cmd_opcodes.get(arg, arg)) |
88 | else: |
89 | argval = int(arg) |
90 | |
91 | # progress("%d %s %d" %(intval, top[1], argval)) |
92 | |
93 | if top[1] == "eq" and intval == argval: |
94 | return 1 |
95 | if top[1] == "lt" and intval < argval: |
96 | return 1 |
97 | if top[1] == "gt" and intval > argval: |
98 | return 1 |
99 | return 0 |
100 | |
101 | # Parse the commandline |
102 | try: |
103 | (options, arguments) = getopt.getopt(sys.argv[1:],'chqt') |
104 | except getopt.GetoptError, ex: |
105 | usage() |
106 | sys.exit(1) |
107 | |
108 | # Parse commandline options |
109 | for option, value in options: |
110 | if option == "-c": |
111 | comments = 1 |
112 | elif option == "-q": |
113 | quiet = 1 |
114 | elif option == "-t": |
115 | test = 1 |
116 | elif option == '-h': |
117 | usage() |
118 | sys.exit(0) |
119 | |
120 | # Select the input source |
121 | if arguments: |
122 | try: |
123 | fd = open(arguments[0]) |
124 | except Exception,ex: |
125 | sys.stderr.write("File not found %s\n" %(arguments[0])) |
126 | sys.exit(1) |
127 | else: |
128 | fd = sys.stdin |
129 | |
130 | linenr = 0 |
131 | |
132 | # Read the test patterns |
133 | while 1: |
134 | |
135 | linenr = linenr + 1 |
136 | line = fd.readline() |
137 | if not len(line): |
138 | break |
139 | |
140 | line = line.strip() |
141 | parts = line.split(":") |
142 | |
143 | if not parts or len(parts) < 1: |
144 | continue |
145 | |
146 | if len(parts[0]) == 0: |
147 | continue |
148 | |
149 | if parts[0].startswith("#"): |
150 | if comments > 1: |
151 | progress(line) |
152 | continue |
153 | |
154 | if comments == 1: |
155 | comments = 2 |
156 | |
157 | progress(line) |
158 | |
159 | cmd = parts[0].strip().lower() |
160 | opc = parts[1].strip().lower() |
161 | tid = parts[2].strip() |
162 | dat = parts[3].strip() |
163 | |
164 | try: |
165 | # Test or wait for a status value |
166 | if cmd == "t" or cmd == "w": |
167 | testop = test_opcodes[opc] |
168 | |
169 | fname = "%s%s%s" %(sysfsprefix, tid, statusfile) |
170 | if test: |
171 | print fname |
172 | continue |
173 | |
174 | while 1: |
175 | query = 1 |
176 | fsta = open(fname, 'r') |
177 | status = fsta.readline().strip() |
178 | fsta.close() |
179 | stat = status.split(",") |
180 | for s in stat: |
181 | s = s.strip() |
182 | if s.startswith(testop[0]): |
183 | # Separate status value |
184 | val = s[2:].strip() |
185 | query = analyse(val, testop, dat) |
186 | break |
187 | if query or cmd == "t": |
188 | break |
189 | |
190 | progress(" " + status) |
191 | |
192 | if not query: |
193 | sys.stderr.write("Test failed in line %d\n" %(linenr)) |
194 | sys.exit(1) |
195 | |
196 | # Issue a command to the tester |
197 | elif cmd == "c": |
198 | cmdnr = cmd_opcodes[opc] |
199 | # Build command string and sys filename |
200 | cmdstr = "%s:%s" %(cmdnr, dat) |
201 | fname = "%s%s%s" %(sysfsprefix, tid, commandfile) |
202 | if test: |
203 | print fname |
204 | continue |
205 | fcmd = open(fname, 'w') |
206 | fcmd.write(cmdstr) |
207 | fcmd.close() |
208 | |
209 | except Exception,ex: |
210 | sys.stderr.write(str(ex)) |
211 | sys.stderr.write("\nSyntax error in line %d\n" %(linenr)) |
212 | if not test: |
213 | fd.close() |
214 | sys.exit(1) |
215 | |
216 | # Normal exit pass |
217 | print "Pass" |
218 | sys.exit(0) |
219 | |
220 | |
221 |
Branches:
ben-wpan
ben-wpan-stefan
javiroman/ks7010
jz-2.6.34
jz-2.6.34-rc5
jz-2.6.34-rc6
jz-2.6.34-rc7
jz-2.6.35
jz-2.6.36
jz-2.6.37
jz-2.6.38
jz-2.6.39
jz-3.0
jz-3.1
jz-3.11
jz-3.12
jz-3.13
jz-3.15
jz-3.16
jz-3.18-dt
jz-3.2
jz-3.3
jz-3.4
jz-3.5
jz-3.6
jz-3.6-rc2-pwm
jz-3.9
jz-3.9-clk
jz-3.9-rc8
jz47xx
jz47xx-2.6.38
master
Tags:
od-2011-09-04
od-2011-09-18
v2.6.34-rc5
v2.6.34-rc6
v2.6.34-rc7
v3.9