1f08c3bdfSopenharmony_ci/*
2f08c3bdfSopenharmony_ci * Kprobe module for testing crash dumps
3f08c3bdfSopenharmony_ci *
4f08c3bdfSopenharmony_ci * This program is free software; you can redistribute it and/or modify
5f08c3bdfSopenharmony_ci * it under the terms of the GNU General Public License as published by
6f08c3bdfSopenharmony_ci * the Free Software Foundation; either version 2 of the License, or
7f08c3bdfSopenharmony_ci * (at your option) any later version.
8f08c3bdfSopenharmony_ci *
9f08c3bdfSopenharmony_ci * This program is distributed in the hope that it will be useful,
10f08c3bdfSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
11f08c3bdfSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12f08c3bdfSopenharmony_ci * GNU General Public License for more details.
13f08c3bdfSopenharmony_ci *
14f08c3bdfSopenharmony_ci * You should have received a copy of the GNU General Public License
15f08c3bdfSopenharmony_ci * along with this program; if not, write to the Free Software
16f08c3bdfSopenharmony_ci * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17f08c3bdfSopenharmony_ci *
18f08c3bdfSopenharmony_ci * Copyright (C) IBM Corporation, 2006
19f08c3bdfSopenharmony_ci *
20f08c3bdfSopenharmony_ci * Author: Ankita Garg <ankita@in.ibm.com>
21f08c3bdfSopenharmony_ci *         Sachin Sant <sachinp@in.ibm.com>
22f08c3bdfSopenharmony_ci *         Cai Qian <qcai@redhat.com>
23f08c3bdfSopenharmony_ci *
24f08c3bdfSopenharmony_ci * This module induces system failures at predefined crashpoints to
25f08c3bdfSopenharmony_ci * evaluate the reliability of crash dumps obtained using different dumping
26f08c3bdfSopenharmony_ci * solutions.
27f08c3bdfSopenharmony_ci *
28f08c3bdfSopenharmony_ci * It is adapted from the Linux Kernel Dump Test Tool by
29f08c3bdfSopenharmony_ci * Fernando Luis Vazquez Cao <http://lkdtt.sourceforge.net>
30f08c3bdfSopenharmony_ci *
31f08c3bdfSopenharmony_ci * Usage :  insmod lkdtm.ko [recur_count={>0}] cpoint_name=<> cpoint_type=<>
32f08c3bdfSopenharmony_ci *							[cpoint_count={>0}]
33f08c3bdfSopenharmony_ci *
34f08c3bdfSopenharmony_ci * recur_count : Recursion level for the stack overflow test. Default is 10.
35f08c3bdfSopenharmony_ci *
36f08c3bdfSopenharmony_ci * cpoint_name : Crash point where the kernel is to be crashed. It can be
37f08c3bdfSopenharmony_ci *		 one of INT_HARDWARE_ENTRY, INT_HW_IRQ_EN, INT_TASKLET_ENTRY,
38f08c3bdfSopenharmony_ci *		 FS_DEVRW, MEM_SWAPOUT, TIMERADD, SCSI_DISPATCH_CMD,
39f08c3bdfSopenharmony_ci *		 IDE_CORE_CP
40f08c3bdfSopenharmony_ci *
41f08c3bdfSopenharmony_ci * cpoint_type : Indicates the action to be taken on hitting the crash point.
42f08c3bdfSopenharmony_ci *		 It can be one of PANIC, BUG, EXCEPTION, LOOP, OVERFLOW
43f08c3bdfSopenharmony_ci *
44f08c3bdfSopenharmony_ci * cpoint_count : Indicates the number of times the crash point is to be hit
45f08c3bdfSopenharmony_ci *		  to trigger an action. The default is 10.
46f08c3bdfSopenharmony_ci */
47f08c3bdfSopenharmony_ci
48f08c3bdfSopenharmony_ci#include <linux/kernel.h>
49f08c3bdfSopenharmony_ci#include <linux/fs.h>
50f08c3bdfSopenharmony_ci#include <linux/module.h>
51f08c3bdfSopenharmony_ci#include <linux/buffer_head.h>
52f08c3bdfSopenharmony_ci#include <linux/kprobes.h>
53f08c3bdfSopenharmony_ci#include <linux/list.h>
54f08c3bdfSopenharmony_ci#include <linux/init.h>
55f08c3bdfSopenharmony_ci#include <linux/interrupt.h>
56f08c3bdfSopenharmony_ci#include <linux/hrtimer.h>
57f08c3bdfSopenharmony_ci#include <scsi/scsi_cmnd.h>
58f08c3bdfSopenharmony_ci#include <linux/version.h>
59f08c3bdfSopenharmony_ci#include <linux/kallsyms.h>
60f08c3bdfSopenharmony_ci
61f08c3bdfSopenharmony_ci#ifdef CONFIG_IDE
62f08c3bdfSopenharmony_ci#include <linux/ide.h>
63f08c3bdfSopenharmony_ci#endif
64f08c3bdfSopenharmony_ci
65f08c3bdfSopenharmony_ci#define NUM_CPOINTS 8
66f08c3bdfSopenharmony_ci#define NUM_CPOINT_TYPES 5
67f08c3bdfSopenharmony_ci#define DEFAULT_COUNT 10
68f08c3bdfSopenharmony_ci#define REC_NUM_DEFAULT 10
69f08c3bdfSopenharmony_ci
70f08c3bdfSopenharmony_cienum cname {
71f08c3bdfSopenharmony_ci	INVALID,
72f08c3bdfSopenharmony_ci	INT_HARDWARE_ENTRY,
73f08c3bdfSopenharmony_ci	INT_HW_IRQ_EN,
74f08c3bdfSopenharmony_ci	INT_TASKLET_ENTRY,
75f08c3bdfSopenharmony_ci	FS_DEVRW,
76f08c3bdfSopenharmony_ci	MEM_SWAPOUT,
77f08c3bdfSopenharmony_ci	TIMERADD,
78f08c3bdfSopenharmony_ci	SCSI_DISPATCH_CMD,
79f08c3bdfSopenharmony_ci	IDE_CORE_CP
80f08c3bdfSopenharmony_ci};
81f08c3bdfSopenharmony_ci
82f08c3bdfSopenharmony_cienum ctype {
83f08c3bdfSopenharmony_ci	NONE,
84f08c3bdfSopenharmony_ci	PANIC,
85f08c3bdfSopenharmony_ci	BUG,
86f08c3bdfSopenharmony_ci	EXCEPTION,
87f08c3bdfSopenharmony_ci	LOOP,
88f08c3bdfSopenharmony_ci	OVERFLOW
89f08c3bdfSopenharmony_ci};
90f08c3bdfSopenharmony_ci
91f08c3bdfSopenharmony_cistatic char *cp_name[] = {
92f08c3bdfSopenharmony_ci	"INT_HARDWARE_ENTRY",
93f08c3bdfSopenharmony_ci	"INT_HW_IRQ_EN",
94f08c3bdfSopenharmony_ci	"INT_TASKLET_ENTRY",
95f08c3bdfSopenharmony_ci	"FS_DEVRW",
96f08c3bdfSopenharmony_ci	"MEM_SWAPOUT",
97f08c3bdfSopenharmony_ci	"TIMERADD",
98f08c3bdfSopenharmony_ci	"SCSI_DISPATCH_CMD",
99f08c3bdfSopenharmony_ci	"IDE_CORE_CP"
100f08c3bdfSopenharmony_ci};
101f08c3bdfSopenharmony_ci
102f08c3bdfSopenharmony_cistatic char *cp_type[] = {
103f08c3bdfSopenharmony_ci	"PANIC",
104f08c3bdfSopenharmony_ci	"BUG",
105f08c3bdfSopenharmony_ci	"EXCEPTION",
106f08c3bdfSopenharmony_ci	"LOOP",
107f08c3bdfSopenharmony_ci	"OVERFLOW"
108f08c3bdfSopenharmony_ci};
109f08c3bdfSopenharmony_ci
110f08c3bdfSopenharmony_cistatic struct jprobe lkdtm;
111f08c3bdfSopenharmony_ci
112f08c3bdfSopenharmony_cistatic int lkdtm_parse_commandline(void);
113f08c3bdfSopenharmony_cistatic void lkdtm_handler(void);
114f08c3bdfSopenharmony_ci
115f08c3bdfSopenharmony_cistatic char *cpoint_name = INVALID;
116f08c3bdfSopenharmony_cistatic char *cpoint_type = NONE;
117f08c3bdfSopenharmony_cistatic int cpoint_count = DEFAULT_COUNT;
118f08c3bdfSopenharmony_cistatic int recur_count = REC_NUM_DEFAULT;
119f08c3bdfSopenharmony_ci
120f08c3bdfSopenharmony_cistatic enum cname cpoint = INVALID;
121f08c3bdfSopenharmony_cistatic enum ctype cptype = NONE;
122f08c3bdfSopenharmony_cistatic int count = DEFAULT_COUNT;
123f08c3bdfSopenharmony_ci
124f08c3bdfSopenharmony_cimodule_param(recur_count, int, 0644);
125f08c3bdfSopenharmony_ciMODULE_PARM_DESC(recur_count, " Recursion level for the stack overflow test, "
126f08c3bdfSopenharmony_ci		 "default is 10");
127f08c3bdfSopenharmony_cimodule_param(cpoint_name, charp, 0644);
128f08c3bdfSopenharmony_ciMODULE_PARM_DESC(cpoint_name, " Crash Point, where kernel is to be crashed");
129f08c3bdfSopenharmony_cimodule_param(cpoint_type, charp, 0644);
130f08c3bdfSopenharmony_ciMODULE_PARM_DESC(cpoint_type, " Crash Point Type, action to be taken on "
131f08c3bdfSopenharmony_ci		 "hitting the crash point");
132f08c3bdfSopenharmony_cimodule_param(cpoint_count, int, 0644);
133f08c3bdfSopenharmony_ciMODULE_PARM_DESC(cpoint_count, " Crash Point Count, number of times the "
134f08c3bdfSopenharmony_ci		 "crash point is to be hit to trigger action");
135f08c3bdfSopenharmony_ci
136f08c3bdfSopenharmony_ciunsigned int jp_do_irq(unsigned int irq)
137f08c3bdfSopenharmony_ci{
138f08c3bdfSopenharmony_ci	lkdtm_handler();
139f08c3bdfSopenharmony_ci	jprobe_return();
140f08c3bdfSopenharmony_ci	return 0;
141f08c3bdfSopenharmony_ci}
142f08c3bdfSopenharmony_ci
143f08c3bdfSopenharmony_ciirqreturn_t jp_handle_irq_event(unsigned int irq, struct irqaction * action)
144f08c3bdfSopenharmony_ci{
145f08c3bdfSopenharmony_ci	lkdtm_handler();
146f08c3bdfSopenharmony_ci	jprobe_return();
147f08c3bdfSopenharmony_ci	return 0;
148f08c3bdfSopenharmony_ci}
149f08c3bdfSopenharmony_ci
150f08c3bdfSopenharmony_civoid jp_tasklet_action(struct softirq_action *a)
151f08c3bdfSopenharmony_ci{
152f08c3bdfSopenharmony_ci	lkdtm_handler();
153f08c3bdfSopenharmony_ci	jprobe_return();
154f08c3bdfSopenharmony_ci}
155f08c3bdfSopenharmony_ci
156f08c3bdfSopenharmony_civoid jp_ll_rw_block(int rw, int nr, struct buffer_head *bhs[])
157f08c3bdfSopenharmony_ci{
158f08c3bdfSopenharmony_ci	lkdtm_handler();
159f08c3bdfSopenharmony_ci	jprobe_return();
160f08c3bdfSopenharmony_ci}
161f08c3bdfSopenharmony_ci
162f08c3bdfSopenharmony_cistruct scan_control;
163f08c3bdfSopenharmony_ci
164f08c3bdfSopenharmony_ciunsigned long jp_shrink_page_list(struct list_head *page_list,
165f08c3bdfSopenharmony_ci				  struct scan_control *sc)
166f08c3bdfSopenharmony_ci{
167f08c3bdfSopenharmony_ci	lkdtm_handler();
168f08c3bdfSopenharmony_ci	jprobe_return();
169f08c3bdfSopenharmony_ci	return 0;
170f08c3bdfSopenharmony_ci}
171f08c3bdfSopenharmony_ci
172f08c3bdfSopenharmony_ciint jp_hrtimer_start(struct hrtimer *timer, ktime_t tim,
173f08c3bdfSopenharmony_ci		     const enum hrtimer_mode mode)
174f08c3bdfSopenharmony_ci{
175f08c3bdfSopenharmony_ci	lkdtm_handler();
176f08c3bdfSopenharmony_ci	jprobe_return();
177f08c3bdfSopenharmony_ci	return 0;
178f08c3bdfSopenharmony_ci}
179f08c3bdfSopenharmony_ci
180f08c3bdfSopenharmony_ciint jp_scsi_dispatch_cmd(struct scsi_cmnd *cmd)
181f08c3bdfSopenharmony_ci{
182f08c3bdfSopenharmony_ci	lkdtm_handler();
183f08c3bdfSopenharmony_ci	jprobe_return();
184f08c3bdfSopenharmony_ci	return 0;
185f08c3bdfSopenharmony_ci}
186f08c3bdfSopenharmony_ci
187f08c3bdfSopenharmony_ci#ifdef CONFIG_IDE
188f08c3bdfSopenharmony_ciint jp_generic_ide_ioctl(ide_drive_t * drive, struct file *file,
189f08c3bdfSopenharmony_ci			 struct block_device *bdev, unsigned int cmd,
190f08c3bdfSopenharmony_ci			 unsigned long arg)
191f08c3bdfSopenharmony_ci{
192f08c3bdfSopenharmony_ci	lkdtm_handler();
193f08c3bdfSopenharmony_ci	jprobe_return();
194f08c3bdfSopenharmony_ci	return 0;
195f08c3bdfSopenharmony_ci}
196f08c3bdfSopenharmony_ci#endif
197f08c3bdfSopenharmony_ci
198f08c3bdfSopenharmony_cistatic int lkdtm_parse_commandline(void)
199f08c3bdfSopenharmony_ci{
200f08c3bdfSopenharmony_ci	int i;
201f08c3bdfSopenharmony_ci
202f08c3bdfSopenharmony_ci	if (cpoint_name == INVALID || cpoint_type == NONE ||
203f08c3bdfSopenharmony_ci	    cpoint_count < 1 || recur_count < 1)
204f08c3bdfSopenharmony_ci		return -EINVAL;
205f08c3bdfSopenharmony_ci
206f08c3bdfSopenharmony_ci	for (i = 0; i < NUM_CPOINTS; ++i) {
207f08c3bdfSopenharmony_ci		if (!strcmp(cpoint_name, cp_name[i])) {
208f08c3bdfSopenharmony_ci			cpoint = i + 1;
209f08c3bdfSopenharmony_ci			break;
210f08c3bdfSopenharmony_ci		}
211f08c3bdfSopenharmony_ci	}
212f08c3bdfSopenharmony_ci
213f08c3bdfSopenharmony_ci	for (i = 0; i < NUM_CPOINT_TYPES; ++i) {
214f08c3bdfSopenharmony_ci		if (!strcmp(cpoint_type, cp_type[i])) {
215f08c3bdfSopenharmony_ci			cptype = i + 1;
216f08c3bdfSopenharmony_ci			break;
217f08c3bdfSopenharmony_ci		}
218f08c3bdfSopenharmony_ci	}
219f08c3bdfSopenharmony_ci
220f08c3bdfSopenharmony_ci	if (cpoint == INVALID || cptype == NONE)
221f08c3bdfSopenharmony_ci		return -EINVAL;
222f08c3bdfSopenharmony_ci
223f08c3bdfSopenharmony_ci	count = cpoint_count;
224f08c3bdfSopenharmony_ci
225f08c3bdfSopenharmony_ci	return 0;
226f08c3bdfSopenharmony_ci}
227f08c3bdfSopenharmony_ci
228f08c3bdfSopenharmony_cistatic int recursive_loop(int a)
229f08c3bdfSopenharmony_ci{
230f08c3bdfSopenharmony_ci	char buf[1024];
231f08c3bdfSopenharmony_ci
232f08c3bdfSopenharmony_ci	memset(buf, 0xFF, 1024);
233f08c3bdfSopenharmony_ci	recur_count--;
234f08c3bdfSopenharmony_ci	if (!recur_count)
235f08c3bdfSopenharmony_ci		return 0;
236f08c3bdfSopenharmony_ci	else
237f08c3bdfSopenharmony_ci		return recursive_loop(a);
238f08c3bdfSopenharmony_ci}
239f08c3bdfSopenharmony_ci
240f08c3bdfSopenharmony_civoid lkdtm_handler(void)
241f08c3bdfSopenharmony_ci{
242f08c3bdfSopenharmony_ci	/* Escape endless loop. */
243f08c3bdfSopenharmony_ci	if (count < 0)
244f08c3bdfSopenharmony_ci		return;
245f08c3bdfSopenharmony_ci
246f08c3bdfSopenharmony_ci	printk(KERN_INFO "lkdtm : Crash point %s of type %s hit\n",
247f08c3bdfSopenharmony_ci	       cpoint_name, cpoint_type);
248f08c3bdfSopenharmony_ci	--count;
249f08c3bdfSopenharmony_ci
250f08c3bdfSopenharmony_ci	if (count == 0) {
251f08c3bdfSopenharmony_ci		switch (cptype) {
252f08c3bdfSopenharmony_ci		case NONE:
253f08c3bdfSopenharmony_ci			break;
254f08c3bdfSopenharmony_ci		case PANIC:
255f08c3bdfSopenharmony_ci			printk(KERN_INFO "lkdtm : PANIC\n");
256f08c3bdfSopenharmony_ci			panic("dumptest");
257f08c3bdfSopenharmony_ci			break;
258f08c3bdfSopenharmony_ci		case BUG:
259f08c3bdfSopenharmony_ci			printk(KERN_INFO "lkdtm : BUG\n");
260f08c3bdfSopenharmony_ci			BUG();
261f08c3bdfSopenharmony_ci			break;
262f08c3bdfSopenharmony_ci		case EXCEPTION:
263f08c3bdfSopenharmony_ci			printk(KERN_INFO "lkdtm : EXCEPTION\n");
264f08c3bdfSopenharmony_ci			*((int *)0) = 0;
265f08c3bdfSopenharmony_ci			break;
266f08c3bdfSopenharmony_ci		case LOOP:
267f08c3bdfSopenharmony_ci			printk(KERN_INFO "lkdtm : LOOP\n");
268f08c3bdfSopenharmony_ci			for (;;) ;
269f08c3bdfSopenharmony_ci			break;
270f08c3bdfSopenharmony_ci		case OVERFLOW:
271f08c3bdfSopenharmony_ci			printk(KERN_INFO "lkdtm : OVERFLOW\n");
272f08c3bdfSopenharmony_ci			(void)recursive_loop(0);
273f08c3bdfSopenharmony_ci			break;
274f08c3bdfSopenharmony_ci		default:
275f08c3bdfSopenharmony_ci			break;
276f08c3bdfSopenharmony_ci		}
277f08c3bdfSopenharmony_ci		count = cpoint_count;
278f08c3bdfSopenharmony_ci	}
279f08c3bdfSopenharmony_ci}
280f08c3bdfSopenharmony_ci
281f08c3bdfSopenharmony_ci#ifdef USE_SYMBOL_NAME
282f08c3bdfSopenharmony_civoid lkdtm_symbol_name(char *name, void (*entry) (void))
283f08c3bdfSopenharmony_ci{
284f08c3bdfSopenharmony_ci	lkdtm.kp.symbol_name = name;
285f08c3bdfSopenharmony_ci	lkdtm.entry = (kprobe_opcode_t *) entry;
286f08c3bdfSopenharmony_ci}
287f08c3bdfSopenharmony_ci
288f08c3bdfSopenharmony_ci#else
289f08c3bdfSopenharmony_civoid lkdtm_lookup_name(char *name, void (*entry) (void))
290f08c3bdfSopenharmony_ci{
291f08c3bdfSopenharmony_ci	unsigned long addr;
292f08c3bdfSopenharmony_ci
293f08c3bdfSopenharmony_ci	addr = kallsyms_lookup_name(name);
294f08c3bdfSopenharmony_ci	if (addr) {
295f08c3bdfSopenharmony_ci		*(lkdtm.kp.addr) = addr;
296f08c3bdfSopenharmony_ci		lkdtm.entry = JPROBE_ENTRY(entry);
297f08c3bdfSopenharmony_ci	} else
298f08c3bdfSopenharmony_ci		printk(KERN_INFO "lkdtm : Crash point not available\n");
299f08c3bdfSopenharmony_ci}
300f08c3bdfSopenharmony_ci#endif
301f08c3bdfSopenharmony_ci
302f08c3bdfSopenharmony_ciint lkdtm_module_init(void)
303f08c3bdfSopenharmony_ci{
304f08c3bdfSopenharmony_ci	int ret;
305f08c3bdfSopenharmony_ci
306f08c3bdfSopenharmony_ci	if (lkdtm_parse_commandline() == -EINVAL) {
307f08c3bdfSopenharmony_ci		printk(KERN_INFO "lkdtm : Invalid command\n");
308f08c3bdfSopenharmony_ci		return -EINVAL;
309f08c3bdfSopenharmony_ci	}
310f08c3bdfSopenharmony_ci
311f08c3bdfSopenharmony_ci	switch (cpoint) {
312f08c3bdfSopenharmony_ci	case INT_HARDWARE_ENTRY:
313f08c3bdfSopenharmony_ci
314f08c3bdfSopenharmony_ci#ifdef USE_SYMBOL_NAME
315f08c3bdfSopenharmony_ci
316f08c3bdfSopenharmony_ci#ifdef __powerpc__
317f08c3bdfSopenharmony_ci		lkdtm_symbol_name(".__do_IRQ", (void (*)(void))jp_do_irq);
318f08c3bdfSopenharmony_ci#else
319f08c3bdfSopenharmony_ci		lkdtm_symbol_name("__do_IRQ", (void (*)(void))jp_do_irq);
320f08c3bdfSopenharmony_ci#endif /*__powerpc__*/
321f08c3bdfSopenharmony_ci
322f08c3bdfSopenharmony_ci#else /* USE_SYMBOL_NAME */
323f08c3bdfSopenharmony_ci		lkdtm_lookup_name("__do_IRQ", (void (*)(void))jp_do_irq);
324f08c3bdfSopenharmony_ci
325f08c3bdfSopenharmony_ci#endif /* USE_SYMBOL_NAME */
326f08c3bdfSopenharmony_ci		break;
327f08c3bdfSopenharmony_ci
328f08c3bdfSopenharmony_ci	case INT_HW_IRQ_EN:
329f08c3bdfSopenharmony_ci
330f08c3bdfSopenharmony_ci#ifdef USE_SYMBOL_NAME
331f08c3bdfSopenharmony_ci
332f08c3bdfSopenharmony_ci#ifdef __powerpc__
333f08c3bdfSopenharmony_ci		lkdtm_symbol_name(".handle_IRQ_event",
334f08c3bdfSopenharmony_ci				  (void (*)(void))jp_handle_irq_event);
335f08c3bdfSopenharmony_ci#else
336f08c3bdfSopenharmony_ci		lkdtm_symbol_name("handle_IRQ_event",
337f08c3bdfSopenharmony_ci				  (void (*)(void))jp_handle_irq_event);
338f08c3bdfSopenharmony_ci#endif /*__powerpc__*/
339f08c3bdfSopenharmony_ci
340f08c3bdfSopenharmony_ci#else /* USE_SYMBOL_NAME */
341f08c3bdfSopenharmony_ci		lkdtm_lookup_name("handle_IRQ_event",
342f08c3bdfSopenharmony_ci				  (void (*)(void))jp_handle_irq_event);
343f08c3bdfSopenharmony_ci
344f08c3bdfSopenharmony_ci#endif /* USE_SYMBOL_NAME */
345f08c3bdfSopenharmony_ci		break;
346f08c3bdfSopenharmony_ci
347f08c3bdfSopenharmony_ci	case INT_TASKLET_ENTRY:
348f08c3bdfSopenharmony_ci
349f08c3bdfSopenharmony_ci#ifdef USE_SYMBOL_NAME
350f08c3bdfSopenharmony_ci
351f08c3bdfSopenharmony_ci#ifdef __powerpc__
352f08c3bdfSopenharmony_ci		lkdtm_symbol_name(".tasklet_action",
353f08c3bdfSopenharmony_ci				  (void (*)(void))jp_tasklet_action);
354f08c3bdfSopenharmony_ci#else
355f08c3bdfSopenharmony_ci		lkdtm_symbol_name("tasklet_action",
356f08c3bdfSopenharmony_ci				  (void (*)(void))jp_tasklet_action);
357f08c3bdfSopenharmony_ci#endif /*__powerpc__*/
358f08c3bdfSopenharmony_ci
359f08c3bdfSopenharmony_ci#else /* USE_SYMBOL_NAME */
360f08c3bdfSopenharmony_ci		lkdtm_lookup_name("tasklet_action",
361f08c3bdfSopenharmony_ci				  (void (*)(void))jp_tasklet_action);
362f08c3bdfSopenharmony_ci
363f08c3bdfSopenharmony_ci#endif /* USE_SYMBOL_NAME */
364f08c3bdfSopenharmony_ci		break;
365f08c3bdfSopenharmony_ci
366f08c3bdfSopenharmony_ci	case FS_DEVRW:
367f08c3bdfSopenharmony_ci
368f08c3bdfSopenharmony_ci#ifdef USE_SYMBOL_NAME
369f08c3bdfSopenharmony_ci
370f08c3bdfSopenharmony_ci#ifdef __powerpc__
371f08c3bdfSopenharmony_ci		lkdtm_symbol_name(".ll_rw_block",
372f08c3bdfSopenharmony_ci				  (void (*)(void))jp_ll_rw_block);
373f08c3bdfSopenharmony_ci#else
374f08c3bdfSopenharmony_ci		lkdtm_symbol_name("ll_rw_block",
375f08c3bdfSopenharmony_ci				  (void (*)(void))jp_ll_rw_block);
376f08c3bdfSopenharmony_ci#endif /*__powerpc__*/
377f08c3bdfSopenharmony_ci
378f08c3bdfSopenharmony_ci#else /* USE_SYMBOL_NAME */
379f08c3bdfSopenharmony_ci		lkdtm_lookup_name("ll_rw_block",
380f08c3bdfSopenharmony_ci				  (void (*)(void))jp_ll_rw_block);
381f08c3bdfSopenharmony_ci
382f08c3bdfSopenharmony_ci#endif /* USE_SYMBOL_NAME */
383f08c3bdfSopenharmony_ci		break;
384f08c3bdfSopenharmony_ci
385f08c3bdfSopenharmony_ci	case MEM_SWAPOUT:
386f08c3bdfSopenharmony_ci
387f08c3bdfSopenharmony_ci#ifdef USE_SYMBOL_NAME
388f08c3bdfSopenharmony_ci
389f08c3bdfSopenharmony_ci#ifdef __powerpc__
390f08c3bdfSopenharmony_ci		lkdtm_symbol_name(".shrink_inactive_list",
391f08c3bdfSopenharmony_ci				  (void (*)(void))jp_shrink_page_list);
392f08c3bdfSopenharmony_ci#else
393f08c3bdfSopenharmony_ci		lkdtm_symbol_name("shrink_inactive_list",
394f08c3bdfSopenharmony_ci				  (void (*)(void))jp_shrink_page_list);
395f08c3bdfSopenharmony_ci#endif /*__powerpc__*/
396f08c3bdfSopenharmony_ci
397f08c3bdfSopenharmony_ci#else /* USE_SYMBOL_NAME */
398f08c3bdfSopenharmony_ci		lkdtm_lookup_name("shrink_inactive_list",
399f08c3bdfSopenharmony_ci				  (void (*)(void))jp_shrink_page_list);
400f08c3bdfSopenharmony_ci
401f08c3bdfSopenharmony_ci#endif /* USE_SYMBOL_NAME */
402f08c3bdfSopenharmony_ci		break;
403f08c3bdfSopenharmony_ci
404f08c3bdfSopenharmony_ci	case TIMERADD:
405f08c3bdfSopenharmony_ci
406f08c3bdfSopenharmony_ci#ifdef USE_SYMBOL_NAME
407f08c3bdfSopenharmony_ci
408f08c3bdfSopenharmony_ci#ifdef __powerpc__
409f08c3bdfSopenharmony_ci		lkdtm_symbol_name(".hrtimer_start",
410f08c3bdfSopenharmony_ci				  (void (*)(void))jp_hrtimer_start);
411f08c3bdfSopenharmony_ci#else
412f08c3bdfSopenharmony_ci		lkdtm_symbol_name("hrtimer_start",
413f08c3bdfSopenharmony_ci				  (void (*)(void))jp_hrtimer_start);
414f08c3bdfSopenharmony_ci#endif /*__powerpc__*/
415f08c3bdfSopenharmony_ci
416f08c3bdfSopenharmony_ci#else /* USE_SYMBOL_NAME */
417f08c3bdfSopenharmony_ci		lkdtm_lookup_name("hrtimer_start",
418f08c3bdfSopenharmony_ci				  (void (*)(void))jp_hrtimer_start);
419f08c3bdfSopenharmony_ci
420f08c3bdfSopenharmony_ci#endif /* USE_SYMBOL_NAME */
421f08c3bdfSopenharmony_ci		break;
422f08c3bdfSopenharmony_ci
423f08c3bdfSopenharmony_ci	case SCSI_DISPATCH_CMD:
424f08c3bdfSopenharmony_ci
425f08c3bdfSopenharmony_ci#ifdef USE_SYMBOL_NAME
426f08c3bdfSopenharmony_ci
427f08c3bdfSopenharmony_ci#ifdef __powerpc__
428f08c3bdfSopenharmony_ci		lkdtm_symbol_name(".scsi_dispatch_cmd",
429f08c3bdfSopenharmony_ci				  (void (*)(void))jp_scsi_dispatch_cmd);
430f08c3bdfSopenharmony_ci#else
431f08c3bdfSopenharmony_ci		lkdtm_symbol_name("scsi_dispatch_cmd",
432f08c3bdfSopenharmony_ci				  (void (*)(void))jp_scsi_dispatch_cmd);
433f08c3bdfSopenharmony_ci#endif /*__powerpc__*/
434f08c3bdfSopenharmony_ci
435f08c3bdfSopenharmony_ci#else /* USE_SYMBOL_NAME */
436f08c3bdfSopenharmony_ci		lkdtm_lookup_name("scsi_dispatch_cmd",
437f08c3bdfSopenharmony_ci				  (void (*)(void))jp_scsi_dispatch_cmd);
438f08c3bdfSopenharmony_ci
439f08c3bdfSopenharmony_ci#endif /* USE_SYMBOL_NAME */
440f08c3bdfSopenharmony_ci		break;
441f08c3bdfSopenharmony_ci
442f08c3bdfSopenharmony_ci	case IDE_CORE_CP:
443f08c3bdfSopenharmony_ci#ifdef CONFIG_IDE
444f08c3bdfSopenharmony_ci
445f08c3bdfSopenharmony_ci#ifdef USE_SYMBOL_NAME
446f08c3bdfSopenharmony_ci
447f08c3bdfSopenharmony_ci#ifdef __powerpc__
448f08c3bdfSopenharmony_ci		lkdtm_symbol_name(".scsi_dispatch_cmd",
449f08c3bdfSopenharmony_ci				  (void (*)(void))jp_scsi_dispatch_cmd);
450f08c3bdfSopenharmony_ci#else
451f08c3bdfSopenharmony_ci		lkdtm_symbol_name("scsi_dispatch_cmd",
452f08c3bdfSopenharmony_ci				  (void (*)(void))jp_scsi_dispatch_cmd);
453f08c3bdfSopenharmony_ci#endif /*__powerpc__*/
454f08c3bdfSopenharmony_ci
455f08c3bdfSopenharmony_ci#else /* USE_SYMBOL_NAME */
456f08c3bdfSopenharmony_ci		lkdtm_lookup_name("scsi_dispatch_cmd",
457f08c3bdfSopenharmony_ci				  (void (*)(void))jp_scsi_dispatch_cmd);
458f08c3bdfSopenharmony_ci
459f08c3bdfSopenharmony_ci#endif /* USE_SYMBOL_NAME */
460f08c3bdfSopenharmony_ci#endif /* CONFIG_IDE */
461f08c3bdfSopenharmony_ci		break;
462f08c3bdfSopenharmony_ci
463f08c3bdfSopenharmony_ci	default:
464f08c3bdfSopenharmony_ci		printk(KERN_INFO "lkdtm : Invalid Crash Point\n");
465f08c3bdfSopenharmony_ci		break;
466f08c3bdfSopenharmony_ci	}
467f08c3bdfSopenharmony_ci
468f08c3bdfSopenharmony_ci	if ((ret = register_jprobe(&lkdtm)) < 0) {
469f08c3bdfSopenharmony_ci		printk(KERN_INFO "lkdtm : Couldn't register jprobe\n");
470f08c3bdfSopenharmony_ci		return ret;
471f08c3bdfSopenharmony_ci	}
472f08c3bdfSopenharmony_ci
473f08c3bdfSopenharmony_ci	printk(KERN_INFO "lkdtm : Crash point %s of type %s registered\n",
474f08c3bdfSopenharmony_ci	       cpoint_name, cpoint_type);
475f08c3bdfSopenharmony_ci	return 0;
476f08c3bdfSopenharmony_ci}
477f08c3bdfSopenharmony_ci
478f08c3bdfSopenharmony_civoid lkdtm_module_exit(void)
479f08c3bdfSopenharmony_ci{
480f08c3bdfSopenharmony_ci	unregister_jprobe(&lkdtm);
481f08c3bdfSopenharmony_ci	printk(KERN_INFO "lkdtm : Crash point unregistered\n");
482f08c3bdfSopenharmony_ci}
483f08c3bdfSopenharmony_ci
484f08c3bdfSopenharmony_cimodule_init(lkdtm_module_init);
485f08c3bdfSopenharmony_cimodule_exit(lkdtm_module_exit);
486f08c3bdfSopenharmony_ci
487f08c3bdfSopenharmony_ciMODULE_LICENSE("GPL");
488