execute1: Improve architecture compliance of MSR and related instructions
authorPaul Mackerras <paulus@ozlabs.org>
Tue, 28 Apr 2020 10:28:20 +0000 (20:28 +1000)
committerPaul Mackerras <paulus@ozlabs.org>
Tue, 28 Apr 2020 21:44:06 +0000 (07:44 +1000)
commitb55c9cc2987d30974adb06d2130ad774944252fd
treeeb4112d0f4014c7b6e24c6e05ef045a2c8cd2ea5
parentf21f9dd5a0acbe9215703161f599252f1bf87d80
execute1: Improve architecture compliance of MSR and related instructions

This makes our treatment of the MSR conform better with the ISA.

- On reset, initialize the MSR to have the SF and LE bits set and
  all the others reset.  For good measure initialize r properly too.

- Fix the bit numbering in msr_copy (the code was using big-endian
  bit numbers, not little-endian).

- Use constants like MSR_EE to index MSR bits instead of expressions
  like '63 - 48', for readability.

- Set MSR[SF, LE] and clear MSR[PR, IR, DR, RI] on interrupts.

- Copy the relevant fields for rfid instead of using msr_copy, because
  the partial function fields of the MSR should be left unchanged,
  not zeroed.  Our implementation of rfid is like the architecture
  description of hrfid, because we don't implement hypervisor mode.

- Return the whole MSR for mfmsr.

- Implement the L field for mtmsrd (L=1 copies just EE and RI).

- For mtmsrd with L=0, leave out the HV, ME and LE bits as per the arch.

- For mtmsrd and rfid, if PR ends up set, then also set EE, IR and DR
  as per the arch.

- A few other minor tidyups (no semantic change).

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