18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci#include <errno.h>
38c2ecf20Sopenharmony_ci#include "perf_regs.h"
48c2ecf20Sopenharmony_ci#include "event.h"
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ciint __weak arch_sdt_arg_parse_op(char *old_op __maybe_unused,
78c2ecf20Sopenharmony_ci				 char **new_op __maybe_unused)
88c2ecf20Sopenharmony_ci{
98c2ecf20Sopenharmony_ci	return SDT_ARG_SKIP;
108c2ecf20Sopenharmony_ci}
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ciuint64_t __weak arch__intr_reg_mask(void)
138c2ecf20Sopenharmony_ci{
148c2ecf20Sopenharmony_ci	return PERF_REGS_MASK;
158c2ecf20Sopenharmony_ci}
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ciuint64_t __weak arch__user_reg_mask(void)
188c2ecf20Sopenharmony_ci{
198c2ecf20Sopenharmony_ci	return PERF_REGS_MASK;
208c2ecf20Sopenharmony_ci}
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ci#ifdef HAVE_PERF_REGS_SUPPORT
238c2ecf20Sopenharmony_ciint perf_reg_value(u64 *valp, struct regs_dump *regs, int id)
248c2ecf20Sopenharmony_ci{
258c2ecf20Sopenharmony_ci	int i, idx = 0;
268c2ecf20Sopenharmony_ci	u64 mask = regs->mask;
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_ci	if (regs->cache_mask & (1ULL << id))
298c2ecf20Sopenharmony_ci		goto out;
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_ci	if (!(mask & (1ULL << id)))
328c2ecf20Sopenharmony_ci		return -EINVAL;
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_ci	for (i = 0; i < id; i++) {
358c2ecf20Sopenharmony_ci		if (mask & (1ULL << i))
368c2ecf20Sopenharmony_ci			idx++;
378c2ecf20Sopenharmony_ci	}
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci	regs->cache_mask |= (1ULL << id);
408c2ecf20Sopenharmony_ci	regs->cache_regs[id] = regs->regs[idx];
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_ciout:
438c2ecf20Sopenharmony_ci	*valp = regs->cache_regs[id];
448c2ecf20Sopenharmony_ci	return 0;
458c2ecf20Sopenharmony_ci}
468c2ecf20Sopenharmony_ci#endif
47