cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

poll_state.c (1305B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * poll_state.c - Polling idle state
      4 */
      5
      6#include <linux/cpuidle.h>
      7#include <linux/sched.h>
      8#include <linux/sched/clock.h>
      9#include <linux/sched/idle.h>
     10
     11#define POLL_IDLE_RELAX_COUNT	200
     12
     13static int __cpuidle poll_idle(struct cpuidle_device *dev,
     14			       struct cpuidle_driver *drv, int index)
     15{
     16	u64 time_start = local_clock();
     17
     18	dev->poll_time_limit = false;
     19
     20	local_irq_enable();
     21	if (!current_set_polling_and_test()) {
     22		unsigned int loop_count = 0;
     23		u64 limit;
     24
     25		limit = cpuidle_poll_time(drv, dev);
     26
     27		while (!need_resched()) {
     28			cpu_relax();
     29			if (loop_count++ < POLL_IDLE_RELAX_COUNT)
     30				continue;
     31
     32			loop_count = 0;
     33			if (local_clock() - time_start > limit) {
     34				dev->poll_time_limit = true;
     35				break;
     36			}
     37		}
     38	}
     39	current_clr_polling();
     40
     41	return index;
     42}
     43
     44void cpuidle_poll_state_init(struct cpuidle_driver *drv)
     45{
     46	struct cpuidle_state *state = &drv->states[0];
     47
     48	snprintf(state->name, CPUIDLE_NAME_LEN, "POLL");
     49	snprintf(state->desc, CPUIDLE_DESC_LEN, "CPUIDLE CORE POLL IDLE");
     50	state->exit_latency = 0;
     51	state->target_residency = 0;
     52	state->exit_latency_ns = 0;
     53	state->target_residency_ns = 0;
     54	state->power_usage = -1;
     55	state->enter = poll_idle;
     56	state->flags = CPUIDLE_FLAG_POLLING;
     57}
     58EXPORT_SYMBOL_GPL(cpuidle_poll_state_init);