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

delay.c (1022B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * Copyright (C) 2011 Richard Weinberger <richrd@nod.at>
      4 * Mostly copied from arch/x86/lib/delay.c
      5 */
      6
      7#include <linux/export.h>
      8#include <linux/kernel.h>
      9#include <linux/delay.h>
     10#include <asm/param.h>
     11
     12void __delay(unsigned long loops)
     13{
     14	asm volatile(
     15		"test %0,%0\n"
     16		"jz 3f\n"
     17		"jmp 1f\n"
     18
     19		".align 16\n"
     20		"1: jmp 2f\n"
     21
     22		".align 16\n"
     23		"2: dec %0\n"
     24		" jnz 2b\n"
     25		"3: dec %0\n"
     26
     27		: /* we don't need output */
     28		: "a" (loops)
     29	);
     30}
     31EXPORT_SYMBOL(__delay);
     32
     33inline void __const_udelay(unsigned long xloops)
     34{
     35	int d0;
     36
     37	xloops *= 4;
     38	asm("mull %%edx"
     39		: "=d" (xloops), "=&a" (d0)
     40		: "1" (xloops), "0"
     41		(loops_per_jiffy * (HZ/4)));
     42
     43	__delay(++xloops);
     44}
     45EXPORT_SYMBOL(__const_udelay);
     46
     47void __udelay(unsigned long usecs)
     48{
     49	__const_udelay(usecs * 0x000010c7); /* 2**32 / 1000000 (rounded up) */
     50}
     51EXPORT_SYMBOL(__udelay);
     52
     53void __ndelay(unsigned long nsecs)
     54{
     55	__const_udelay(nsecs * 0x00005); /* 2**32 / 1000000000 (rounded up) */
     56}
     57EXPORT_SYMBOL(__ndelay);