Loading drivers/platform/msm/seemp_core/seemp_logk.c +20 −54 Original line number Diff line number Diff line Loading @@ -27,7 +27,7 @@ #define YEAR_BASE 1900 #define EL2_SCM_ID 0x02001902 #define KP_EL2_REPORT_REVISION 0x01000101 #define KP_EL2_REPORT_REVISION 0x01000110 #define INVALID_PID -1 #define EL2_SCM_ID2 0x02001905 Loading Loading @@ -65,7 +65,6 @@ static long seemp_logk_reserve_rdblks( static long seemp_logk_set_mask(unsigned long arg); static long seemp_logk_set_mapping(unsigned long arg); static long seemp_logk_check_filter(unsigned long arg); static pid_t seemp_logk_get_pid(struct task_struct *t); static int seemp_logk_rtic_thread(void *data); void* (*seemp_logk_kernel_begin)(char **buf); Loading Loading @@ -605,71 +604,38 @@ static const struct file_operations seemp_logk_fops = { .mmap = seemp_logk_mmap, }; static pid_t seemp_logk_get_pid(struct task_struct *t) { struct task_struct *task; pid_t pid; if (t == NULL) return INVALID_PID; rcu_read_lock(); for_each_process(task) { if (task == t) { pid = task->pid; rcu_read_unlock(); return pid; } } rcu_read_unlock(); return INVALID_PID; } static int seemp_logk_rtic_thread(void *data) { struct el2_report_header_t *header; __u64 last_sequence_number = 0; int last_pos = -1; int i; int num_entries = (PAGE_SIZE - sizeof(struct el2_report_header_t)) / sizeof(struct el2_report_data_t); header = (struct el2_report_header_t *) el2_shared_mem; if (header->report_version < KP_EL2_REPORT_REVISION) return -EINVAL; while (!kthread_should_stop()) { for (i = 1; i < num_entries + 1; i++) { struct el2_report_data_t *report; int cur_pos = last_pos + i; if (cur_pos >= num_entries) cur_pos -= num_entries; struct el2_actor_report_t *report; report = el2_shared_mem + sizeof(struct el2_report_header_t); for (i = 0; i < report->actor_count; i++) { struct el2_actor_data_t *actor; actor = el2_shared_mem + sizeof(struct el2_report_header_t) + cur_pos * sizeof(struct el2_report_data_t); sizeof(struct el2_actor_report_t) + i * (sizeof(struct el2_actor_data_t)); /* determine legitimacy of report */ if (report->report_valid && (last_sequence_number == 0 || report->sequence_number > last_sequence_number)) { seemp_logk_rtic(report->report_type, seemp_logk_get_pid( (struct task_struct *) report->actor), /* leave this empty until actor->pid, /* * leave this empty until * asset id is provided */ "", report->asset_category, report->response); last_sequence_number = report->sequence_number; } else { last_pos = cur_pos - 1; break; } } /* periodically check el2 report every second */ Loading drivers/platform/msm/seemp_core/seemp_logk.h +21 −0 Original line number Diff line number Diff line Loading @@ -183,4 +183,25 @@ struct el2_report_data_t { __u8 response; /* Response From EL2 */ }; struct el2_actor_report_t { __u32 mpgen_interface_ver; /* duplicate MP version, used for API verification */ __u64 num_incidents; /* number of incidents */ __u8 protection_enabled; /* states if protection is enabled */ __u64 spare; /* reserve 64bit for future use */ __u64 timestamp; /* time of report */ __u8 report_type; /* type of report: info or incident */ __u8 asset_category; /* category of affected asset: ro, wo etc */ __s8 asset_name[24]; /* name of affected asset */ __u8 response; /* type of response: allow or restrict */ __u32 actor_count; /* number of actors involved */ }; struct el2_actor_data_t { __s32 pid; /*pid of actor process */ __s64 state; /* state of actor process */ __s8 name[16]; /* name of actor process */ }; #endif Loading
drivers/platform/msm/seemp_core/seemp_logk.c +20 −54 Original line number Diff line number Diff line Loading @@ -27,7 +27,7 @@ #define YEAR_BASE 1900 #define EL2_SCM_ID 0x02001902 #define KP_EL2_REPORT_REVISION 0x01000101 #define KP_EL2_REPORT_REVISION 0x01000110 #define INVALID_PID -1 #define EL2_SCM_ID2 0x02001905 Loading Loading @@ -65,7 +65,6 @@ static long seemp_logk_reserve_rdblks( static long seemp_logk_set_mask(unsigned long arg); static long seemp_logk_set_mapping(unsigned long arg); static long seemp_logk_check_filter(unsigned long arg); static pid_t seemp_logk_get_pid(struct task_struct *t); static int seemp_logk_rtic_thread(void *data); void* (*seemp_logk_kernel_begin)(char **buf); Loading Loading @@ -605,71 +604,38 @@ static const struct file_operations seemp_logk_fops = { .mmap = seemp_logk_mmap, }; static pid_t seemp_logk_get_pid(struct task_struct *t) { struct task_struct *task; pid_t pid; if (t == NULL) return INVALID_PID; rcu_read_lock(); for_each_process(task) { if (task == t) { pid = task->pid; rcu_read_unlock(); return pid; } } rcu_read_unlock(); return INVALID_PID; } static int seemp_logk_rtic_thread(void *data) { struct el2_report_header_t *header; __u64 last_sequence_number = 0; int last_pos = -1; int i; int num_entries = (PAGE_SIZE - sizeof(struct el2_report_header_t)) / sizeof(struct el2_report_data_t); header = (struct el2_report_header_t *) el2_shared_mem; if (header->report_version < KP_EL2_REPORT_REVISION) return -EINVAL; while (!kthread_should_stop()) { for (i = 1; i < num_entries + 1; i++) { struct el2_report_data_t *report; int cur_pos = last_pos + i; if (cur_pos >= num_entries) cur_pos -= num_entries; struct el2_actor_report_t *report; report = el2_shared_mem + sizeof(struct el2_report_header_t); for (i = 0; i < report->actor_count; i++) { struct el2_actor_data_t *actor; actor = el2_shared_mem + sizeof(struct el2_report_header_t) + cur_pos * sizeof(struct el2_report_data_t); sizeof(struct el2_actor_report_t) + i * (sizeof(struct el2_actor_data_t)); /* determine legitimacy of report */ if (report->report_valid && (last_sequence_number == 0 || report->sequence_number > last_sequence_number)) { seemp_logk_rtic(report->report_type, seemp_logk_get_pid( (struct task_struct *) report->actor), /* leave this empty until actor->pid, /* * leave this empty until * asset id is provided */ "", report->asset_category, report->response); last_sequence_number = report->sequence_number; } else { last_pos = cur_pos - 1; break; } } /* periodically check el2 report every second */ Loading
drivers/platform/msm/seemp_core/seemp_logk.h +21 −0 Original line number Diff line number Diff line Loading @@ -183,4 +183,25 @@ struct el2_report_data_t { __u8 response; /* Response From EL2 */ }; struct el2_actor_report_t { __u32 mpgen_interface_ver; /* duplicate MP version, used for API verification */ __u64 num_incidents; /* number of incidents */ __u8 protection_enabled; /* states if protection is enabled */ __u64 spare; /* reserve 64bit for future use */ __u64 timestamp; /* time of report */ __u8 report_type; /* type of report: info or incident */ __u8 asset_category; /* category of affected asset: ro, wo etc */ __s8 asset_name[24]; /* name of affected asset */ __u8 response; /* type of response: allow or restrict */ __u32 actor_count; /* number of actors involved */ }; struct el2_actor_data_t { __s32 pid; /*pid of actor process */ __s64 state; /* state of actor process */ __s8 name[16]; /* name of actor process */ }; #endif