Some more updates:
- emulate the picture taking process (60D and 1200D):
- can "capture" a full-res silent picture; that includes:
- EDMAC transfers and interrupts
-
image processing modules (dummy emulation of ADKIZ and HIV for now)
- HEAD timers (dummy emulation for now)
- you will need a reference image at qemu/<camera>/VRAM/PH-QR/RAW-000.DNG (a full-res silent picture)
- it cannot emulate the unmodified silent.mo because of some GUI calls
- you can either patch silent.c & raw.c, or use a minimal implementation
- 550D shows the date/time screen (but refuses to show the main screen)
- heartbeat timer now works on VxWorks models (can switch tasks)
- 450D emulates file I/O from main firmware
- a few more self-tests:
- portable ROM dumper test (SD I/O from bootloader; no CF yet)
- file I/O test from main firmware (check whether the DCIM directory is created at startup; SD models only)
- test for picture taking emulation (test code under minimal/qemu-frsp)
The first feature also reveals the register configurations required for taking a picture by directly driving the sensor with our own code

Full-res photo capture log:
qemu-60D-FA_CaptureTestImage.logCurrent self-test log:
Testing bootloaders...
5D: ROM READY
5D2: K218 READY
5D3: K285 READY
5D4: K349 READY
6D: K302 READY
7D: FAILED!
7D2M: K289M READY
40D: K190 READY : Ver 4.0.1
50D: K261 READY
60D: K287 READY
70D: K325 READY
80D: K350 READY
400D: InitializeIntercom
450D: K176 READY : Ver 4.0.3
500D: K252 READY
550D: K270 READY
600D: K286 READY
650D: K301 READY
700D: K326 READY
750D: K393 READY
760D: K347 READY
100D: K346 READY
1000D: K254 READY : Ver 3.7.5
1100D: K288 READY
1200D: K327 READY
EOSM: K331 READY
5D4AE: K349AE AECU Firm Ver. 5.8.1(5.8.1)
7D2S: K289S READY
Testing Canon GUI...
60D: OK
5D3: OK
550D: OK
600D: OK
1200D: OK
1100D: OK
Testing GDB scripts...
5D: [ tExcTask:ffb223cc ] task_create(CmdShell, prio=a, stack=0, entry=ffb22420, arg=0)
5D2: 5D2/debugmsg.gdb not present
5D3: [ init:ff0c32d4 ] task_create(Startup, prio=11, stack=400, entry=ff0c2928, arg=0)
5D4: [ init:fe0e14c9 ] task_create(SFRead, prio=11, stack=400, entry=fe0e0ef7, arg=620008)
6D: 6D/debugmsg.gdb not present
7D: 7D/debugmsg.gdb not present
7D2M: [ init:00002207 ] task_create(OmarInit, prio=f, stack=400, entry=2183, arg=4ae1ec)
40D: [ tTaskMain:ff812a60 ] task_create(HotPlug, prio=1e, stack=0, entry=ff812cb8, arg=0)
50D: 50D/debugmsg.gdb not present
60D: [ Startup:ff1dcc18 ] task_create(PropMgr, prio=14, stack=0, entry=ff1dcb24, arg=807b1c)
70D: [ init:ff0c3360 ] task_create(TaskMain, prio=1d, stack=0, entry=ff0c28ac, arg=0)
80D: [ init:fe0d449f ] task_create(TaskMain, prio=1d, stack=0, entry=fe0d3619, arg=0)
400D: [ tStartup:ffb1d1bc ] task_create(ImagePlayDriverTask, prio=19, stack=0, entry=ffa0ccd0, arg=0)
450D: [ tTaskMain:ffd0a664 ] task_create(PropMgr, prio=15, stack=0, entry=ffd0a9e4, arg=384e5c)
500D: 500D/debugmsg.gdb not present
550D: [ Startup:ff1d8b30 ] task_create(PropMgr, prio=14, stack=0, entry=ff1d8a3c, arg=726d20)
600D: [ Startup:ff1fbba8 ] task_create(PropMgr, prio=14, stack=0, entry=ff1fbab4, arg=757140)
650D: 650D/debugmsg.gdb not present
700D: [ Startup:ff0c38fc ] task_create(Startup2, prio=11, stack=400, entry=ff0c35b0, arg=0)
750D: [ init:fe0ce241 ] task_create(TaskMain, prio=1d, stack=0, entry=fe0cd4a9, arg=0)
760D: [ init:fe0ce445 ] task_create(TaskMain, prio=1d, stack=0, entry=fe0cd6ad, arg=0)
100D: FAILED!
1000D: [ :ff812eec ] task_create(HotPlug, prio=1e, stack=0, entry=ff813050, arg=0)
1100D: 1100D/debugmsg.gdb not present
1200D: [ K327:ff2b9bd8 ] task_create(PropMgr, prio=14, stack=0, entry=ff2b9ae4, arg=71a11c)
EOSM: EOSM/debugmsg.gdb not present
5D4AE: [ init:fe0a2aa1 ] task_create(TaskMain, prio=1d, stack=0, entry=fe0a2159, arg=0)
7D2S: 7D2S/debugmsg.gdb not present
EOSM3: [ Startup:010e17a9 ] task_create(SD1stInit, prio=18, stack=0, entry=10e1739, arg=0)
A1100: [ Startup:ffc3f6b0 ] task_create(SD1stInit, prio=18, stack=0, entry=ffc3f604, arg=0)
Setting up temporary SD/CF card images...
‘../magic-lantern/contrib/qemu/sd.img.xz’ -> ‘./sd.img.xz’
Testing FA_CaptureTestImage...
60D: OK
1200D: OK
Testing file I/O (DCIM directory)...
60D: OK
5D3: OK
550D: OK
600D: OK
1200D: OK
1100D: OK
100D: OK
450D: OK
Testing display from bootloader...
5D: OK
5D2: OK
5D3: OK
5D4: OK
6D: OK
7D: please check
7D2M: OK
40D: OK
50D: OK
60D: OK
70D: OK
80D: OK
400D: OK
450D: OK
500D: OK
550D: OK
600D: OK
650D: OK
700D: OK
750D: OK
760D: OK
100D: OK
1000D: OK
1100D: OK
1200D: OK
EOSM: OK
Testing EOS M3...
SD boot: StartDiskboot
Display: TurnOnDisplay
Preparing portable ROM dumper...
Testing portable ROM dumper...
5D: skipping
5D2: skipping
5D3: ROM0.BIN: OK ROM1.BIN: OK
5D4: ROM1.BIN: OK
6D: ROM0.BIN: OK ROM1.BIN: OK
7D: ROMs not saved
7D2M: ROM1.BIN: OK
40D: skipping
50D: skipping
60D: ROM0.BIN: OK ROM1.BIN: OK
70D: ROM0.BIN: OK ROM1.BIN: OK
80D: ROM1.BIN: OK
400D: skipping
450D: skipping
500D: skipping
550D: ROM0.BIN: OK ROM1.BIN: OK
600D: ROM0.BIN: OK ROM1.BIN: OK
650D: ROM0.BIN: OK ROM1.BIN: OK
700D: ROM0.BIN: OK ROM1.BIN: OK
750D: ROM1.BIN: OK
760D: ROM1.BIN: OK
100D: ROM0.BIN: OK ROM1.BIN: OK
1000D: skipping
1100D: ROM0.BIN: OK ROM1.BIN: OK
1200D: ROM0.BIN: OK ROM1.BIN: OK
EOSM: ROM0.BIN: OK ROM1.BIN: OK
Restoring your SD/CF card images...
It's getting close to being usable for testing the nightly builds

You may wonder why I'm looking at those old VxWorks models - they do a lot of things in a slightly different way, yet still compatible with the new models. This gives extra information for understanding hardware internals (e.g. different debug strings, or just exercising different code paths in QEMU).
For example, the photo taking code on 60D uses an old-style interface for the interrupt controller, but most other code uses the new one. There is a single interrupt controller, with two interfaces (see eos_handle_intengine and eos_handle_intengine_vx in eos.c). The VxWorks models use both interfaces (very old models probably use only the old interface).
Before looking at VxWorks models, I had no idea what the old-style registers might even be doing.
Will this extra knowledge translate into new features or new models ported? I hope so, but - as usual - can't promise anything. Feel free to jump in and get your hands dirty with the code.