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