// 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); ...> }