File: syscall_consistency.exp

package info (click to toggle)
systemtap 5.1-5
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 47,964 kB
  • sloc: cpp: 80,838; ansic: 54,757; xml: 49,725; exp: 43,665; sh: 11,527; python: 5,003; perl: 2,252; tcl: 1,312; makefile: 1,006; javascript: 149; lisp: 105; awk: 101; asm: 91; java: 70; sed: 16
file content (46 lines) | stat: -rw-r--r-- 1,427 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
set test "syscall_consistency"

# This test checks if all the syscall probes have respective nd_syscall
# counterparts and that list of locals of any syscall probe matches
# respective list of locals of its nd_syscall counterpart.

proc get_syscalls {arr filter} {
    upvar 1 $arr sca
    catch {set listing [exec stap -L $filter 2>@1]}
    set records [split $listing "\n"]
    foreach rec [lsort -ascii $records] {
        set fields [split $rec " "]
        set locals ""
	set scname "unknown"
        foreach token [lsort -ascii $fields] {
            regexp "\\.(\[^\\.\]+)" $token _ scname
            if {[regexp "^(\[\^_$\]\[^:\]+):" $token _ arg]} {
                set locals "$locals $arg"
            }
        }
        set sca($scname) $locals
    }
    pass "listing $filter"
}

get_syscalls syscalls "syscall.*"
get_syscalls nd_syscalls "nd_syscall.*"

# compare syscalls against nd_syscalls, compare locals
foreach {key val} [array get syscalls] {
    if {![info exists nd_syscalls($key)]} {
        fail "missing nd_syscall $key"
    } elseif {![string equal $val $nd_syscalls($key)]} {
        fail "unmatched locals for $key:"
        verbose -log "syscall.$key: $val"
        verbose -log "nd_syscall.$key: $nd_syscalls($key)"
    }
}

# compare nd_syscalls against syscalls
foreach {key val} [array get nd_syscalls] {
    if {![info exists syscalls($key)]} {
        fail "missing syscall $key"
    }
}