aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--xen/arch/x86/trace.c18
-rw-r--r--xen/include/asm-x86/hvm/trace.h41
-rw-r--r--xen/include/asm-x86/trace.h10
-rw-r--r--xen/include/xen/trace.h73
4 files changed, 79 insertions, 63 deletions
diff --git a/xen/arch/x86/trace.c b/xen/arch/x86/trace.c
index ddb32202bd..65e66a3280 100644
--- a/xen/arch/x86/trace.c
+++ b/xen/arch/x86/trace.c
@@ -15,9 +15,6 @@ asmlinkage void trace_hypercall(void)
{
struct cpu_user_regs *regs = guest_cpu_user_regs();
- if ( !tb_init_done )
- return;
-
#ifdef __x86_64__
if ( is_pv_32on64_vcpu(current) )
{
@@ -52,9 +49,6 @@ asmlinkage void trace_hypercall(void)
void __trace_pv_trap(int trapnr, unsigned long eip,
int use_error_code, unsigned error_code)
{
- if ( !tb_init_done )
- return;
-
#ifdef __x86_64__
if ( is_pv_32on64_vcpu(current) )
{
@@ -99,9 +93,6 @@ void __trace_pv_page_fault(unsigned long addr, unsigned error_code)
{
unsigned long eip = guest_cpu_user_regs()->eip;
- if ( !tb_init_done )
- return;
-
#ifdef __x86_64__
if ( is_pv_32on64_vcpu(current) )
{
@@ -135,9 +126,6 @@ void __trace_pv_page_fault(unsigned long addr, unsigned error_code)
void __trace_trap_one_addr(unsigned event, unsigned long va)
{
- if ( !tb_init_done )
- return;
-
#ifdef __x86_64__
if ( is_pv_32on64_vcpu(current) )
{
@@ -155,9 +143,6 @@ void __trace_trap_one_addr(unsigned event, unsigned long va)
void __trace_trap_two_addr(unsigned event, unsigned long va1,
unsigned long va2)
{
- if ( !tb_init_done )
- return;
-
#ifdef __x86_64__
if ( is_pv_32on64_vcpu(current) )
{
@@ -185,9 +170,6 @@ void __trace_ptwr_emulation(unsigned long addr, l1_pgentry_t npte)
{
unsigned long eip = guest_cpu_user_regs()->eip;
- if ( !tb_init_done )
- return;
-
/* We have a couple of different modes to worry about:
* - 32-on-32: 32-bit pte, 32-bit virtual addresses
* - pae-on-pae, pae-on-64: 64-bit pte, 32-bit virtual addresses
diff --git a/xen/include/asm-x86/hvm/trace.h b/xen/include/asm-x86/hvm/trace.h
index 54c578f912..04f90e0f98 100644
--- a/xen/include/asm-x86/hvm/trace.h
+++ b/xen/include/asm-x86/hvm/trace.h
@@ -37,6 +37,9 @@ static inline void hvmtrace_vmexit(struct vcpu *v,
unsigned long rip,
unsigned long exit_reason)
{
+ if ( likely(!tb_init_done) )
+ return;
+
#ifdef __x86_64__
if(hvm_long_mode_enabled(v))
{
@@ -50,7 +53,7 @@ static inline void hvmtrace_vmexit(struct vcpu *v,
d.vid = v->vcpu_id;
d.exit_reason = exit_reason;
d.rip = rip;
- trace_var(TRC_HVM_VMEXIT64, 1/*cycles*/, sizeof(d), (unsigned char *)&d);
+ __trace_var(TRC_HVM_VMEXIT64, 1/*cycles*/, sizeof(d), (unsigned char *)&d);
} else {
#endif
struct {
@@ -63,7 +66,7 @@ static inline void hvmtrace_vmexit(struct vcpu *v,
d.vid = v->vcpu_id;
d.exit_reason = exit_reason;
d.eip = rip;
- trace_var(TRC_HVM_VMEXIT, 1/*cycles*/, sizeof(d), (unsigned char *)&d);
+ __trace_var(TRC_HVM_VMEXIT, 1/*cycles*/, sizeof(d), (unsigned char *)&d);
#ifdef __x86_64__
}
#endif
@@ -75,9 +78,13 @@ static inline void hvmtrace_vmentry(struct vcpu *v)
struct {
unsigned did:16, vid:16;
} d;
+
+ if ( likely(!tb_init_done) )
+ return;
+
d.did = v->domain->domain_id;
d.vid = v->vcpu_id;
- trace_var(TRC_HVM_VMENTRY, 1/*cycles*/, sizeof(d), (unsigned char *)&d);
+ __trace_var(TRC_HVM_VMENTRY, 1/*cycles*/, sizeof(d), (unsigned char *)&d);
}
static inline void hvmtrace_msr_read(struct vcpu *v, u32 ecx, u64 msr_content)
@@ -87,11 +94,15 @@ static inline void hvmtrace_msr_read(struct vcpu *v, u32 ecx, u64 msr_content)
u32 ecx;
u64 msr_content;
} d;
+
+ if ( likely(!tb_init_done) )
+ return;
+
d.did = v->domain->domain_id;
d.vid = v->vcpu_id;
d.ecx = ecx;
d.msr_content = msr_content;
- trace_var(TRC_HVM_MSR_READ, 0/*!cycles*/, sizeof(d), (unsigned char *)&d);
+ __trace_var(TRC_HVM_MSR_READ, 0/*!cycles*/, sizeof(d), (unsigned char *)&d);
}
static inline void hvmtrace_msr_write(struct vcpu *v, u32 ecx, u64 msr_content)
@@ -101,16 +112,23 @@ static inline void hvmtrace_msr_write(struct vcpu *v, u32 ecx, u64 msr_content)
u32 ecx;
u64 msr_content;
} d;
+
+ if ( likely(!tb_init_done) )
+ return;
+
d.did = v->domain->domain_id;
d.vid = v->vcpu_id;
d.ecx = ecx;
d.msr_content = msr_content;
- trace_var(TRC_HVM_MSR_WRITE, 0/*!cycles*/,sizeof(d), (unsigned char *)&d);
+ __trace_var(TRC_HVM_MSR_WRITE, 0/*!cycles*/,sizeof(d), (unsigned char *)&d);
}
static inline void hvmtrace_pf_xen(struct vcpu *v, unsigned long va,
u32 error_code)
{
+ if ( likely(!tb_init_done) )
+ return;
+
#ifdef __x86_64__
if(hvm_long_mode_enabled(v))
{
@@ -123,8 +141,8 @@ static inline void hvmtrace_pf_xen(struct vcpu *v, unsigned long va,
d.vid = v->vcpu_id;
d.error_code = error_code;
d.va = va;
- trace_var(TRC_HVM_PF_XEN64, 0/*!cycles*/,sizeof(d),
- (unsigned char *)&d);
+ __trace_var(TRC_HVM_PF_XEN64, 0/*!cycles*/,sizeof(d),
+ (unsigned char *)&d);
} else {
#endif
struct {
@@ -136,7 +154,8 @@ static inline void hvmtrace_pf_xen(struct vcpu *v, unsigned long va,
d.vid = v->vcpu_id;
d.error_code = error_code;
d.va = va;
- trace_var(TRC_HVM_PF_XEN, 0/*!cycles*/,sizeof(d), (unsigned char *)&d);
+ __trace_var(TRC_HVM_PF_XEN, 0/*!cycles*/,sizeof(d),
+ (unsigned char *)&d);
#ifdef __x86_64__
}
#endif
@@ -144,7 +163,7 @@ static inline void hvmtrace_pf_xen(struct vcpu *v, unsigned long va,
#define HVMTRACE_ND(evt, vcpu, count, d1, d2, d3, d4) \
do { \
- if (DO_TRC_HVM_ ## evt) \
+ if ( unlikely(tb_init_done) && DO_TRC_HVM_ ## evt ) \
{ \
struct { \
unsigned did:16, vid:16; \
@@ -156,8 +175,8 @@ static inline void hvmtrace_pf_xen(struct vcpu *v, unsigned long va,
_d.d[1]=(d2); \
_d.d[2]=(d3); \
_d.d[3]=(d4); \
- trace_var(TRC_HVM_ ## evt, 0/*!cycles*/, \
- sizeof(u32)*count+1, (unsigned char *)&_d); \
+ __trace_var(TRC_HVM_ ## evt, 0/*!cycles*/, \
+ sizeof(u32)*count+1, (unsigned char *)&_d); \
} \
} while(0)
diff --git a/xen/include/asm-x86/trace.h b/xen/include/asm-x86/trace.h
index c8b13c4b86..e65b5de6ee 100644
--- a/xen/include/asm-x86/trace.h
+++ b/xen/include/asm-x86/trace.h
@@ -8,7 +8,7 @@ void __trace_pv_trap(int trapnr, unsigned long eip,
static inline void trace_pv_trap(int trapnr, unsigned long eip,
int use_error_code, unsigned error_code)
{
- if ( tb_init_done )
+ if ( unlikely(tb_init_done) )
__trace_pv_trap(trapnr, eip, use_error_code, error_code);
}
@@ -16,14 +16,14 @@ void __trace_pv_page_fault(unsigned long addr, unsigned error_code);
static inline void trace_pv_page_fault(unsigned long addr,
unsigned error_code)
{
- if ( tb_init_done )
+ if ( unlikely(tb_init_done) )
__trace_pv_page_fault(addr, error_code);
}
void __trace_trap_one_addr(unsigned event, unsigned long va);
static inline void trace_trap_one_addr(unsigned event, unsigned long va)
{
- if ( tb_init_done )
+ if ( unlikely(tb_init_done) )
__trace_trap_one_addr(event, va);
}
@@ -32,14 +32,14 @@ void __trace_trap_two_addr(unsigned event, unsigned long va1,
static inline void trace_trap_two_addr(unsigned event, unsigned long va1,
unsigned long va2)
{
- if ( tb_init_done )
+ if ( unlikely(tb_init_done) )
__trace_trap_two_addr(event, va1, va2);
}
void __trace_ptwr_emulation(unsigned long addr, l1_pgentry_t npte);
static inline void trace_ptwr_emulation(unsigned long addr, l1_pgentry_t npte)
{
- if ( tb_init_done )
+ if ( unlikely(tb_init_done) )
__trace_ptwr_emulation(addr, npte);
}
diff --git a/xen/include/xen/trace.h b/xen/include/xen/trace.h
index 7635f2dbf6..c5ce88f7ca 100644
--- a/xen/include/xen/trace.h
+++ b/xen/include/xen/trace.h
@@ -39,7 +39,7 @@ void __trace_var(u32 event, int cycles, int extra, unsigned char *extra_data);
static inline void trace_var(u32 event, int cycles, int extra,
unsigned char *extra_data)
{
- if( unlikely(tb_init_done) )
+ if ( unlikely(tb_init_done) )
__trace_var(event, cycles, extra, extra_data);
}
@@ -49,49 +49,64 @@ static inline void trace_var(u32 event, int cycles, int extra,
trace_var(_e, 1, 0, NULL); \
} while ( 0 )
-#define TRACE_1D(_e,_d) \
+#define TRACE_1D(_e,d1) \
do { \
- u32 _d1; \
- _d1 = _d; \
- trace_var(_e, 1, sizeof(_d1), (unsigned char *)&_d1); \
+ if ( unlikely(tb_init_done) ) \
+ { \
+ u32 _d[1]; \
+ _d[0] = d1; \
+ __trace_var(_e, 1, sizeof(*_d), (unsigned char *)_d); \
+ } \
} while ( 0 )
#define TRACE_2D(_e,d1,d2) \
- do { \
- u32 _d[2]; \
- _d[0]=d1; \
- _d[1]=d2; \
- trace_var(_e, 1, sizeof(*_d)*2, (unsigned char *)_d); \
+ do { \
+ if ( unlikely(tb_init_done) ) \
+ { \
+ u32 _d[2]; \
+ _d[0] = d1; \
+ _d[1] = d2; \
+ __trace_var(_e, 1, sizeof(*_d)*2, (unsigned char *)_d); \
+ } \
} while ( 0 )
#define TRACE_3D(_e,d1,d2,d3) \
do { \
- u32 _d[3]; \
- _d[0]=d1; \
- _d[1]=d2; \
- _d[2]=d3; \
- trace_var(_e, 1, sizeof(*_d)*3, (unsigned char *)_d); \
+ if ( unlikely(tb_init_done) ) \
+ { \
+ u32 _d[3]; \
+ _d[0] = d1; \
+ _d[1] = d2; \
+ _d[2] = d3; \
+ __trace_var(_e, 1, sizeof(*_d)*3, (unsigned char *)_d); \
+ } \
} while ( 0 )
#define TRACE_4D(_e,d1,d2,d3,d4) \
do { \
- u32 _d[4]; \
- _d[0]=d1; \
- _d[1]=d2; \
- _d[2]=d3; \
- _d[3]=d4; \
- trace_var(_e, 1, sizeof(*_d)*4, (unsigned char *)_d); \
+ if ( unlikely(tb_init_done) ) \
+ { \
+ u32 _d[4]; \
+ _d[0] = d1; \
+ _d[1] = d2; \
+ _d[2] = d3; \
+ _d[3] = d4; \
+ __trace_var(_e, 1, sizeof(*_d)*4, (unsigned char *)_d); \
+ } \
} while ( 0 )
#define TRACE_5D(_e,d1,d2,d3,d4,d5) \
- do { \
- u32 _d[5]; \
- _d[0]=d1; \
- _d[1]=d2; \
- _d[2]=d3; \
- _d[3]=d4; \
- _d[4]=d5; \
- trace_var(_e, 1, sizeof(*_d)*5, (unsigned char *)_d); \
+ do { \
+ if ( unlikely(tb_init_done) ) \
+ { \
+ u32 _d[5]; \
+ _d[0] = d1; \
+ _d[1] = d2; \
+ _d[2] = d3; \
+ _d[3] = d4; \
+ _d[4] = d5; \
+ __trace_var(_e, 1, sizeof(*_d)*5, (unsigned char *)_d); \
+ } \
} while ( 0 )
#endif /* __XEN_TRACE_H__ */