-/* Copyright (C) 1999-2016 Free Software Foundation, Inc.
+/* Copyright (C) 1999-2018 Free Software Foundation, Inc.
This file is part of GDB.
#include "regcache.h"
#include "arm-tdep.h"
#include "arm-linux-tdep.h"
+#include "arch/arm-linux.h"
#include "aarch32-linux-nat.h"
regcache_raw_supply (regcache, regno, ®s[regno]);
if (arm_apcs_32)
- regcache_raw_supply (regcache, ARM_PS_REGNUM, ®s[ARM_CPSR_GREGNUM]);
+ {
+ /* Clear reserved bits bit 20 to bit 23. */
+ regs[ARM_CPSR_GREGNUM] &= 0xff0fffff;
+ regcache_raw_supply (regcache, ARM_PS_REGNUM, ®s[ARM_CPSR_GREGNUM]);
+ }
else
regcache_raw_supply (regcache, ARM_PS_REGNUM, ®s[ARM_PC_REGNUM]);
regs[ARM_PC_REGNUM] = gdbarch_addr_bits_remove
- (get_regcache_arch (regcache), regs[ARM_PC_REGNUM]);
+ (regcache->arch (), regs[ARM_PC_REGNUM]);
regcache_raw_supply (regcache, ARM_PC_REGNUM, ®s[ARM_PC_REGNUM]);
}
if (arm_apcs_32
&& REG_VALID == regcache_register_status (regcache, ARM_PS_REGNUM))
- regcache_raw_collect (regcache, ARM_PS_REGNUM,
- ®s[ARM_CPSR_GREGNUM]);
+ {
+ uint32_t cpsr = regs[ARM_CPSR_GREGNUM];
+
+ regcache_raw_collect (regcache, ARM_PS_REGNUM,
+ ®s[ARM_CPSR_GREGNUM]);
+ /* Keep reserved bits bit 20 to bit 23. */
+ regs[ARM_CPSR_GREGNUM] = ((regs[ARM_CPSR_GREGNUM] & 0xff0fffff)
+ | (cpsr & 0x00f00000));
+ }
}
/* Supply VFP registers contents, stored in REGS, to REGCACHE.