mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-01-24 13:56:33 +02:00
05115a77e0
So far, AV_READ_TIME would return the cycle counter. This posed two problems: 1) On recent systems, it would just raise an illegal instruction exception. Indeed RDCYCLE is blocked in user space to ward off some side channel attacks. In particular, this would cause the random number generator to crash. 2) It does not match the x86 behaviour and the apparent original intent of AV_READ_TIME in the functional code base (outside test cases). So this replaces the cycle counter with the time counter. The unit is a platform-dependent constant fraction of time, and the value should be stable across harts (RISC-V lingo for physical CPU thread).
54 lines
1.4 KiB
C
54 lines
1.4 KiB
C
/*
|
|
* This file is part of FFmpeg.
|
|
*
|
|
* FFmpeg is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* FFmpeg is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with FFmpeg; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
#ifndef AVUTIL_RISCV_TIMER_H
|
|
#define AVUTIL_RISCV_TIMER_H
|
|
|
|
#include "config.h"
|
|
|
|
#if HAVE_INLINE_ASM
|
|
#include <stdint.h>
|
|
|
|
static inline uint64_t ff_read_time(void)
|
|
{
|
|
#if (__riscv_xlen >= 64)
|
|
uintptr_t cycles;
|
|
|
|
__asm__ volatile ("rdtime %0" : "=r" (cycles));
|
|
|
|
#else
|
|
uint64_t cycles;
|
|
uint32_t hi, lo, check;
|
|
|
|
__asm__ volatile (
|
|
"1: rdtimeh %0\n"
|
|
" rdtime %1\n"
|
|
" rdtimeh %2\n"
|
|
" bne %0, %2, 1b\n" : "=r" (hi), "=r" (lo), "=r" (check));
|
|
|
|
cycles = (((uint64_t)hi) << 32) | lo;
|
|
|
|
#endif
|
|
return cycles;
|
|
}
|
|
|
|
#define AV_READ_TIME ff_read_time
|
|
|
|
#endif
|
|
#endif /* AVUTIL_RISCV_TIMER_H */
|