xref: /kvm-unit-tests/lib/arm/asm/smp.h (revision 68ea0e0be63d341362dca92d3bacac85b465fb3c)
1 #ifndef _ASMARM_SMP_H_
2 #define _ASMARM_SMP_H_
3 /*
4  * Copyright (C) 2015, Red Hat Inc, Andrew Jones <drjones@redhat.com>
5  *
6  * This work is licensed under the terms of the GNU LGPL, version 2.
7  */
8 #include <asm/thread_info.h>
9 #include <asm/cpumask.h>
10 
11 #define smp_processor_id()		(current_thread_info()->cpu)
12 
13 extern void halt(void);
14 
15 extern cpumask_t cpu_present_mask;
16 extern cpumask_t cpu_online_mask;
17 #define cpu_present(cpu)		cpumask_test_cpu(cpu, &cpu_present_mask)
18 #define cpu_online(cpu)			cpumask_test_cpu(cpu, &cpu_online_mask)
19 #define for_each_present_cpu(cpu)	for_each_cpu(cpu, &cpu_present_mask)
20 #define for_each_online_cpu(cpu)	for_each_cpu(cpu, &cpu_online_mask)
21 
22 static inline void set_cpu_present(int cpu, bool present)
23 {
24 	if (present)
25 		cpumask_set_cpu(cpu, &cpu_present_mask);
26 	else
27 		cpumask_clear_cpu(cpu, &cpu_present_mask);
28 }
29 
30 static inline void set_cpu_online(int cpu, bool online)
31 {
32 	if (online)
33 		cpumask_set_cpu(cpu, &cpu_online_mask);
34 	else
35 		cpumask_clear_cpu(cpu, &cpu_online_mask);
36 }
37 
38 typedef void (*secondary_entry_fn)(void);
39 
40 /* secondary_data is reused for each cpu, so only boot one at a time */
41 struct secondary_data {
42 	void *stack;		/* must be first member of struct */
43 	secondary_entry_fn entry;
44 };
45 extern struct secondary_data secondary_data;
46 
47 extern void smp_boot_secondary(int cpu, secondary_entry_fn entry);
48 
49 #endif /* _ASMARM_SMP_H_ */
50