Clarify choice of illegal instruction encoding The unprivileged spec says the following: We consider it a feature that any length of instruction containing all zero bits is not legal, as this quickly traps erroneous jumps into zeroed memory regions. Similarly, we also reserve the instruction encoding containing all ones to be an illegal instruction, to catch the other common pattern observed with unprogrammed non-volatile memory devices, disconnected memory buses, or broken memory devices. Software can rely on a naturally aligned 32-bit word containing zero to act as an illegal instruction on all RISC-V implementations, to be used by software where an illegal instruction is explicitly desired. Defining a corresponding known illegal value for all ones is more difficult due to the variable-length encoding. Software cannot generally use the illegal value of ILEN bits of all 1s, as software might not know ILEN for the eventual target machine (e.g., if software is compiled into a standard binary library used by many different machines). Defining a 32-bit word of all ones as illegal was also considered, as all machines must support a 32-bit instruction size, but this requires the instruction-fetch unit on machines with ILEN>32 report an illegal instruction exception rather than access fault when such an instruction borders a protection boundary, complicating variable-instruction-length fetch and decode. Signed-off-by: Ahmed Charles <acharles@outlook.com> Change-Id: I86c1b165efaaec0cb4c942da37f91903d737edb6
diff --git a/apps/sel4test-tests/src/tests/faults.c b/apps/sel4test-tests/src/tests/faults.c index 107236c..7ae7839 100644 --- a/apps/sel4test-tests/src/tests/faults.c +++ b/apps/sel4test-tests/src/tests/faults.c
@@ -394,6 +394,12 @@ /* Set SP to val. */ "mv sp, %[valptr]\n\t" + /* All ones is used as the illegal instruction because it is reasonable + * to assume that all current targets support a maximum instruction + * length (ILEN) of 32 bits. All zeros was considered and not used + * because all ones is easier to validated for the purposes of this + * test. Note: on targets that require 32 bit aligned instructions, + * this will be 32 bit aligned due to the previous instruction. */ "bad_instruction_address:\n\t" ".word 0xffffffff\n\t" "bad_instruction_restart_address:\n\t"