genode/repos/base-linux/include/spec/arm_64/trace/timestamp.h
Norman Feske a4115cfea9 base-linux: discharge timestamp on AARCH64
The kernel-agnostic 'Trace::timestamp' function for arm_64 executes the
'mrs %0, pmccntr_el0' instruction, which is not permitted for user-level
programs on Linux. This patch shadows the generic timestamp.h header
with dummy that returns zero. This return value prompts the timeout
framework to disable the interpolation of time based on timestamps. This
avoid the illegal-instruction abort but comes with two llimitations:

First, time measurements are effectlively limited to a granulariry of 1
millisecond (deliberately constrained by the timer driver).

The quirk is applied when using the base-linux API. Should a generic
application (that uses the base API only) call 'Trace::timestamp'
directly, the illegal instruction is executed.

Issue #4136
2021-05-10 11:17:20 +02:00

35 lines
900 B
C++

/*
* \brief Trace timestamp
* \author Norman Feske
* \date 2021-05-01
*/
/*
* Copyright (C) 2021 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
#ifndef _INCLUDE__SPEC__ARM_64__TRACE__TIMESTAMP_H_
#define _INCLUDE__SPEC__ARM_64__TRACE__TIMESTAMP_H_
#include <base/fixed_stdint.h>
namespace Genode { namespace Trace {
typedef uint64_t Timestamp;
/*
* In Linux/AARCH64, the 'mrs' instruction cannot be executed in user land.
* It triggers the abort of the program with an illegal-instruction
* exception.
*
* By returning 0, we discharge the timestamp-based interpolation of
* 'Timer::Connection::curr_time', falling back to a precision of 1 ms.
*/
inline Timestamp timestamp() { return 0; }
} }
#endif /* _INCLUDE__SPEC__ARM_64__TRACE__TIMESTAMP_H_ */