summaryrefslogtreecommitdiffstats
path: root/src/ssx/pgp/pgp_trace.h
blob: 3544ce0a1f1f2b9d56033fa84e0b401d4519e12e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#ifndef __PGP_TRACE_H__
#define __PGP_TRACE_H__

// $Id: pgp_trace.h,v 1.1.1.1 2013/12/11 21:03:22 bcbrock Exp $
// $Source: /afs/awd/projects/eclipz/KnowledgeBase/.cvsroot/eclipz/chips/p8/working/procedures/ssx/pgp/pgp_trace.h,v $
//-----------------------------------------------------------------------------
// *! (C) Copyright International Business Machines Corp. 2013
// *! All Rights Reserved -- Property of IBM
// *! *** IBM Confidential ***
//-----------------------------------------------------------------------------

/// \file pgp_trace.h
/// \brief Implementation of SSX_TRACE macros for PgP
///
/// Kernel and application tracing uses the PBA "OCI Marker Space", a 64KB OCI
/// register space implemented by PBA. When enabled in the PBA, any OCI write
/// transactions of any size are ACK'ed by the PBA and the data is ignored.
/// This creates an OCI transaction record that can be captured by the NHTM
/// for later analysis.
///
/// SSX provides a generic SSX_TRACE() macro that accepts a single
/// parameter. On PgP, valid parameters are integers in the range
/// 0x0,...,0xffff.  The PgP SSX kernel reserves trace addresses
/// 0xe000,...,0xffff for kernel event traces. Applications are free to use
/// the other trace addresses in the range 0x0000,...,0xdfff as they see fit.
///
/// Application tracing is globally disabled by default, and is enabled by
/// defining the switch SSX_TRACE_ENABLE=1.  Kernel event tracing is also
/// globally disabled by default, and is enabled by defining the switch
/// SSX_KERNEL_TRACE_ENABLE=1. Kernel event tracing adds overhead to every
/// interrupt handler and kernel API so should probably remain disabled unless
/// required.
///
/// The Simics PBA model supports trace reporting, either to stdout or to a
/// file. To enable trace reporting set pba->trace_report = 1. To capture
/// traces to a file other than stdout, set pba->trace_file = \<filename\>.  The
/// Simics model understands SSX kernel trace events and produces a readable
/// commentary of kernel traces events - user events will be reported simply
/// as the integer tag.

#include "pgp_common.h"

/// Output an OCI Trace Marker
///
/// See the comments for the file pgp_trace.h

#if SSX_TRACE_ENABLE
#define SSX_TRACE(event) out8(PBA_OCI_MARKER_BASE + (event), 0)
#endif

#if SSX_KERNEL_TRACE_ENABLE

// Note: The *BASE constants are defined in pgp_common.h

#define SSX_KERNEL_TRACE(event) out8(PBA_OCI_MARKER_BASE + (event), 0)

#define SSX_TRACE_THREAD_SLEEP(priority) \
    SSX_KERNEL_TRACE(SSX_TRACE_THREAD_SLEEP_BASE + priority)

#define SSX_TRACE_THREAD_WAKEUP(priority) \
    SSX_KERNEL_TRACE(SSX_TRACE_THREAD_WAKEUP_BASE + priority)

#define SSX_TRACE_THREAD_SEMAPHORE_PEND(priority) \
    SSX_KERNEL_TRACE(SSX_TRACE_THREAD_SEMAPHORE_PEND_BASE + priority)

#define SSX_TRACE_THREAD_SEMAPHORE_POST(priority) \
    SSX_KERNEL_TRACE(SSX_TRACE_THREAD_SEMAPHORE_POST_BASE + priority)

#define SSX_TRACE_THREAD_SEMAPHORE_TIMEOUT(priority) \
    SSX_KERNEL_TRACE(SSX_TRACE_THREAD_SEMAPHORE_TIMEOUT_BASE + priority)

#define SSX_TRACE_THREAD_SUSPENDED(priority) \
    SSX_KERNEL_TRACE(SSX_TRACE_THREAD_SUSPENDED_BASE + priority)

