1 #include <linux/module.h>
2 #include <linux/time.h>
3 #include <kprobe/dbi_kprobes.h>
5 static u64 get_ntime(void)
11 return (u64)ts.tv_sec * 1000*1000*1000 + ts.tv_nsec;
14 /* ============================================================================
16 * ============================================================================
18 static int entry_handler_switch(struct kretprobe_instance *ri, struct pt_regs *regs)
23 static int ret_handler_switch(struct kretprobe_instance *ri, struct pt_regs *regs)
28 static struct kretprobe switch_to_krp = {
29 .entry_handler = entry_handler_switch,
30 .handler = ret_handler_switch,
37 /* ============================================================================
39 * ============================================================================
41 static int entry_handler_sys_read(struct kretprobe_instance *ri, struct pt_regs *regs)
46 static int ret_handler_sys_read(struct kretprobe_instance *ri, struct pt_regs *regs)
51 static struct kretprobe sys_read_krp = {
52 .entry_handler = entry_handler_sys_read,
53 .handler = ret_handler_sys_read,
60 /* ============================================================================
62 * ============================================================================
64 static int entry_handler_sys_write(struct kretprobe_instance *ri, struct pt_regs *regs)
69 static int ret_handler_sys_write(struct kretprobe_instance *ri, struct pt_regs *regs)
74 static struct kretprobe sys_write_krp = {
75 .entry_handler = entry_handler_sys_write,
76 .handler = ret_handler_sys_write,
87 ret = dbi_register_kretprobe(&sys_read_krp);
89 printk("dbi_register_kretprobe(sys_read) result=%d!\n", ret);
93 ret = dbi_register_kretprobe(&sys_write_krp);
95 printk("dbi_register_kretprobe(sys_write) result=%d!\n", ret);
96 goto unregister_sys_read;
99 ret = dbi_register_kretprobe(&switch_to_krp);
101 printk("dbi_register_kretprobe(__switch_to) result=%d!\n", ret);
102 goto unregister_sys_write;
108 dbi_unregister_kretprobe(&sys_read_krp);
110 unregister_sys_write:
111 dbi_unregister_kretprobe(&sys_write_krp);
115 EXPORT_SYMBOL_GPL(set_energy);
117 void unset_energy(void)
119 dbi_unregister_kretprobe(&switch_to_krp);
120 dbi_unregister_kretprobe(&sys_write_krp);
121 dbi_unregister_kretprobe(&sys_read_krp);
123 EXPORT_SYMBOL_GPL(unset_energy);
125 static int __init swap_energy_init(void)
128 addr = swap_ksyms("__switch_to");
130 printk("Cannot find address for __switch_to function!\n");
133 switch_to_krp.kp.addr = (kprobe_opcode_t *)addr;
135 addr = swap_ksyms("sys_read");
137 printk("Cannot find address for sys_read function!\n");
140 sys_read_krp.kp.addr = (kprobe_opcode_t *)addr;
142 addr = swap_ksyms("sys_write");
144 printk("Cannot find address for sys_write function!\n");
147 sys_write_krp.kp.addr = (kprobe_opcode_t *)addr;
152 static void __exit swap_energy_exit(void)
156 module_init(swap_energy_init);
157 module_exit(swap_energy_exit);
159 MODULE_LICENSE("GPL");