I tracked down the bug which prevents chameleon rc3 boot from SiliconImage cards.
Though read_lba of boot0.s saves/restores registers using pusha/popa, callers of the subroutine expects upper 16bits of registers are preserved - for example, code just before initBootLoader expects eax does not change.
Most BIOS preserves upper 16bits of registers, but SiliconImage BIOS doesn't and causes crash.
The fix is very simple - just replace read_lba's pusha/popa by pushad/popad.
-- I mistyped boot0.s as bios0.s in the first post.