aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorEmese Revfy <re.emese@gmail.com>2016-06-20 14:42:34 -0400
committerKees Cook <keescook@chromium.org>2016-10-10 17:51:45 -0400
commit0766f788eb727e2e330d55d30545db65bcf2623f (patch)
tree0436ae3b005558a4fb827459fe5c602037fe764a /kernel
parent38addce8b600ca335dc86fa3d48c890f1c6fa1f4 (diff)
latent_entropy: Mark functions with __latent_entropy
The __latent_entropy gcc attribute can be used only on functions and variables. If it is on a function then the plugin will instrument it for gathering control-flow entropy. If the attribute is on a variable then the plugin will initialize it with random contents. The variable must be an integer, an integer array type or a structure with integer fields. These specific functions have been selected because they are init functions (to help gather boot-time entropy), are called at unpredictable times, or they have variable loops, each of which provide some level of latent entropy. Signed-off-by: Emese Revfy <re.emese@gmail.com> [kees: expanded commit message] Signed-off-by: Kees Cook <keescook@chromium.org>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/fork.c6
-rw-r--r--kernel/rcu/tiny.c2
-rw-r--r--kernel/rcu/tree.c2
-rw-r--r--kernel/sched/fair.c2
-rw-r--r--kernel/softirq.c4
-rw-r--r--kernel/time/timer.c2
6 files changed, 10 insertions, 8 deletions
diff --git a/kernel/fork.c b/kernel/fork.c
index 001b18473a07..05393881ef39 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -404,7 +404,8 @@ free_tsk:
404} 404}
405 405
406#ifdef CONFIG_MMU 406#ifdef CONFIG_MMU
407static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm) 407static __latent_entropy int dup_mmap(struct mm_struct *mm,
408 struct mm_struct *oldmm)
408{ 409{
409 struct vm_area_struct *mpnt, *tmp, *prev, **pprev; 410 struct vm_area_struct *mpnt, *tmp, *prev, **pprev;
410 struct rb_node **rb_link, *rb_parent; 411 struct rb_node **rb_link, *rb_parent;
@@ -1296,7 +1297,8 @@ init_task_pid(struct task_struct *task, enum pid_type type, struct pid *pid)
1296 * parts of the process environment (as per the clone 1297 * parts of the process environment (as per the clone
1297 * flags). The actual kick-off is left to the caller. 1298 * flags). The actual kick-off is left to the caller.
1298 */ 1299 */
1299static struct task_struct *copy_process(unsigned long clone_flags, 1300static __latent_entropy struct task_struct *copy_process(
1301 unsigned long clone_flags,
1300 unsigned long stack_start, 1302 unsigned long stack_start,
1301 unsigned long stack_size, 1303 unsigned long stack_size,
1302 int __user *child_tidptr, 1304 int __user *child_tidptr,
diff --git a/kernel/rcu/tiny.c b/kernel/rcu/tiny.c
index 944b1b491ed8..1898559e6b60 100644
--- a/kernel/rcu/tiny.c
+++ b/kernel/rcu/tiny.c
@@ -170,7 +170,7 @@ static void __rcu_process_callbacks(struct rcu_ctrlblk *rcp)
170 false)); 170 false));
171} 171}
172 172
173static void rcu_process_callbacks(struct softirq_action *unused) 173static __latent_entropy void rcu_process_callbacks(struct softirq_action *unused)
174{ 174{
175 __rcu_process_callbacks(&rcu_sched_ctrlblk); 175 __rcu_process_callbacks(&rcu_sched_ctrlblk);
176 __rcu_process_callbacks(&rcu_bh_ctrlblk); 176 __rcu_process_callbacks(&rcu_bh_ctrlblk);
diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index 5d80925e7fc8..e5164deb51e1 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -3013,7 +3013,7 @@ __rcu_process_callbacks(struct rcu_state *rsp)
3013/* 3013/*
3014 * Do RCU core processing for the current CPU. 3014 * Do RCU core processing for the current CPU.
3015 */ 3015 */
3016static void rcu_process_callbacks(struct softirq_action *unused) 3016static __latent_entropy void rcu_process_callbacks(struct softirq_action *unused)
3017{ 3017{
3018 struct rcu_state *rsp; 3018 struct rcu_state *rsp;
3019 3019
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index 039de34f1521..004996df2f10 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -8283,7 +8283,7 @@ static void nohz_idle_balance(struct rq *this_rq, enum cpu_idle_type idle) { }
8283 * run_rebalance_domains is triggered when needed from the scheduler tick. 8283 * run_rebalance_domains is triggered when needed from the scheduler tick.
8284 * Also triggered for nohz idle balancing (with nohz_balancing_kick set). 8284 * Also triggered for nohz idle balancing (with nohz_balancing_kick set).
8285 */ 8285 */
8286static void run_rebalance_domains(struct softirq_action *h) 8286static __latent_entropy void run_rebalance_domains(struct softirq_action *h)
8287{ 8287{
8288 struct rq *this_rq = this_rq(); 8288 struct rq *this_rq = this_rq();
8289 enum cpu_idle_type idle = this_rq->idle_balance ? 8289 enum cpu_idle_type idle = this_rq->idle_balance ?
diff --git a/kernel/softirq.c b/kernel/softirq.c
index 17caf4b63342..34033fd09c8c 100644
--- a/kernel/softirq.c
+++ b/kernel/softirq.c
@@ -482,7 +482,7 @@ void __tasklet_hi_schedule_first(struct tasklet_struct *t)
482} 482}
483EXPORT_SYMBOL(__tasklet_hi_schedule_first); 483EXPORT_SYMBOL(__tasklet_hi_schedule_first);
484 484
485static void tasklet_action(struct softirq_action *a) 485static __latent_entropy void tasklet_action(struct softirq_action *a)
486{ 486{
487 struct tasklet_struct *list; 487 struct tasklet_struct *list;
488 488
@@ -518,7 +518,7 @@ static void tasklet_action(struct softirq_action *a)
518 } 518 }
519} 519}
520 520
521static void tasklet_hi_action(struct softirq_action *a) 521static __latent_entropy void tasklet_hi_action(struct softirq_action *a)
522{ 522{
523 struct tasklet_struct *list; 523 struct tasklet_struct *list;
524 524
diff --git a/kernel/time/timer.c b/kernel/time/timer.c
index 32bf6f75a8fe..2d47980a1bc4 100644
--- a/kernel/time/timer.c
+++ b/kernel/time/timer.c
@@ -1633,7 +1633,7 @@ static inline void __run_timers(struct timer_base *base)
1633/* 1633/*
1634 * This function runs timers and the timer-tq in bottom half context. 1634 * This function runs timers and the timer-tq in bottom half context.
1635 */ 1635 */
1636static void run_timer_softirq(struct softirq_action *h) 1636static __latent_entropy void run_timer_softirq(struct softirq_action *h)
1637{ 1637{
1638 struct timer_base *base = this_cpu_ptr(&timer_bases[BASE_STD]); 1638 struct timer_base *base = this_cpu_ptr(&timer_bases[BASE_STD]);
1639 1639