aboutsummaryrefslogtreecommitdiff
path: root/scripts/coccinelle/cpu-reset.cocci
blob: 396a724e514a85a7f692c2ef651e28ed8c2aad8e (plain)
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
47
// Convert targets using the old CPUState reset to DeviceState reset
//
// Copyright Linaro Ltd 2020
// This work is licensed under the terms of the GNU GPLv2 or later.
//
// spatch --macro-file scripts/cocci-macro-file.h \
//        --sp-file scripts/coccinelle/cpu-reset.cocci \
//        --keep-comments --smpl-spacing --in-place --include-headers --dir target
//
// For simplicity we assume some things about the code we're modifying
// that happen to be true for all our targets:
//  * all cpu_class_set_parent_reset() callsites have a 'DeviceClass *dc' local
//  * the parent reset field in the target CPU class is 'parent_reset'
//  * no reset function already has a 'dev' local

@@
identifier cpu, x;
typedef CPUState;
@@
struct x {
...
- void (*parent_reset)(CPUState *cpu);
+ DeviceReset parent_reset;
...
};
@ rule1 @
identifier resetfn;
expression resetfield;
identifier cc;
@@
- cpu_class_set_parent_reset(cc, resetfn, resetfield)
+ device_class_set_parent_reset(dc, resetfn, resetfield)
@@
identifier rule1.resetfn;
identifier cpu, cc;
typedef CPUState, DeviceState;
@@
-resetfn(CPUState *cpu)
-{
+resetfn(DeviceState *dev)
+{
+    CPUState *cpu = CPU(dev);
<...
-    cc->parent_reset(cpu);
+    cc->parent_reset(dev);
...>
}