ARM: 7649/1: mm: mm->context.id fix for big-endian
Since the new ASID code in b5466f8728
("ARM: mm: remove IPI broadcasting on ASID rollover") was changed to
use 64bit operations it has broken the BE operation due to an issue
with the MM code accessing sub-fields of mm->context.id.
When running in BE mode we see the values in mm->context.id are stored
with the highest value first, so the LDR in the arch/arm/mm/proc-macros.S
reads the wrong part of this field. To resolve this, change the LDR in
the mmid macro to load from +4.
Acked-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Ben Dooks <ben.dooks@codethink.co.uk>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
parent
352af7d4dd
commit
9520a5bece
|
@ -34,6 +34,9 @@
|
|||
* The ASID is used to tag entries in the CPU caches and TLBs.
|
||||
* The context ID is used by debuggers and trace logic, and
|
||||
* should be unique within all running processes.
|
||||
*
|
||||
* In big endian operation, the two 32 bit words are swapped if accesed by
|
||||
* non 64-bit operations.
|
||||
*/
|
||||
#define ASID_FIRST_VERSION (1ULL << ASID_BITS)
|
||||
#define NUM_USER_ASIDS (ASID_FIRST_VERSION - 1)
|
||||
|
|
|
@ -38,9 +38,14 @@
|
|||
|
||||
/*
|
||||
* mmid - get context id from mm pointer (mm->context.id)
|
||||
* note, this field is 64bit, so in big-endian the two words are swapped too.
|
||||
*/
|
||||
.macro mmid, rd, rn
|
||||
#ifdef __ARMEB__
|
||||
ldr \rd, [\rn, #MM_CONTEXT_ID + 4 ]
|
||||
#else
|
||||
ldr \rd, [\rn, #MM_CONTEXT_ID]
|
||||
#endif
|
||||
.endm
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in New Issue