struct pd_t *lpd_get(struct sspt_proc *proc)
{
- return (struct pd_t *)proc->private_data;
+ return (struct pd_t *)sspt_proc_priv_get(proc);
}
EXPORT_SYMBOL_GPL(lpd_get);
-void lpd_set(struct sspt_proc *proc, struct pd_t *pd)
-{
- proc->private_data = pd;
-}
-EXPORT_SYMBOL_GPL(lpd_set);
-
struct pd_t *lpd_get_by_task(struct task_struct *task)
{
- struct sspt_proc *proc;
+ struct sspt_proc *proc = sspt_proc_by_task(task);
struct pd_t *pd;
- proc = sspt_proc_by_task(task);
pd = lpd_get(proc);
- if (!pd) {
- pd = do_create_pd(task);
- lpd_set(proc, pd);
- }
+ BUG_ON(!pd);
return pd;
}
case PIF_ADD_PFG:
proc = sspt_proc_get_by_task(task);
if (proc) {
+ sspt_proc_priv_create(proc);
first_install(task, proc);
sspt_proc_put(proc);
}
case PIF_ADD_PFG:
proc = sspt_proc_get_by_task(task);
if (proc) {
+ sspt_proc_priv_create(proc);
first_install(task, proc);
sspt_proc_put(proc);
}
case PIF_SECOND:
proc = sspt_proc_get_by_task(task);
if (proc) {
+ sspt_proc_priv_create(proc);
subsequent_install(task, proc, page_addr);
sspt_proc_put(proc);
}
#include <kprobe/swap_ktd.h>
#include <us_manager/us_slot_manager.h>
+
+#define UNINIT_PRIV_DATA (void *)0xbadbeef
+
static LIST_HEAD(proc_probes_list);
static DEFINE_RWLOCK(sspt_proc_rwlock);
mutex_init(&proc->filters.mtx);
INIT_LIST_HEAD(&proc->filters.head);
atomic_set(&proc->usage, 1);
+ proc->priv_data.is_init = 0;
+ mutex_init(&proc->priv_data.lock);
+ proc->priv_data.data = UNINIT_PRIV_DATA;
get_task_struct(proc->leader);
void sspt_proc_priv_create(struct sspt_proc *proc)
{
- if (proc_cb && proc_cb->priv_create)
- proc->private_data = proc_cb->priv_create(proc);
+ if (proc->priv_data.is_init)
+ return;
+
+ mutex_lock(&proc->priv_data.lock);
+ if (!proc->priv_data.is_init) {
+ if (proc_cb && proc_cb->priv_create)
+ proc->priv_data.data = proc_cb->priv_create(proc);
+ proc->priv_data.is_init = 1;
+ }
+ mutex_unlock(&proc->priv_data.lock);
}
void sspt_proc_priv_destroy(struct sspt_proc *proc)
{
- if (proc->first_install && proc_cb && proc_cb->priv_destroy)
- proc_cb->priv_destroy(proc, proc->private_data);
- proc->private_data = NULL;
+ mutex_lock(&proc->priv_data.lock);
+ if (proc->priv_data.is_init && proc_cb && proc_cb->priv_destroy) {
+ proc->priv_data.is_init = 0;
+ proc_cb->priv_destroy(proc, proc->priv_data.data);
+ proc->priv_data.data = UNINIT_PRIV_DATA;
+ }
+ mutex_unlock(&proc->priv_data.lock);
+}
+
+void *sspt_proc_priv_get(struct sspt_proc *proc)
+{
+ BUG_ON(proc->priv_data.data == UNINIT_PRIV_DATA);
+
+ return proc->priv_data.data;
+}
+EXPORT_SYMBOL_GPL(sspt_proc_priv_get);
+
+bool sspt_proc_priv_check(struct sspt_proc *proc)
+{
+ return proc->priv_data.data == UNINIT_PRIV_DATA ? false : true;
}
/* FIXME: for preload (remove those fields) */
unsigned long r_state_addr; /**< address of r_state */
- void *private_data; /**< Process private data */
+
+ struct {
+ unsigned is_init:1; /**< private data init flag */
+ struct mutex lock; /**< lock for create/destroy priv_data */
+ void *data; /**< Process private data */
+ } priv_data;
};
struct sspt_proc_cb {
int sspt_proc_cb_set(struct sspt_proc_cb *cb);
void sspt_proc_priv_create(struct sspt_proc *proc);
void sspt_proc_priv_destroy(struct sspt_proc *proc);
+void *sspt_proc_priv_get(struct sspt_proc *proc);
+bool sspt_proc_priv_check(struct sspt_proc *proc);
void sspt_change_leader(struct task_struct *prev, struct task_struct *next);
int sspt_proc_init(void);
#include <linux/module.h>
#include <kprobe/swap_kprobes_deps.h> // for swap_hlist_for_each_entry
#include "usm_hook.h"
+#include "sspt/sspt_proc.h"
static HLIST_HEAD(hook_head);
struct usm_hook *hook;
DECLARE_NODE_PTR_FOR_HLIST(node);
+ if (!sspt_proc_priv_check(proc))
+ return;
+
down_read(&hook_sem);
swap_hlist_for_each_entry(hook, node, &hook_head, node) {
if (hook->mmap)