core: Implement big-endian mode
authorPaul Mackerras <paulus@ozlabs.org>
Wed, 12 Aug 2020 11:59:28 +0000 (21:59 +1000)
committerPaul Mackerras <paulus@ozlabs.org>
Thu, 20 Aug 2020 08:17:25 +0000 (18:17 +1000)
commit2e7b371305243f181807654bc6e82e223a567013
treef6efccfd4897ca1db1c113e8c55bbc02685ab448
parent3edc95eea50ef5520b6e399b1b9409555204933d
core: Implement big-endian mode

Big-endian mode affects both instruction fetches and data accesses.
For instruction fetches, we byte-swap each word read from memory when
writing it into the icache data RAM, and use a tag bit to indicate
whether each cache line contains instructions in BE or LE form.

For data accesses, we simply need to invert the existing byte_reverse
signal in BE mode.  The only thing to be careful of is to get the sign
bit from the correct place when doing a sign-extending load that
crosses two doublewords of memory.

For now, interrupts unconditionally set MSR[LE].  We will need some
sort of interrupt-little-endian bit somewhere, perhaps in LPCR.

This also fixes a debug report statement in fetch1.vhdl.

Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
common.vhdl
execute1.vhdl
fetch1.vhdl
icache.vhdl
loadstore1.vhdl