]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blob - arch/powerpc/kernel/optprobes_head.S
powerpc/mm/radix: Improve TLB/PWC flushes
[mirror_ubuntu-zesty-kernel.git] / arch / powerpc / kernel / optprobes_head.S
1 /*
2 * Code to prepare detour buffer for optprobes in Kernel.
3 *
4 * Copyright 2017, Anju T, IBM Corp.
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version
9 * 2 of the License, or (at your option) any later version.
10 */
11
12 #include <asm/ppc_asm.h>
13 #include <asm/ptrace.h>
14 #include <asm/asm-offsets.h>
15
16 #define OPT_SLOT_SIZE 65536
17
18 .balign 4
19
20 /*
21 * Reserve an area to allocate slots for detour buffer.
22 * This is part of .text section (rather than vmalloc area)
23 * as this needs to be within 32MB of the probed address.
24 */
25 .global optinsn_slot
26 optinsn_slot:
27 .space OPT_SLOT_SIZE
28
29 /*
30 * Optprobe template:
31 * This template gets copied into one of the slots in optinsn_slot
32 * and gets fixed up with real optprobe structures et al.
33 */
34 .global optprobe_template_entry
35 optprobe_template_entry:
36 /* Create an in-memory pt_regs */
37 stdu r1,-INT_FRAME_SIZE(r1)
38 SAVE_GPR(0,r1)
39 /* Save the previous SP into stack */
40 addi r0,r1,INT_FRAME_SIZE
41 std r0,GPR1(r1)
42 SAVE_10GPRS(2,r1)
43 SAVE_10GPRS(12,r1)
44 SAVE_10GPRS(22,r1)
45 /* Save SPRS */
46 mfmsr r5
47 std r5,_MSR(r1)
48 li r5,0x700
49 std r5,_TRAP(r1)
50 li r5,0
51 std r5,ORIG_GPR3(r1)
52 std r5,RESULT(r1)
53 mfctr r5
54 std r5,_CTR(r1)
55 mflr r5
56 std r5,_LINK(r1)
57 mfspr r5,SPRN_XER
58 std r5,_XER(r1)
59 mfcr r5
60 std r5,_CCR(r1)
61 lbz r5,PACASOFTIRQEN(r13)
62 std r5,SOFTE(r1)
63 mfdar r5
64 std r5,_DAR(r1)
65 mfdsisr r5
66 std r5,_DSISR(r1)
67
68 /*
69 * We may get here from a module, so load the kernel TOC in r2.
70 * The original TOC gets restored when pt_regs is restored
71 * further below.
72 */
73 ld r2,PACATOC(r13)
74
75 .global optprobe_template_op_address
76 optprobe_template_op_address:
77 /*
78 * Parameters to optimized_callback():
79 * 1. optimized_kprobe structure in r3
80 */
81 nop
82 nop
83 nop
84 nop
85 nop
86 /* 2. pt_regs pointer in r4 */
87 addi r4,r1,STACK_FRAME_OVERHEAD
88
89 .global optprobe_template_call_handler
90 optprobe_template_call_handler:
91 /* Branch to optimized_callback() */
92 nop
93
94 /*
95 * Parameters for instruction emulation:
96 * 1. Pass SP in register r3.
97 */
98 addi r3,r1,STACK_FRAME_OVERHEAD
99
100 .global optprobe_template_insn
101 optprobe_template_insn:
102 /* 2, Pass instruction to be emulated in r4 */
103 nop
104 nop
105
106 .global optprobe_template_call_emulate
107 optprobe_template_call_emulate:
108 /* Branch to emulate_step() */
109 nop
110
111 /*
112 * All done.
113 * Now, restore the registers...
114 */
115 ld r5,_MSR(r1)
116 mtmsr r5
117 ld r5,_CTR(r1)
118 mtctr r5
119 ld r5,_LINK(r1)
120 mtlr r5
121 ld r5,_XER(r1)
122 mtxer r5
123 ld r5,_CCR(r1)
124 mtcr r5
125 ld r5,_DAR(r1)
126 mtdar r5
127 ld r5,_DSISR(r1)
128 mtdsisr r5
129 REST_GPR(0,r1)
130 REST_10GPRS(2,r1)
131 REST_10GPRS(12,r1)
132 REST_10GPRS(22,r1)
133 /* Restore the previous SP */
134 addi r1,r1,INT_FRAME_SIZE
135
136 .global optprobe_template_ret
137 optprobe_template_ret:
138 /* ... and jump back from trampoline */
139 nop
140
141 .global optprobe_template_end
142 optprobe_template_end: