The harder cases are those where the device code depends somehow on
the architecture. Some thoughts follow.
vl.c: a lot of work. Maybe the CPUState stuff should be separated to a new file.
dma.c: DMA_schedule needs access to CPUState.
Most users of CPUState (e.g. qemu-timer.c and hw/dma.c) either need it
as an opaque pointer, or only need access to target-independent stuff.
So you could:
1) make CPUState define only common fields. Include CPUState at the
beginning of each per-target CPUXYZState.
2) Do s/CPUState/CPUXYZState/ on target-*/*.
3) Make it compile, possibly by undoing parts of 2) and changing parts
of it to DO_UPCAST.
Paolo