@@ -29,6 +29,7 @@ const dateFormat = "Jan 02 2006 15:04:05 MST"
29
29
30
30
func (mgr * Manager ) initHTTP () {
31
31
http .HandleFunc ("/" , mgr .httpSummary )
32
+ http .HandleFunc ("/syscalls" , mgr .httpSyscalls )
32
33
http .HandleFunc ("/corpus" , mgr .httpCorpus )
33
34
http .HandleFunc ("/crash" , mgr .httpCrash )
34
35
http .HandleFunc ("/cover" , mgr .httpCover )
@@ -52,8 +53,9 @@ func (mgr *Manager) initHTTP() {
52
53
53
54
func (mgr * Manager ) httpSummary (w http.ResponseWriter , r * http.Request ) {
54
55
data := & UISummaryData {
55
- Name : mgr .cfg .Name ,
56
- Log : CachedLogOutput (),
56
+ Name : mgr .cfg .Name ,
57
+ Log : CachedLogOutput (),
58
+ Stats : mgr .collectStats (),
57
59
}
58
60
59
61
var err error
@@ -62,13 +64,18 @@ func (mgr *Manager) httpSummary(w http.ResponseWriter, r *http.Request) {
62
64
return
63
65
}
64
66
65
- calls , err := mgr . collectSummary ( data )
66
- if err != nil {
67
- http . Error ( w , err . Error (), http .StatusInternalServerError )
67
+ if err := summaryTemplate . Execute ( w , data ); err != nil {
68
+ http . Error ( w , fmt . Sprintf ( "failed to execute template: %v" , err ),
69
+ http .StatusInternalServerError )
68
70
return
69
71
}
72
+ }
70
73
71
- for c , cc := range calls {
74
+ func (mgr * Manager ) httpSyscalls (w http.ResponseWriter , r * http.Request ) {
75
+ data := & UISyscallsData {
76
+ Name : mgr .cfg .Name ,
77
+ }
78
+ for c , cc := range mgr .collectSyscallInfo () {
72
79
data .Calls = append (data .Calls , UICallType {
73
80
Name : c ,
74
81
Inputs : cc .count ,
@@ -77,7 +84,7 @@ func (mgr *Manager) httpSummary(w http.ResponseWriter, r *http.Request) {
77
84
}
78
85
sort .Sort (UICallTypeArray (data .Calls ))
79
86
80
- if err := summaryTemplate .Execute (w , data ); err != nil {
87
+ if err := syscallsTemplate .Execute (w , data ); err != nil {
81
88
http .Error (w , fmt .Sprintf ("failed to execute template: %v" , err ),
82
89
http .StatusInternalServerError )
83
90
return
@@ -89,16 +96,18 @@ type CallCov struct {
89
96
cov cover.Cover
90
97
}
91
98
92
- func (mgr * Manager ) collectSummary ( data * UISummaryData ) ( map [ string ] * CallCov , error ) {
99
+ func (mgr * Manager ) collectStats () [] UIStat {
93
100
mgr .mu .Lock ()
94
101
defer mgr .mu .Unlock ()
95
102
96
- data .Stats = append (data .Stats , UIStat {Name : "uptime" , Value : fmt .Sprint (time .Since (mgr .startTime ) / 1e9 * 1e9 )})
97
- data .Stats = append (data .Stats , UIStat {Name : "fuzzing" , Value : fmt .Sprint (mgr .fuzzingTime / 60e9 * 60e9 )})
98
- data .Stats = append (data .Stats , UIStat {Name : "corpus" , Value : fmt .Sprint (len (mgr .corpus ))})
99
- data .Stats = append (data .Stats , UIStat {Name : "triage queue" , Value : fmt .Sprint (len (mgr .candidates ))})
100
- data .Stats = append (data .Stats , UIStat {Name : "cover" , Value : fmt .Sprint (len (mgr .corpusCover )), Link : "/cover" })
101
- data .Stats = append (data .Stats , UIStat {Name : "signal" , Value : fmt .Sprint (mgr .corpusSignal .Len ())})
103
+ var stats []UIStat
104
+ stats = append (stats , UIStat {Name : "uptime" , Value : fmt .Sprint (time .Since (mgr .startTime ) / 1e9 * 1e9 )})
105
+ stats = append (stats , UIStat {Name : "fuzzing" , Value : fmt .Sprint (mgr .fuzzingTime / 60e9 * 60e9 )})
106
+ stats = append (stats , UIStat {Name : "corpus" , Value : fmt .Sprint (len (mgr .corpus ))})
107
+ stats = append (stats , UIStat {Name : "triage queue" , Value : fmt .Sprint (len (mgr .candidates ))})
108
+ stats = append (stats , UIStat {Name : "cover" , Value : fmt .Sprint (len (mgr .corpusCover )), Link : "/cover" })
109
+ stats = append (stats , UIStat {Name : "signal" , Value : fmt .Sprint (mgr .corpusSignal .Len ())})
110
+ stats = append (stats , UIStat {Name : "syscalls" , Value : fmt .Sprint (len (mgr .enabledCalls )), Link : "/syscalls" })
102
111
103
112
secs := uint64 (1 )
104
113
if ! mgr .firstConnect .IsZero () {
@@ -118,9 +127,14 @@ func (mgr *Manager) collectSummary(data *UISummaryData) (map[string]*CallCov, er
118
127
}
119
128
intStats = append (intStats , UIStat {Name : k , Value : val })
120
129
}
121
-
122
130
sort .Sort (UIStatArray (intStats ))
123
- data .Stats = append (data .Stats , intStats ... )
131
+ stats = append (stats , intStats ... )
132
+ return stats
133
+ }
134
+
135
+ func (mgr * Manager ) collectSyscallInfo () map [string ]* CallCov {
136
+ mgr .mu .Lock ()
137
+ defer mgr .mu .Unlock ()
124
138
125
139
calls := make (map [string ]* CallCov )
126
140
for _ , inp := range mgr .corpus {
@@ -131,8 +145,7 @@ func (mgr *Manager) collectSummary(data *UISummaryData) (map[string]*CallCov, er
131
145
cc .count ++
132
146
cc .cov .Merge (inp .Cover )
133
147
}
134
-
135
- return calls , nil
148
+ return calls
136
149
}
137
150
138
151
func (mgr * Manager ) httpCrash (w http.ResponseWriter , r * http.Request ) {
@@ -445,11 +458,15 @@ func trimNewLines(data []byte) []byte {
445
458
type UISummaryData struct {
446
459
Name string
447
460
Stats []UIStat
448
- Calls []UICallType
449
461
Crashes []* UICrashType
450
462
Log string
451
463
}
452
464
465
+ type UISyscallsData struct {
466
+ Name string
467
+ Calls []UICallType
468
+ }
469
+
453
470
type UICrashType struct {
454
471
Description string
455
472
LastTime string
@@ -577,9 +594,17 @@ var summaryTemplate = template.Must(template.New("").Parse(addStyle(`
577
594
var textarea = document.getElementById("log_textarea");
578
595
textarea.scrollTop = textarea.scrollHeight;
579
596
</script>
580
- <br >
581
- <br>
597
+ </body></html >
598
+ ` )))
582
599
600
+ var syscallsTemplate = template .Must (template .New ("" ).Parse (addStyle (`
601
+ <!doctype html>
602
+ <html>
603
+ <head>
604
+ <title>{{.Name }} syzkaller</title>
605
+ {{STYLE}}
606
+ </head>
607
+ <body>
583
608
<b>Per-call coverage:</b>
584
609
<br>
585
610
{{range $c := $.Calls}}
0 commit comments