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