cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

smp.h (5319B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#ifndef _ASM_X86_SMP_H
      3#define _ASM_X86_SMP_H
      4#ifndef __ASSEMBLY__
      5#include <linux/cpumask.h>
      6#include <asm/percpu.h>
      7
      8#include <asm/thread_info.h>
      9#include <asm/cpumask.h>
     10
     11extern int smp_num_siblings;
     12extern unsigned int num_processors;
     13
     14DECLARE_PER_CPU_READ_MOSTLY(cpumask_var_t, cpu_sibling_map);
     15DECLARE_PER_CPU_READ_MOSTLY(cpumask_var_t, cpu_core_map);
     16DECLARE_PER_CPU_READ_MOSTLY(cpumask_var_t, cpu_die_map);
     17/* cpus sharing the last level cache: */
     18DECLARE_PER_CPU_READ_MOSTLY(cpumask_var_t, cpu_llc_shared_map);
     19DECLARE_PER_CPU_READ_MOSTLY(cpumask_var_t, cpu_l2c_shared_map);
     20DECLARE_PER_CPU_READ_MOSTLY(u16, cpu_llc_id);
     21DECLARE_PER_CPU_READ_MOSTLY(u16, cpu_l2c_id);
     22DECLARE_PER_CPU_READ_MOSTLY(int, cpu_number);
     23
     24static inline struct cpumask *cpu_llc_shared_mask(int cpu)
     25{
     26	return per_cpu(cpu_llc_shared_map, cpu);
     27}
     28
     29static inline struct cpumask *cpu_l2c_shared_mask(int cpu)
     30{
     31	return per_cpu(cpu_l2c_shared_map, cpu);
     32}
     33
     34DECLARE_EARLY_PER_CPU_READ_MOSTLY(u16, x86_cpu_to_apicid);
     35DECLARE_EARLY_PER_CPU_READ_MOSTLY(u32, x86_cpu_to_acpiid);
     36DECLARE_EARLY_PER_CPU_READ_MOSTLY(u16, x86_bios_cpu_apicid);
     37#if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_X86_32)
     38DECLARE_EARLY_PER_CPU_READ_MOSTLY(int, x86_cpu_to_logical_apicid);
     39#endif
     40
     41struct task_struct;
     42
     43struct smp_ops {
     44	void (*smp_prepare_boot_cpu)(void);
     45	void (*smp_prepare_cpus)(unsigned max_cpus);
     46	void (*smp_cpus_done)(unsigned max_cpus);
     47
     48	void (*stop_other_cpus)(int wait);
     49	void (*crash_stop_other_cpus)(void);
     50	void (*smp_send_reschedule)(int cpu);
     51
     52	int (*cpu_up)(unsigned cpu, struct task_struct *tidle);
     53	int (*cpu_disable)(void);
     54	void (*cpu_die)(unsigned int cpu);
     55	void (*play_dead)(void);
     56
     57	void (*send_call_func_ipi)(const struct cpumask *mask);
     58	void (*send_call_func_single_ipi)(int cpu);
     59};
     60
     61/* Globals due to paravirt */
     62extern void set_cpu_sibling_map(int cpu);
     63
     64#ifdef CONFIG_SMP
     65extern struct smp_ops smp_ops;
     66
     67static inline void smp_send_stop(void)
     68{
     69	smp_ops.stop_other_cpus(0);
     70}
     71
     72static inline void stop_other_cpus(void)
     73{
     74	smp_ops.stop_other_cpus(1);
     75}
     76
     77static inline void smp_prepare_boot_cpu(void)
     78{
     79	smp_ops.smp_prepare_boot_cpu();
     80}
     81
     82static inline void smp_prepare_cpus(unsigned int max_cpus)
     83{
     84	smp_ops.smp_prepare_cpus(max_cpus);
     85}
     86
     87static inline void smp_cpus_done(unsigned int max_cpus)
     88{
     89	smp_ops.smp_cpus_done(max_cpus);
     90}
     91
     92static inline int __cpu_up(unsigned int cpu, struct task_struct *tidle)
     93{
     94	return smp_ops.cpu_up(cpu, tidle);
     95}
     96
     97static inline int __cpu_disable(void)
     98{
     99	return smp_ops.cpu_disable();
    100}
    101
    102static inline void __cpu_die(unsigned int cpu)
    103{
    104	smp_ops.cpu_die(cpu);
    105}
    106
    107static inline void play_dead(void)
    108{
    109	smp_ops.play_dead();
    110}
    111
    112static inline void smp_send_reschedule(int cpu)
    113{
    114	smp_ops.smp_send_reschedule(cpu);
    115}
    116
    117static inline void arch_send_call_function_single_ipi(int cpu)
    118{
    119	smp_ops.send_call_func_single_ipi(cpu);
    120}
    121
    122static inline void arch_send_call_function_ipi_mask(const struct cpumask *mask)
    123{
    124	smp_ops.send_call_func_ipi(mask);
    125}
    126
    127void cpu_disable_common(void);
    128void native_smp_prepare_boot_cpu(void);
    129void smp_prepare_cpus_common(void);
    130void native_smp_prepare_cpus(unsigned int max_cpus);
    131void calculate_max_logical_packages(void);
    132void native_smp_cpus_done(unsigned int max_cpus);
    133int common_cpu_up(unsigned int cpunum, struct task_struct *tidle);
    134int native_cpu_up(unsigned int cpunum, struct task_struct *tidle);
    135int native_cpu_disable(void);
    136int common_cpu_die(unsigned int cpu);
    137void native_cpu_die(unsigned int cpu);
    138void hlt_play_dead(void);
    139void native_play_dead(void);
    140void play_dead_common(void);
    141void wbinvd_on_cpu(int cpu);
    142int wbinvd_on_all_cpus(void);
    143void cond_wakeup_cpu0(void);
    144
    145void native_smp_send_reschedule(int cpu);
    146void native_send_call_func_ipi(const struct cpumask *mask);
    147void native_send_call_func_single_ipi(int cpu);
    148void x86_idle_thread_init(unsigned int cpu, struct task_struct *idle);
    149
    150void smp_store_boot_cpu_info(void);
    151void smp_store_cpu_info(int id);
    152
    153asmlinkage __visible void smp_reboot_interrupt(void);
    154__visible void smp_reschedule_interrupt(struct pt_regs *regs);
    155__visible void smp_call_function_interrupt(struct pt_regs *regs);
    156__visible void smp_call_function_single_interrupt(struct pt_regs *r);
    157
    158#define cpu_physical_id(cpu)	per_cpu(x86_cpu_to_apicid, cpu)
    159#define cpu_acpi_id(cpu)	per_cpu(x86_cpu_to_acpiid, cpu)
    160
    161/*
    162 * This function is needed by all SMP systems. It must _always_ be valid
    163 * from the initial startup. We map APIC_BASE very early in page_setup(),
    164 * so this is correct in the x86 case.
    165 */
    166#define raw_smp_processor_id()  this_cpu_read(cpu_number)
    167#define __smp_processor_id() __this_cpu_read(cpu_number)
    168
    169#ifdef CONFIG_X86_32
    170extern int safe_smp_processor_id(void);
    171#else
    172# define safe_smp_processor_id()	smp_processor_id()
    173#endif
    174
    175#else /* !CONFIG_SMP */
    176#define wbinvd_on_cpu(cpu)     wbinvd()
    177static inline int wbinvd_on_all_cpus(void)
    178{
    179	wbinvd();
    180	return 0;
    181}
    182#endif /* CONFIG_SMP */
    183
    184extern unsigned disabled_cpus;
    185
    186#ifdef CONFIG_X86_LOCAL_APIC
    187extern int hard_smp_processor_id(void);
    188
    189#else /* CONFIG_X86_LOCAL_APIC */
    190#define hard_smp_processor_id()	0
    191#endif /* CONFIG_X86_LOCAL_APIC */
    192
    193#ifdef CONFIG_DEBUG_NMI_SELFTEST
    194extern void nmi_selftest(void);
    195#else
    196#define nmi_selftest() do { } while (0)
    197#endif
    198
    199#endif /* __ASSEMBLY__ */
    200#endif /* _ASM_X86_SMP_H */