mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-06-21 13:08:42 +00:00
hv: clean up function definitions in trace.h
seperate the function definitions into debug/release directories to better distinguish debug/release libraries Tracked-On: #861 Signed-off-by: Shiqing Gao <shiqing.gao@intel.com> Acked-by: Eddie Dong <eddie.dong@intel.com>
This commit is contained in:
parent
637326bc6d
commit
079566056a
133
hypervisor/debug/trace.c
Normal file
133
hypervisor/debug/trace.c
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2018 Intel Corporation. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <hypervisor.h>
|
||||||
|
|
||||||
|
#define TRACE_CUSTOM 0xFCU
|
||||||
|
#define TRACE_FUNC_ENTER 0xFDU
|
||||||
|
#define TRACE_FUNC_EXIT 0xFEU
|
||||||
|
#define TRACE_STR 0xFFU
|
||||||
|
|
||||||
|
/* sizeof(trace_entry) == 4 x 64bit */
|
||||||
|
struct trace_entry {
|
||||||
|
uint64_t tsc; /* TSC */
|
||||||
|
uint64_t id:48;
|
||||||
|
uint8_t n_data; /* nr of data in trace_entry */
|
||||||
|
uint8_t cpu; /* pcpu id of trace_entry */
|
||||||
|
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
uint32_t a, b, c, d;
|
||||||
|
} fields_32;
|
||||||
|
struct {
|
||||||
|
uint8_t a1, a2, a3, a4;
|
||||||
|
uint8_t b1, b2, b3, b4;
|
||||||
|
uint8_t c1, c2, c3, c4;
|
||||||
|
uint8_t d1, d2, d3, d4;
|
||||||
|
} fields_8;
|
||||||
|
struct {
|
||||||
|
uint64_t e;
|
||||||
|
uint64_t f;
|
||||||
|
} fields_64;
|
||||||
|
char str[16];
|
||||||
|
} payload;
|
||||||
|
} __attribute__((aligned(8)));
|
||||||
|
|
||||||
|
static inline bool trace_check(uint16_t cpu_id)
|
||||||
|
{
|
||||||
|
if (per_cpu(sbuf, cpu_id)[ACRN_TRACE] == NULL) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void trace_put(uint16_t cpu_id, uint32_t evid, uint32_t n_data, struct trace_entry *entry)
|
||||||
|
{
|
||||||
|
struct shared_buf *sbuf = (struct shared_buf *)
|
||||||
|
per_cpu(sbuf, cpu_id)[ACRN_TRACE];
|
||||||
|
|
||||||
|
entry->tsc = rdtsc();
|
||||||
|
entry->id = evid;
|
||||||
|
entry->n_data = (uint8_t)n_data;
|
||||||
|
entry->cpu = (uint8_t)cpu_id;
|
||||||
|
(void)sbuf_put(sbuf, (uint8_t *)entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TRACE_2L(uint32_t evid, uint64_t e, uint64_t f)
|
||||||
|
{
|
||||||
|
struct trace_entry entry;
|
||||||
|
uint16_t cpu_id = get_cpu_id();
|
||||||
|
|
||||||
|
if (!trace_check(cpu_id)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
entry.payload.fields_64.e = e;
|
||||||
|
entry.payload.fields_64.f = f;
|
||||||
|
trace_put(cpu_id, evid, 2U, &entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TRACE_4I(uint32_t evid, uint32_t a, uint32_t b, uint32_t c, uint32_t d)
|
||||||
|
{
|
||||||
|
struct trace_entry entry;
|
||||||
|
uint16_t cpu_id = get_cpu_id();
|
||||||
|
|
||||||
|
if (!trace_check(cpu_id)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
entry.payload.fields_32.a = a;
|
||||||
|
entry.payload.fields_32.b = b;
|
||||||
|
entry.payload.fields_32.c = c;
|
||||||
|
entry.payload.fields_32.d = d;
|
||||||
|
trace_put(cpu_id, evid, 4U, &entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TRACE_6C(uint32_t evid, uint8_t a1, uint8_t a2, uint8_t a3, uint8_t a4, uint8_t b1, uint8_t b2)
|
||||||
|
{
|
||||||
|
struct trace_entry entry;
|
||||||
|
uint16_t cpu_id = get_cpu_id();
|
||||||
|
|
||||||
|
if (!trace_check(cpu_id)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
entry.payload.fields_8.a1 = a1;
|
||||||
|
entry.payload.fields_8.a2 = a2;
|
||||||
|
entry.payload.fields_8.a3 = a3;
|
||||||
|
entry.payload.fields_8.a4 = a4;
|
||||||
|
entry.payload.fields_8.b1 = b1;
|
||||||
|
entry.payload.fields_8.b2 = b2;
|
||||||
|
/* payload.fields_8.b3/b4 not used, but is put in trace buf */
|
||||||
|
trace_put(cpu_id, evid, 8U, &entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define TRACE_ENTER TRACE_16STR(TRACE_FUNC_ENTER, __func__)
|
||||||
|
#define TRACE_EXIT TRACE_16STR(TRACE_FUNC_EXIT, __func__)
|
||||||
|
|
||||||
|
static inline void TRACE_16STR(uint32_t evid, const char name[])
|
||||||
|
{
|
||||||
|
struct trace_entry entry;
|
||||||
|
uint16_t cpu_id = get_cpu_id();
|
||||||
|
size_t len, i;
|
||||||
|
|
||||||
|
if (!trace_check(cpu_id)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
entry.payload.fields_64.e = 0UL;
|
||||||
|
entry.payload.fields_64.f = 0UL;
|
||||||
|
|
||||||
|
len = strnlen_s(name, 20U);
|
||||||
|
len = (len > 16U) ? 16U : len;
|
||||||
|
for (i = 0U; i < len; i++) {
|
||||||
|
entry.payload.str[i] = name[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
entry.payload.str[15] = 0;
|
||||||
|
trace_put(cpu_id, evid, 16U, &entry);
|
||||||
|
}
|
@ -41,177 +41,8 @@
|
|||||||
|
|
||||||
#define TRACE_VMEXIT_UNHANDLED 0x20000U
|
#define TRACE_VMEXIT_UNHANDLED 0x20000U
|
||||||
|
|
||||||
#ifdef HV_DEBUG
|
void TRACE_2L(uint32_t evid, uint64_t e, uint64_t f);
|
||||||
|
void TRACE_4I(uint32_t evid, uint32_t a, uint32_t b, uint32_t c, uint32_t d);
|
||||||
#include <sbuf.h>
|
void TRACE_6C(uint32_t evid, uint8_t a1, uint8_t a2, uint8_t a3, uint8_t a4, uint8_t b1, uint8_t b2);
|
||||||
|
|
||||||
#define TRACE_CUSTOM 0xFCU
|
|
||||||
#define TRACE_FUNC_ENTER 0xFDU
|
|
||||||
#define TRACE_FUNC_EXIT 0xFEU
|
|
||||||
#define TRACE_STR 0xFFU
|
|
||||||
|
|
||||||
/* sizeof(trace_entry) == 4 x 64bit */
|
|
||||||
struct trace_entry {
|
|
||||||
uint64_t tsc; /* TSC */
|
|
||||||
uint64_t id:48;
|
|
||||||
uint8_t n_data; /* nr of data in trace_entry */
|
|
||||||
uint8_t cpu; /* pcpu id of trace_entry */
|
|
||||||
|
|
||||||
union {
|
|
||||||
struct {
|
|
||||||
uint32_t a, b, c, d;
|
|
||||||
} fields_32;
|
|
||||||
struct {
|
|
||||||
uint8_t a1, a2, a3, a4;
|
|
||||||
uint8_t b1, b2, b3, b4;
|
|
||||||
uint8_t c1, c2, c3, c4;
|
|
||||||
uint8_t d1, d2, d3, d4;
|
|
||||||
} fields_8;
|
|
||||||
struct {
|
|
||||||
uint64_t e;
|
|
||||||
uint64_t f;
|
|
||||||
} fields_64;
|
|
||||||
char str[16];
|
|
||||||
} payload;
|
|
||||||
} __attribute__((aligned(8)));
|
|
||||||
|
|
||||||
static inline bool
|
|
||||||
trace_check(uint16_t cpu_id)
|
|
||||||
{
|
|
||||||
if (per_cpu(sbuf, cpu_id)[ACRN_TRACE] == NULL) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
trace_put(uint16_t cpu_id, uint32_t evid,
|
|
||||||
uint32_t n_data, struct trace_entry *entry)
|
|
||||||
{
|
|
||||||
struct shared_buf *sbuf = (struct shared_buf *)
|
|
||||||
per_cpu(sbuf, cpu_id)[ACRN_TRACE];
|
|
||||||
|
|
||||||
entry->tsc = rdtsc();
|
|
||||||
entry->id = evid;
|
|
||||||
entry->n_data = (uint8_t)n_data;
|
|
||||||
entry->cpu = (uint8_t)cpu_id;
|
|
||||||
(void)sbuf_put(sbuf, (uint8_t *)entry);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
TRACE_2L(uint32_t evid, uint64_t e, uint64_t f)
|
|
||||||
{
|
|
||||||
struct trace_entry entry;
|
|
||||||
uint16_t cpu_id = get_cpu_id();
|
|
||||||
|
|
||||||
if (!trace_check(cpu_id)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
entry.payload.fields_64.e = e;
|
|
||||||
entry.payload.fields_64.f = f;
|
|
||||||
trace_put(cpu_id, evid, 2U, &entry);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
TRACE_4I(uint32_t evid, uint32_t a, uint32_t b, uint32_t c,
|
|
||||||
uint32_t d)
|
|
||||||
{
|
|
||||||
struct trace_entry entry;
|
|
||||||
uint16_t cpu_id = get_cpu_id();
|
|
||||||
|
|
||||||
if (!trace_check(cpu_id)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
entry.payload.fields_32.a = a;
|
|
||||||
entry.payload.fields_32.b = b;
|
|
||||||
entry.payload.fields_32.c = c;
|
|
||||||
entry.payload.fields_32.d = d;
|
|
||||||
trace_put(cpu_id, evid, 4U, &entry);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
TRACE_6C(uint32_t evid, uint8_t a1, uint8_t a2, uint8_t a3,
|
|
||||||
uint8_t a4, uint8_t b1, uint8_t b2)
|
|
||||||
{
|
|
||||||
struct trace_entry entry;
|
|
||||||
uint16_t cpu_id = get_cpu_id();
|
|
||||||
|
|
||||||
if (!trace_check(cpu_id)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
entry.payload.fields_8.a1 = a1;
|
|
||||||
entry.payload.fields_8.a2 = a2;
|
|
||||||
entry.payload.fields_8.a3 = a3;
|
|
||||||
entry.payload.fields_8.a4 = a4;
|
|
||||||
entry.payload.fields_8.b1 = b1;
|
|
||||||
entry.payload.fields_8.b2 = b2;
|
|
||||||
/* payload.fields_8.b3/b4 not used, but is put in trace buf */
|
|
||||||
trace_put(cpu_id, evid, 8U, &entry);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define TRACE_ENTER TRACE_16STR(TRACE_FUNC_ENTER, __func__)
|
|
||||||
#define TRACE_EXIT TRACE_16STR(TRACE_FUNC_EXIT, __func__)
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
TRACE_16STR(uint32_t evid, const char name[])
|
|
||||||
{
|
|
||||||
struct trace_entry entry;
|
|
||||||
uint16_t cpu_id = get_cpu_id();
|
|
||||||
size_t len, i;
|
|
||||||
|
|
||||||
if (!trace_check(cpu_id)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
entry.payload.fields_64.e = 0UL;
|
|
||||||
entry.payload.fields_64.f = 0UL;
|
|
||||||
|
|
||||||
len = strnlen_s(name, 20U);
|
|
||||||
len = (len > 16U) ? 16U : len;
|
|
||||||
for (i = 0U; i < len; i++) {
|
|
||||||
entry.payload.str[i] = name[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
entry.payload.str[15] = 0;
|
|
||||||
trace_put(cpu_id, evid, 16U, &entry);
|
|
||||||
}
|
|
||||||
|
|
||||||
#else /* HV_DEBUG */
|
|
||||||
|
|
||||||
#define TRACE_ENTER
|
|
||||||
#define TRACE_EXIT
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
TRACE_2L(__unused uint32_t evid,
|
|
||||||
__unused uint64_t e,
|
|
||||||
__unused uint64_t f)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
TRACE_4I(__unused uint32_t evid,
|
|
||||||
__unused uint32_t a,
|
|
||||||
__unused uint32_t b,
|
|
||||||
__unused uint32_t c,
|
|
||||||
__unused uint32_t d)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
TRACE_6C(__unused uint32_t evid,
|
|
||||||
__unused uint8_t a1,
|
|
||||||
__unused uint8_t a2,
|
|
||||||
__unused uint8_t a3,
|
|
||||||
__unused uint8_t a4,
|
|
||||||
__unused uint8_t b1,
|
|
||||||
__unused uint8_t b2)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* HV_DEBUG */
|
|
||||||
|
|
||||||
#endif /* TRACE_H */
|
#endif /* TRACE_H */
|
||||||
|
19
hypervisor/release/trace.c
Normal file
19
hypervisor/release/trace.c
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2018 Intel Corporation. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <hypervisor.h>
|
||||||
|
|
||||||
|
void TRACE_2L(__unused uint32_t evid, __unused uint64_t e, __unused uint64_t f) {}
|
||||||
|
|
||||||
|
void TRACE_4I(__unused uint32_t evid, __unused uint32_t a, __unused uint32_t b,
|
||||||
|
__unused uint32_t c, __unused uint32_t d)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void TRACE_6C(__unused uint32_t evid, __unused uint8_t a1, __unused uint8_t a2,
|
||||||
|
__unused uint8_t a3, __unused uint8_t a4, __unused uint8_t b1, __unused uint8_t b2)
|
||||||
|
{
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user