#define SSX_TRACE_THREAD_DELETED(priority) \
    SSX_KERNEL_TRACE(SSX_TRACE_THREAD_DELETED_BASE + priority)

#define SSX_TRACE_THREAD_COMPLETED(priority) \
    SSX_KERNEL_TRACE(SSX_TRACE_THREAD_COMPLETED_BASE + priority)

#define SSX_TRACE_THREAD_MAPPED_RUNNABLE(priority) \
    SSX_KERNEL_TRACE(SSX_TRACE_THREAD_MAPPED_RUNNABLE_BASE + priority)

#define SSX_TRACE_THREAD_MAPPED_SEMAPHORE_PEND(priority) \
    SSX_KERNEL_TRACE(SSX_TRACE_THREAD_MAPPED_SEMAPHORE_PEND_BASE + priority)

#define SSX_TRACE_THREAD_MAPPED_SLEEPING(priority) \
    SSX_KERNEL_TRACE(SSX_TRACE_THREAD_MAPPED_SLEEPING_BASE + priority)

#endif  /* SSX_KERNEL_TRACE_ENABLE */


#ifdef __ASSEMBLER__

// NB: CPP macros are not expanded as arguments to .if in GAS macro
// definitions.  That's why e.g. we have to use _liw instead of _liwa.

#if SSX_KERNEL_TRACE_ENABLE

        .macro  SSX_TRACE_CRITICAL_IRQ_ENTRY, irqreg, scratch
        _liw    \scratch, (PBA_OCI_MARKER_BASE + SSX_TRACE_CRITICAL_IRQ_ENTRY_BASE)
        stbx    \irqreg, \irqreg, \scratch
        eieio
        .endm

        .macro  SSX_TRACE_CRITICAL_IRQ_EXIT, scratch0, scratch1
        _liw    \scratch0, (PBA_OCI_MARKER_BASE + SSX_TRACE_CRITICAL_IRQ_EXIT_BASE)
        mfusprg0 \scratch1
        extrwi  \scratch1, \scratch1, 8, 16
        stbx    \scratch1, \scratch0, \scratch1
        eieio
        .endm

        .macro  SSX_TRACE_NONCRITICAL_IRQ_ENTRY, irqreg, scratch
        _liw    \scratch, (PBA_OCI_MARKER_BASE + SSX_TRACE_NONCRITICAL_IRQ_ENTRY_BASE)
        stbx    \irqreg, \irqreg, \scratch
        eieio
        .endm

        .macro  SSX_TRACE_NONCRITICAL_IRQ_EXIT, scratch0, scratch1
        _liw    \scratch0, (PBA_OCI_MARKER_BASE + SSX_TRACE_NONCRITICAL_IRQ_EXIT_BASE)
        mfusprg0 \scratch1
        extrwi  \scratch1, \scratch1, 8, 16
        stbx    \scratch1, \scratch0, \scratch1
        eieio
        .endm

        .macro  SSX_TRACE_THREAD_SWITCH, priority, scratch
        _liw    \scratch, (PBA_OCI_MARKER_BASE + SSX_TRACE_THREAD_SWITCH_BASE)
        stbx    \priority, \priority, \scratch
        eieio
        .endm

#else  /* SSX_KERNEL_TRACE_ENABLE */

        .macro  SSX_TRACE_CRITICAL_IRQ_ENTRY, irq, scratch
        .endm

        .macro  SSX_TRACE_CRITICAL_IRQ_EXIT, scratch0, scratch1
        .endm

        .macro  SSX_TRACE_NONCRITICAL_IRQ_ENTRY, irq, scratch
        .endm

        .macro  SSX_TRACE_NONCRITICAL_IRQ_EXIT, scratch0, scratch1
        .endm

        .macro  SSX_TRACE_THREAD_SWITCH, priority, scratch
        .endm

#endif  /* SSX_KERNEL_TRACE_ENABLE */
             
#endif  /* __ASSEMBLER__ */

#endif  /* __PGP_TRACE_H__ */
OpenPOWER on IntegriCloud