- QEMU: various fixes regarding Thumb disassembly Quirk: if CPU is in ARM mode, the disassembler looks at the Thumb bit of the requested address. If CPU is in Thumb mode, the disassembler ignores the Thumb bit from the address, and always disassembles as Thumb. This inconsistency is also present in latest QEMU from git. Why? IDC scripts: comments containing disassembled Thumb code were updated (DIGIC 6/7/8 and 1300D).
- GDB scripts: removed NULL_STR definition from 5D4 (was breaking the tests; not required on this camera anyway)
- QEMU logging: in icount mode, print instruction count for every single function call Instruction count is printed when returning from the function. Instructions executed by other tasks/interrupts (i.e. outside the tested function) are not included in the printed value. This feature is very useful for optimizing code. Example: -d debugmsg,calls -icount 5
- QEMU logging: updated DryOS and VxWorks task switch handling It was quite hard to pass the test suite, as there were lots of edge cases: - context switch may happen either in a timer interrupt, or in a regular task (e.g. msleep, sempahores and so on) - context switch is not atomic - it happens a few instructions (or function calls!) afterh updating the current task pointer - until the registers are swapped for the new task, we are still on the stack of the previous task - there may be dummy task switches (i.e. from one task to the same task) - an interrupt can occur in the middle of a (non-atomic) context switch (!) - VxWorks models do not even use a unique task ID (!) Result: QEMU no longer crashes during logging tests! Issue: these cameras do not appear to use an unique task ID. Workaround: assign our own task IDs.
- QEMU test suite: only use 2/3 of available CPU cores. It appears to improve the repeatability of results in some CPU- and IO-intensive tests. In other words, don't believe the Hyper-Threading hype :)
- QEMU logging: removed magic stack ID values for interrupt and invalid task
- QEMU: refactored with eos_get_mem_w Before: uint32_t x; cpu_physical_memory_read(addr, &x, 4) After: uint32_t x = eos_get_mem_w(s, addr); Also, minor cleanups to eos_get_current_task_* (not expected to make a difference)