1// Convert targets using the old CPUState reset to DeviceState reset 2// 3// Copyright Linaro Ltd 2020 4// This work is licensed under the terms of the GNU GPLv2 or later. 5// 6// spatch --macro-file scripts/cocci-macro-file.h \ 7// --sp-file scripts/coccinelle/cpu-reset.cocci \ 8// --keep-comments --smpl-spacing --in-place --include-headers --dir target 9// 10// For simplicity we assume some things about the code we're modifying 11// that happen to be true for all our targets: 12// * all cpu_class_set_parent_reset() callsites have a 'DeviceClass *dc' local 13// * the parent reset field in the target CPU class is 'parent_reset' 14// * no reset function already has a 'dev' local 15 16@@ 17identifier cpu, x; 18typedef CPUState; 19@@ 20struct x { 21... 22- void (*parent_reset)(CPUState *cpu); 23+ DeviceReset parent_reset; 24... 25}; 26@ rule1 @ 27identifier resetfn; 28expression resetfield; 29identifier cc; 30@@ 31- cpu_class_set_parent_reset(cc, resetfn, resetfield) 32+ device_class_set_parent_reset(dc, resetfn, resetfield) 33@@ 34identifier rule1.resetfn; 35identifier cpu, cc; 36typedef CPUState, DeviceState; 37@@ 38-resetfn(CPUState *cpu) 39-{ 40+resetfn(DeviceState *dev) 41+{ 42+ CPUState *cpu = CPU(dev); 43<... 44- cc->parent_reset(cpu); 45+ cc->parent_reset(dev); 46...> 47} 48