1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
  | /* SPDX-License-Identifier: GPL-2.0 */ 
 |  /* 
 |   * Copyright (C) 2014 Renesas Electronics Corporation 
 |   * 
 |   * Initialization of CNTVOFF register from secure mode 
 |   * 
 |   */ 
 |    
 |  #include <linux/linkage.h> 
 |  #include <asm/assembler.h> 
 |    
 |  ENTRY(secure_cntvoff_init) 
 |      .arch    armv7-a 
 |      /* 
 |       * CNTVOFF has to be initialized either from non-secure Hypervisor 
 |       * mode or secure Monitor mode with SCR.NS==1. If TrustZone is enabled 
 |       * then it should be handled by the secure code. The CPU must implement 
 |       * the virtualization extensions. 
 |       */ 
 |      cps    #MON_MODE 
 |      mrc    p15, 0, r1, c1, c1, 0        /* Get Secure Config */ 
 |      orr    r0, r1, #1 
 |      mcr    p15, 0, r0, c1, c1, 0        /* Set Non Secure bit */ 
 |      isb 
 |      mov    r0, #0 
 |      mcrr    p15, 4, r0, r0, c14        /* CNTVOFF = 0 */ 
 |      isb 
 |      mcr    p15, 0, r1, c1, c1, 0        /* Set Secure bit */ 
 |      isb 
 |      cps    #SVC_MODE 
 |      ret    lr 
 |  ENDPROC(secure_cntvoff_init) 
 |  
  |