LCOV - code coverage report
Current view: top level - arch/arm/include/asm - proc-fns.h (source / functions) Hit Total Coverage
Test: Real Lines: 1 1 100.0 %
Date: 2020-10-17 15:46:16 Functions: 0 0 -
Legend: Neither, QEMU, Real, Both Branches: 0 0 -

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: GPL-2.0-only */
       2                 :            : /*
       3                 :            :  *  arch/arm/include/asm/proc-fns.h
       4                 :            :  *
       5                 :            :  *  Copyright (C) 1997-1999 Russell King
       6                 :            :  *  Copyright (C) 2000 Deep Blue Solutions Ltd
       7                 :            :  */
       8                 :            : #ifndef __ASM_PROCFNS_H
       9                 :            : #define __ASM_PROCFNS_H
      10                 :            : 
      11                 :            : #ifdef __KERNEL__
      12                 :            : 
      13                 :            : #include <asm/glue-proc.h>
      14                 :            : #include <asm/page.h>
      15                 :            : 
      16                 :            : #ifndef __ASSEMBLY__
      17                 :            : 
      18                 :            : struct mm_struct;
      19                 :            : 
      20                 :            : /*
      21                 :            :  * Don't change this structure - ASM code relies on it.
      22                 :            :  */
      23                 :            : struct processor {
      24                 :            :         /* MISC
      25                 :            :          * get data abort address/flags
      26                 :            :          */
      27                 :            :         void (*_data_abort)(unsigned long pc);
      28                 :            :         /*
      29                 :            :          * Retrieve prefetch fault address
      30                 :            :          */
      31                 :            :         unsigned long (*_prefetch_abort)(unsigned long lr);
      32                 :            :         /*
      33                 :            :          * Set up any processor specifics
      34                 :            :          */
      35                 :            :         void (*_proc_init)(void);
      36                 :            :         /*
      37                 :            :          * Check for processor bugs
      38                 :            :          */
      39                 :            :         void (*check_bugs)(void);
      40                 :            :         /*
      41                 :            :          * Disable any processor specifics
      42                 :            :          */
      43                 :            :         void (*_proc_fin)(void);
      44                 :            :         /*
      45                 :            :          * Special stuff for a reset
      46                 :            :          */
      47                 :            :         void (*reset)(unsigned long addr, bool hvc) __attribute__((noreturn));
      48                 :            :         /*
      49                 :            :          * Idle the processor
      50                 :            :          */
      51                 :            :         int (*_do_idle)(void);
      52                 :            :         /*
      53                 :            :          * Processor architecture specific
      54                 :            :          */
      55                 :            :         /*
      56                 :            :          * clean a virtual address range from the
      57                 :            :          * D-cache without flushing the cache.
      58                 :            :          */
      59                 :            :         void (*dcache_clean_area)(void *addr, int size);
      60                 :            : 
      61                 :            :         /*
      62                 :            :          * Set the page table
      63                 :            :          */
      64                 :            :         void (*switch_mm)(phys_addr_t pgd_phys, struct mm_struct *mm);
      65                 :            :         /*
      66                 :            :          * Set a possibly extended PTE.  Non-extended PTEs should
      67                 :            :          * ignore 'ext'.
      68                 :            :          */
      69                 :            : #ifdef CONFIG_ARM_LPAE
      70                 :            :         void (*set_pte_ext)(pte_t *ptep, pte_t pte);
      71                 :            : #else
      72                 :            :         void (*set_pte_ext)(pte_t *ptep, pte_t pte, unsigned int ext);
      73                 :            : #endif
      74                 :            : 
      75                 :            :         /* Suspend/resume */
      76                 :            :         unsigned int suspend_size;
      77                 :            :         void (*do_suspend)(void *);
      78                 :            :         void (*do_resume)(void *);
      79                 :            : };
      80                 :            : 
      81                 :            : #ifndef MULTI_CPU
      82                 :            : static inline void init_proc_vtable(const struct processor *p)
      83                 :            : {
      84                 :            : }
      85                 :            : 
      86                 :            : extern void cpu_proc_init(void);
      87                 :            : extern void cpu_proc_fin(void);
      88                 :            : extern int cpu_do_idle(void);
      89                 :            : extern void cpu_dcache_clean_area(void *, int);
      90                 :            : extern void cpu_do_switch_mm(phys_addr_t pgd_phys, struct mm_struct *mm);
      91                 :            : #ifdef CONFIG_ARM_LPAE
      92                 :            : extern void cpu_set_pte_ext(pte_t *ptep, pte_t pte);
      93                 :            : #else
      94                 :            : extern void cpu_set_pte_ext(pte_t *ptep, pte_t pte, unsigned int ext);
      95                 :            : #endif
      96                 :            : extern void cpu_reset(unsigned long addr, bool hvc) __attribute__((noreturn));
      97                 :            : 
      98                 :            : /* These three are private to arch/arm/kernel/suspend.c */
      99                 :            : extern void cpu_do_suspend(void *);
     100                 :            : extern void cpu_do_resume(void *);
     101                 :            : #else
     102                 :            : 
     103                 :            : extern struct processor processor;
     104                 :            : #if defined(CONFIG_BIG_LITTLE) && defined(CONFIG_HARDEN_BRANCH_PREDICTOR)
     105                 :            : #include <linux/smp.h>
     106                 :            : /*
     107                 :            :  * This can't be a per-cpu variable because we need to access it before
     108                 :            :  * per-cpu has been initialised.  We have a couple of functions that are
     109                 :            :  * called in a pre-emptible context, and so can't use smp_processor_id()
     110                 :            :  * there, hence PROC_TABLE().  We insist in init_proc_vtable() that the
     111                 :            :  * function pointers for these are identical across all CPUs.
     112                 :            :  */
     113                 :            : extern struct processor *cpu_vtable[];
     114                 :            : #define PROC_VTABLE(f)                  cpu_vtable[smp_processor_id()]->f
     115                 :            : #define PROC_TABLE(f)                   cpu_vtable[0]->f
     116                 :            : static inline void init_proc_vtable(const struct processor *p)
     117                 :            : {
     118                 :            :         unsigned int cpu = smp_processor_id();
     119                 :            :         *cpu_vtable[cpu] = *p;
     120                 :            :         WARN_ON_ONCE(cpu_vtable[cpu]->dcache_clean_area !=
     121                 :            :                      cpu_vtable[0]->dcache_clean_area);
     122                 :            :         WARN_ON_ONCE(cpu_vtable[cpu]->set_pte_ext !=
     123                 :            :                      cpu_vtable[0]->set_pte_ext);
     124                 :            : }
     125                 :            : #else
     126                 :            : #define PROC_VTABLE(f)                  processor.f
     127                 :            : #define PROC_TABLE(f)                   processor.f
     128                 :            : static inline void init_proc_vtable(const struct processor *p)
     129                 :            : {
     130                 :          3 :         processor = *p;
     131                 :            : }
     132                 :            : #endif
     133                 :            : 
     134                 :            : #define cpu_proc_init                   PROC_VTABLE(_proc_init)
     135                 :            : #define cpu_check_bugs                  PROC_VTABLE(check_bugs)
     136                 :            : #define cpu_proc_fin                    PROC_VTABLE(_proc_fin)
     137                 :            : #define cpu_reset                       PROC_VTABLE(reset)
     138                 :            : #define cpu_do_idle                     PROC_VTABLE(_do_idle)
     139                 :            : #define cpu_dcache_clean_area           PROC_TABLE(dcache_clean_area)
     140                 :            : #define cpu_set_pte_ext                 PROC_TABLE(set_pte_ext)
     141                 :            : #define cpu_do_switch_mm                PROC_VTABLE(switch_mm)
     142                 :            : 
     143                 :            : /* These two are private to arch/arm/kernel/suspend.c */
     144                 :            : #define cpu_do_suspend                  PROC_VTABLE(do_suspend)
     145                 :            : #define cpu_do_resume                   PROC_VTABLE(do_resume)
     146                 :            : #endif
     147                 :            : 
     148                 :            : extern void cpu_resume(void);
     149                 :            : 
     150                 :            : #include <asm/memory.h>
     151                 :            : 
     152                 :            : #ifdef CONFIG_MMU
     153                 :            : 
     154                 :            : #define cpu_switch_mm(pgd,mm) cpu_do_switch_mm(virt_to_phys(pgd),mm)
     155                 :            : 
     156                 :            : #ifdef CONFIG_ARM_LPAE
     157                 :            : 
     158                 :            : #define cpu_get_ttbr(nr)                                        \
     159                 :            :         ({                                                      \
     160                 :            :                 u64 ttbr;                                       \
     161                 :            :                 __asm__("mrrc      p15, " #nr ", %Q0, %R0, c2"      \
     162                 :            :                         : "=r" (ttbr));                               \
     163                 :            :                 ttbr;                                           \
     164                 :            :         })
     165                 :            : 
     166                 :            : #define cpu_get_pgd()   \
     167                 :            :         ({                                              \
     168                 :            :                 u64 pg = cpu_get_ttbr(0);               \
     169                 :            :                 pg &= ~(PTRS_PER_PGD*sizeof(pgd_t)-1);      \
     170                 :            :                 (pgd_t *)phys_to_virt(pg);              \
     171                 :            :         })
     172                 :            : #else
     173                 :            : #define cpu_get_pgd()   \
     174                 :            :         ({                                              \
     175                 :            :                 unsigned long pg;                       \
     176                 :            :                 __asm__("mrc       p15, 0, %0, c2, c0, 0"     \
     177                 :            :                          : "=r" (pg) : : "cc");             \
     178                 :            :                 pg &= ~0x3fff;                              \
     179                 :            :                 (pgd_t *)phys_to_virt(pg);              \
     180                 :            :         })
     181                 :            : #endif
     182                 :            : 
     183                 :            : #else   /*!CONFIG_MMU */
     184                 :            : 
     185                 :            : #define cpu_switch_mm(pgd,mm)   { }
     186                 :            : 
     187                 :            : #endif
     188                 :            : 
     189                 :            : #endif /* __ASSEMBLY__ */
     190                 :            : #endif /* __KERNEL__ */
     191                 :            : #endif /* __ASM_PROCFNS_H */
    

Generated by: LCOV version 1.14