Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ac2ae9db authored by Amareswar Reddy Valasa's avatar Amareswar Reddy Valasa
Browse files

Seemp: Processing new KP report



New structures were added in QHEE Kernel Protect for generating
Kernel Protect report. This report will be sent to Linux, in
which kernel helps in processing of report and extracting data
from it. Here we are adapting to new KP structures to process
KP report.

Change-Id: Ie19af708aacd4ff7af0a5d5a876019637b35a3d8
Signed-off-by: default avatarAmareswar Reddy Valasa <avalasa@codeaurora.org>
parent a980a6a3
Loading
Loading
Loading
Loading
+20 −54
Original line number Diff line number Diff line
@@ -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
@@ -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);
@@ -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 */
+21 −0
Original line number Diff line number Diff line
@@ -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