73 lines
2.8 KiB
C
73 lines
2.8 KiB
C
#include <linux/hrtimer.h>
|
|
// #include <linux/kprobes.h>
|
|
// #include <linux/ktime.h>
|
|
// #include <linux/list.h>
|
|
// // #include <linux/slab.h> /* for kmalloc */
|
|
// #include <linux/string.h>
|
|
|
|
// #include <asm/uaccess.h>
|
|
// #include <linux/cdev.h>
|
|
// #include <linux/highmem.h>
|
|
// #include <linux/sched.h>
|
|
// #include <linux/sched/loadavg.h> /* for avenrun, LOAD_* */
|
|
// #include <linux/sched/mm.h>
|
|
// #include <linux/sched/signal.h>
|
|
// #include <linux/stacktrace.h> /* for stack_trace_print */
|
|
|
|
#define MAX_TIMER_NUM (128) // max timer number
|
|
#define TIMER_MAX_WATCH_NUM (32) // A timer max watch number at once time
|
|
#define MAX_NAME_LEN (15) // max name length
|
|
|
|
typedef struct {
|
|
pid_t task_id; // current process id
|
|
char name[MAX_NAME_LEN + 1]; // name
|
|
void *ptr; // virtual address
|
|
int length_byte; // byte
|
|
long long threshold; // threshold value
|
|
unsigned char unsigned_flag; // unsigned flag (true: unsigned, false: signed)
|
|
unsigned char greater_flag; // reverse flag (true: >, false: <)
|
|
unsigned long time_ns; // timer interval (ns)
|
|
} watch_arg;
|
|
|
|
typedef struct {
|
|
pid_t task_id; // current process id
|
|
char name[MAX_NAME_LEN + 2]; // name, last char automatically add '\0'
|
|
void *kptr; // kernel address + offset
|
|
int length_byte; // byte
|
|
long long threshold; // threshold value
|
|
unsigned char unsigned_flag; // unsigned flag (true: unsigned, false: signed)
|
|
unsigned char greater_flag; // reverse flag (true: >, false: <)
|
|
} kernel_watch_arg;
|
|
|
|
typedef struct {
|
|
unsigned long long time_ns; // hrTimer time interval (ns)
|
|
struct hrtimer hr_timer; // hrTimer
|
|
ktime_t kt; // hrTimer time
|
|
unsigned sentinel; // sentinel
|
|
kernel_watch_arg
|
|
k_watch_args[TIMER_MAX_WATCH_NUM]; // all watched kernel_watch_arg
|
|
} kernel_watch_timer;
|
|
|
|
// Global variable
|
|
extern kernel_watch_timer
|
|
kernel_wtimer_list[MAX_TIMER_NUM]; // all kernel_watch_timer
|
|
extern int kernel_wtimer_num; // current kernel_watch_timer number
|
|
|
|
// EXPORT_SYMBOL(kernel_wtimer_list); // export kernel_watch_timer_list
|
|
// EXPORT_SYMBOL(kernel_wtimer_num); // export kernel_watch_timer_num
|
|
|
|
unsigned char del_all_kwarg_by_pid(pid_t pid);
|
|
|
|
#define TIMER_START(timer) \
|
|
(hrtimer_start(&timer->hr_timer, timer->kt, HRTIMER_MODE_REL))
|
|
#define TIMER_CANCEL(timer) (hrtimer_cancel(&timer->hr_timer))
|
|
|
|
// for timer
|
|
kernel_watch_timer *get_timer(unsigned long long time_ns);
|
|
unsigned char timer_add_watch(kernel_watch_timer *timer,
|
|
kernel_watch_arg k_watch_arg);
|
|
unsigned char timer_del_watch_by_pid(kernel_watch_timer *timer, pid_t pid);
|
|
|
|
enum hrtimer_restart check_variable_cb(struct hrtimer *timer); // callback
|
|
void start_all_hrTimer(void);
|
|
void cancel_all_hrTimer(void); |