/* SPDX-License-Identifier: GPL-2.0-only */ /* * arch/arm/include/asm/proc-fns.h * * Copyright (C) 1997-1999 Russell King * Copyright (C) 2000 Deep Blue Solutions Ltd
*/ #ifndef __ASM_PROCFNS_H #define __ASM_PROCFNS_H
#ifdef __KERNEL__
#include <asm/glue-proc.h> #include <asm/page.h>
#ifndef __ASSEMBLY__
struct mm_struct;
/* * Don't change this structure - ASM code relies on it.
*/ struct processor { /* MISC * get data abort address/flags
*/ void (*_data_abort)(unsignedlong pc); /* * Retrieve prefetch fault address
*/ unsignedlong (*_prefetch_abort)(unsignedlong lr); /* * Set up any processor specifics
*/ void (*_proc_init)(void); /* * Check for processor bugs
*/ void (*check_bugs)(void); /* * Disable any processor specifics
*/ void (*_proc_fin)(void); /* * Special stuff for a reset
*/ void (*reset)(unsignedlong addr, bool hvc) __attribute__((noreturn)); /* * Idle the processor
*/ int (*_do_idle)(void); /* * Processor architecture specific
*/ /* * clean a virtual address range from the * D-cache without flushing the cache.
*/ void (*dcache_clean_area)(void *addr, int size);
/* * Set the page table
*/ void (*switch_mm)(phys_addr_t pgd_phys, struct mm_struct *mm); /* * Set a possibly extended PTE. Non-extended PTEs should * ignore 'ext'.
*/ #ifdef CONFIG_ARM_LPAE void (*set_pte_ext)(pte_t *ptep, pte_t pte); #else void (*set_pte_ext)(pte_t *ptep, pte_t pte, unsignedint ext); #endif
/* These three are private to arch/arm/kernel/suspend.c */ externvoid cpu_do_suspend(void *); externvoid cpu_do_resume(void *); #else
externstruct processor processor; #ifdefined(CONFIG_BIG_LITTLE) && defined(CONFIG_HARDEN_BRANCH_PREDICTOR) #include <linux/smp.h> /* * This can't be a per-cpu variable because we need to access it before * per-cpu has been initialised. We have a couple of functions that are * called in a pre-emptible context, and so can't use smp_processor_id() * there, hence PROC_TABLE(). We insist in init_proc_vtable() that the * function pointers for these are identical across all CPUs.
*/ externstruct processor *cpu_vtable[]; #define PROC_VTABLE(f) cpu_vtable[smp_processor_id()]->f #define PROC_TABLE(f) cpu_vtable[0]->f staticinlinevoid init_proc_vtable(conststruct processor *p)
{ unsignedint cpu = smp_processor_id();
*cpu_vtable[cpu] = *p;
WARN_ON_ONCE(cpu_vtable[cpu]->dcache_clean_area !=
cpu_vtable[0]->dcache_clean_area);
WARN_ON_ONCE(cpu_vtable[cpu]->set_pte_ext !=
cpu_vtable[0]->set_pte_ext);
} #else #define PROC_VTABLE(f) processor.f #define PROC_TABLE(f) processor.f staticinlinevoid init_proc_vtable(conststruct processor *p)
{
processor = *p;
} #endif
/* These two are private to arch/arm/kernel/suspend.c */ #define cpu_do_suspend PROC_VTABLE(do_suspend) #define cpu_do_resume PROC_VTABLE(do_resume) #endif
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.