]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
arm64: Handle trapped DC CVAP
authorRobin Murphy <robin.murphy@arm.com>
Tue, 25 Jul 2017 10:55:41 +0000 (11:55 +0100)
committerCatalin Marinas <catalin.marinas@arm.com>
Wed, 9 Aug 2017 10:00:43 +0000 (11:00 +0100)
Cache clean to PoP is subject to the same access controls as to PoC, so
if we are trapping userspace cache maintenance with SCTLR_EL1.UCI, we
need to be prepared to handle it. To avoid getting into complicated
fights with binutils about ARMv8.2 options, we'll just cheat and use the
raw SYS instruction rather than the 'proper' DC alias.

Reviewed-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Robin Murphy <robin.murphy@arm.com>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
arch/arm64/include/asm/esr.h
arch/arm64/kernel/traps.c

index 130b5343ba6df189c8a7aa12cc387a9e738a6a21..66ed8b6b9976cd2f2762b9ee26e64d922da467e2 100644 (file)
 /*
  * User space cache operations have the following sysreg encoding
  * in System instructions.
- * op0=1, op1=3, op2=1, crn=7, crm={ 5, 10, 11, 14 }, WRITE (L=0)
+ * op0=1, op1=3, op2=1, crn=7, crm={ 5, 10, 11, 12, 14 }, WRITE (L=0)
  */
 #define ESR_ELx_SYS64_ISS_CRM_DC_CIVAC 14
+#define ESR_ELx_SYS64_ISS_CRM_DC_CVAP  12
 #define ESR_ELx_SYS64_ISS_CRM_DC_CVAU  11
 #define ESR_ELx_SYS64_ISS_CRM_DC_CVAC  10
 #define ESR_ELx_SYS64_ISS_CRM_IC_IVAU  5
index 0f047e916cee87bdde6d1fcaae9addb918fed7fa..ccb9727d67b2cfa86841cd801654e38515a096b2 100644 (file)
@@ -484,6 +484,9 @@ static void user_cache_maint_handler(unsigned int esr, struct pt_regs *regs)
        case ESR_ELx_SYS64_ISS_CRM_DC_CVAC:     /* DC CVAC, gets promoted */
                __user_cache_maint("dc civac", address, ret);
                break;
+       case ESR_ELx_SYS64_ISS_CRM_DC_CVAP:     /* DC CVAP */
+               __user_cache_maint("sys 3, c7, c12, 1", address, ret);
+               break;
        case ESR_ELx_SYS64_ISS_CRM_DC_CIVAC:    /* DC CIVAC */
                __user_cache_maint("dc civac", address, ret);
                break;