• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Shadow Call Stack support.
4  *
5  * Copyright (C) 2019 Google LLC
6  */
7 
8 #include <linux/percpu.h>
9 #include <linux/vmalloc.h>
10 #include <asm/pgtable.h>
11 #include <asm/scs.h>
12 
13 DEFINE_PER_CPU(unsigned long *, irq_shadow_call_stack_ptr);
14 
15 #ifndef CONFIG_SHADOW_CALL_STACK_VMAP
16 DEFINE_PER_CPU(unsigned long [SCS_SIZE/sizeof(long)], irq_shadow_call_stack)
17 	__aligned(SCS_SIZE);
18 #endif
19 
scs_init_irq(void)20 void scs_init_irq(void)
21 {
22 	int cpu;
23 
24 	for_each_possible_cpu(cpu) {
25 #ifdef CONFIG_SHADOW_CALL_STACK_VMAP
26 		unsigned long *p;
27 
28 		p = __vmalloc_node_range(PAGE_SIZE, SCS_SIZE,
29 					 VMALLOC_START, VMALLOC_END,
30 					 GFP_SCS, PAGE_KERNEL,
31 					 0, cpu_to_node(cpu),
32 					 __builtin_return_address(0));
33 
34 		per_cpu(irq_shadow_call_stack_ptr, cpu) = p;
35 #else
36 		per_cpu(irq_shadow_call_stack_ptr, cpu) =
37 			per_cpu(irq_shadow_call_stack, cpu);
38 #endif /* CONFIG_SHADOW_CALL_STACK_VMAP */
39 	}
40 }
41