qemu/target
Peter Maydell 35337cc391 target/arm: Implement security attribute lookups for memory accesses
Implement the security attribute lookups for memory accesses
in the get_phys_addr() functions, causing these to generate
various kinds of SecureFault for bad accesses.

The major subtlety in this code relates to handling of the
case when the security attributes the SAU assigns to the
address don't match the current security state of the CPU.

In the ARM ARM pseudocode for validating instruction
accesses, the security attributes of the address determine
whether the Secure or NonSecure MPU state is used. At face
value, handling this would require us to encode the relevant
bits of state into mmu_idx for both S and NS at once, which
would result in our needing 16 mmu indexes. Fortunately we
don't actually need to do this because a mismatch between
address attributes and CPU state means either:
 * some kind of fault (usually a SecureFault, but in theory
   perhaps a UserFault for unaligned access to Device memory)
 * execution of the SG instruction in NS state from a
   Secure & NonSecure code region

The purpose of SG is simply to flip the CPU into Secure
state, so we can handle it by emulating execution of that
instruction directly in arm_v7m_cpu_do_interrupt(), which
means we can treat all the mismatch cases as "throw an
exception" and we don't need to encode the state of the
other MPU bank into our mmu_idx values.

This commit doesn't include the actual emulation of SG;
it also doesn't include implementation of the IDAU, which
is a per-board way to specify hard-coded memory attributes
for addresses, which override the CPU-internal SAU if they
specify a more secure setting than the SAU is programmed to.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Message-id: 1506092407-26985-15-git-send-email-peter.maydell@linaro.org
2017-10-06 16:46:49 +01:00
..
alpha target/alpha: Switch to do_transaction_failed() hook 2017-09-07 11:15:55 -07:00
arm target/arm: Implement security attribute lookups for memory accesses 2017-10-06 16:46:49 +01:00
cris target: [tcg] Use a generic enum for DISAS_ values 2017-09-06 08:06:47 -07:00
hppa target/hppa: Convert to TranslatorOps 2017-09-07 11:23:13 -07:00
i386 migration: pre_save return int 2017-09-27 11:35:59 +01:00
lm32 target: [tcg] Use a generic enum for DISAS_ values 2017-09-06 08:06:47 -07:00
m68k target/m68k: Switch fpu_rom from make_floatx80() to make_floatx80_init() 2017-09-10 18:07:40 +02:00
microblaze target: [tcg] Use a generic enum for DISAS_ values 2017-09-06 08:06:47 -07:00
mips mips: Improve macro parenthesization 2017-09-21 13:25:41 +01:00
moxie moxie: replace cpu_moxie_init() with cpu_generic_init() 2017-09-01 11:54:25 -03:00
nios2 target: [tcg] Use a generic enum for DISAS_ values 2017-09-06 08:06:47 -07:00
openrisc target: [tcg] Use a generic enum for DISAS_ values 2017-09-06 08:06:47 -07:00
ppc Migration pull 2017-09-27 2017-09-27 22:44:51 +01:00
s390x s390x/tcg: initialize machine check queue 2017-10-06 10:53:02 +02:00
sh4 sh4: replace cpu_sh4_init() with cpu_generic_init() 2017-09-01 11:54:24 -03:00
sparc migration: pre_save return int 2017-09-27 11:35:59 +01:00
tilegx tilegx: replace cpu_tilegx_init() with cpu_generic_init() 2017-09-01 11:54:24 -03:00
tricore tricore: replace cpu_tricore_init() with cpu_generic_init() 2017-09-01 11:54:24 -03:00
unicore32 console: purge curses bits from console.h 2017-09-29 10:36:33 +02:00
xtensa target/xtensa: Use the pre-defined MEMTXATTRS_UNSPECIFIED macro 2017-09-26 09:11:22 +03:00