mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-05 16:53:55 -06:00
target-arm: Implement SP_EL0, SP_EL1
Implement handling for the AArch64 SP_EL0 system register. This holds the EL0 stack pointer, and is only accessible when it's not being used as the stack pointer, ie when we're in EL1 and EL1 is using its own stack pointer. We also provide a definition of the SP_EL1 register; this isn't guest visible as a system register for an implementation like QEMU which doesn't provide EL2 or EL3; however it is useful for ensuring the underlying state is migrated. We need to update the state fields in the CPU state whenever we switch stack pointers; this happens when we take an exception and also when SPSEL is used to change the bit in PSTATE which indicates which stack pointer EL1 should use. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
This commit is contained in:
parent
a0618a1990
commit
f502cfc207
6 changed files with 100 additions and 7 deletions
|
@ -163,6 +163,7 @@ typedef struct CPUARMState {
|
|||
uint64_t daif; /* exception masks, in the bits they are in in PSTATE */
|
||||
|
||||
uint64_t elr_el1; /* AArch64 ELR_EL1 */
|
||||
uint64_t sp_el[2]; /* AArch64 banked stack pointers */
|
||||
|
||||
/* System control coprocessor (cp15) */
|
||||
struct {
|
||||
|
@ -434,6 +435,7 @@ int arm_cpu_handle_mmu_fault(CPUState *cpu, vaddr address, int rw,
|
|||
* Only these are valid when in AArch64 mode; in
|
||||
* AArch32 mode SPSRs are basically CPSR-format.
|
||||
*/
|
||||
#define PSTATE_SP (1U)
|
||||
#define PSTATE_M (0xFU)
|
||||
#define PSTATE_nRW (1U << 4)
|
||||
#define PSTATE_F (1U << 6)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue