diff options
| author | Emese Revfy <re.emese@gmail.com> | 2016-06-20 14:42:34 -0400 |
|---|---|---|
| committer | Kees Cook <keescook@chromium.org> | 2016-10-10 17:51:45 -0400 |
| commit | 0766f788eb727e2e330d55d30545db65bcf2623f (patch) | |
| tree | 0436ae3b005558a4fb827459fe5c602037fe764a /kernel | |
| parent | 38addce8b600ca335dc86fa3d48c890f1c6fa1f4 (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.c | 6 | ||||
| -rw-r--r-- | kernel/rcu/tiny.c | 2 | ||||
| -rw-r--r-- | kernel/rcu/tree.c | 2 | ||||
| -rw-r--r-- | kernel/sched/fair.c | 2 | ||||
| -rw-r--r-- | kernel/softirq.c | 4 | ||||
| -rw-r--r-- | kernel/time/timer.c | 2 |
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 |
| 407 | static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm) | 407 | static __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 | */ |
| 1299 | static struct task_struct *copy_process(unsigned long clone_flags, | 1300 | static __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 | ||
| 173 | static void rcu_process_callbacks(struct softirq_action *unused) | 173 | static __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 | */ |
| 3016 | static void rcu_process_callbacks(struct softirq_action *unused) | 3016 | static __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 | */ |
| 8286 | static void run_rebalance_domains(struct softirq_action *h) | 8286 | static __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 | } |
| 483 | EXPORT_SYMBOL(__tasklet_hi_schedule_first); | 483 | EXPORT_SYMBOL(__tasklet_hi_schedule_first); |
| 484 | 484 | ||
| 485 | static void tasklet_action(struct softirq_action *a) | 485 | static __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 | ||
| 521 | static void tasklet_hi_action(struct softirq_action *a) | 521 | static __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 | */ |
| 1636 | static void run_timer_softirq(struct softirq_action *h) | 1636 | static __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 | ||
