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

cputime.h (3069B)


      1/* SPDX-License-Identifier: GPL-2.0-or-later */
      2/*
      3 * Definitions for measuring cputime on powerpc machines.
      4 *
      5 * Copyright (C) 2006 Paul Mackerras, IBM Corp.
      6 *
      7 * If we have CONFIG_VIRT_CPU_ACCOUNTING_NATIVE, we measure cpu time in
      8 * the same units as the timebase.  Otherwise we measure cpu time
      9 * in jiffies using the generic definitions.
     10 */
     11
     12#ifndef __POWERPC_CPUTIME_H
     13#define __POWERPC_CPUTIME_H
     14
     15#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE
     16
     17#include <linux/types.h>
     18#include <linux/time.h>
     19#include <asm/div64.h>
     20#include <asm/time.h>
     21#include <asm/param.h>
     22
     23typedef u64 __nocast cputime_t;
     24typedef u64 __nocast cputime64_t;
     25
     26#define cmpxchg_cputime(ptr, old, new) cmpxchg(ptr, old, new)
     27
     28#ifdef __KERNEL__
     29/*
     30 * Convert cputime <-> microseconds
     31 */
     32extern u64 __cputime_usec_factor;
     33
     34static inline unsigned long cputime_to_usecs(const cputime_t ct)
     35{
     36	return mulhdu((__force u64) ct, __cputime_usec_factor);
     37}
     38
     39#define cputime_to_nsecs(cputime) tb_to_ns((__force u64)cputime)
     40
     41/*
     42 * PPC64 uses PACA which is task independent for storing accounting data while
     43 * PPC32 uses struct thread_info, therefore at task switch the accounting data
     44 * has to be populated in the new task
     45 */
     46#ifdef CONFIG_PPC64
     47#define get_accounting(tsk)	(&get_paca()->accounting)
     48#define raw_get_accounting(tsk)	(&local_paca->accounting)
     49static inline void arch_vtime_task_switch(struct task_struct *tsk) { }
     50
     51#else
     52#define get_accounting(tsk)	(&task_thread_info(tsk)->accounting)
     53#define raw_get_accounting(tsk)	get_accounting(tsk)
     54/*
     55 * Called from the context switch with interrupts disabled, to charge all
     56 * accumulated times to the current process, and to prepare accounting on
     57 * the next process.
     58 */
     59static inline void arch_vtime_task_switch(struct task_struct *prev)
     60{
     61	struct cpu_accounting_data *acct = get_accounting(current);
     62	struct cpu_accounting_data *acct0 = get_accounting(prev);
     63
     64	acct->starttime = acct0->starttime;
     65}
     66#endif
     67
     68/*
     69 * account_cpu_user_entry/exit runs "unreconciled", so can't trace,
     70 * can't use get_paca()
     71 */
     72static notrace inline void account_cpu_user_entry(void)
     73{
     74	unsigned long tb = mftb();
     75	struct cpu_accounting_data *acct = raw_get_accounting(current);
     76
     77	acct->utime += (tb - acct->starttime_user);
     78	acct->starttime = tb;
     79}
     80
     81static notrace inline void account_cpu_user_exit(void)
     82{
     83	unsigned long tb = mftb();
     84	struct cpu_accounting_data *acct = raw_get_accounting(current);
     85
     86	acct->stime += (tb - acct->starttime);
     87	acct->starttime_user = tb;
     88}
     89
     90static notrace inline void account_stolen_time(void)
     91{
     92#ifdef CONFIG_PPC_SPLPAR
     93	if (firmware_has_feature(FW_FEATURE_SPLPAR)) {
     94		struct lppaca *lp = local_paca->lppaca_ptr;
     95
     96		if (unlikely(local_paca->dtl_ridx != be64_to_cpu(lp->dtl_idx)))
     97			accumulate_stolen_time();
     98	}
     99#endif
    100}
    101
    102#endif /* __KERNEL__ */
    103#else /* CONFIG_VIRT_CPU_ACCOUNTING_NATIVE */
    104static inline void account_cpu_user_entry(void)
    105{
    106}
    107static inline void account_cpu_user_exit(void)
    108{
    109}
    110static notrace inline void account_stolen_time(void)
    111{
    112}
    113#endif /* CONFIG_VIRT_CPU_ACCOUNTING_NATIVE */
    114#endif /* __POWERPC_CPUTIME_H */