xref: /aosp_15_r20/external/vixl/doc/aarch64/topics/state-trace.md (revision f5c631da2f1efdd72b5fd1e20510e4042af13d77)
1*f5c631daSSadaf EbrahimiAArch64 Simulator state trace
2*f5c631daSSadaf Ebrahimi=============================
3*f5c631daSSadaf Ebrahimi
4*f5c631daSSadaf EbrahimiThe AArch64 Simulator can be configured to produce traces of instruction
5*f5c631daSSadaf Ebrahimiexecution, register contents, and memory accesses. The trace is designed to be
6*f5c631daSSadaf Ebrahimiintuitive for human readers, but this document describes the format of the
7*f5c631daSSadaf Ebrahimitrace, so that post-processing tools can confidently parse the output.
8*f5c631daSSadaf Ebrahimi
9*f5c631daSSadaf EbrahimiIn VIXL's own test runner, the trace is controlled by the `--trace*` options.
10*f5c631daSSadaf EbrahimiRun `test-runner --help` for details.
11*f5c631daSSadaf Ebrahimi
12*f5c631daSSadaf EbrahimiBasic structure
13*f5c631daSSadaf Ebrahimi---------------
14*f5c631daSSadaf Ebrahimi
15*f5c631daSSadaf EbrahimiExecuted instructions show the address, the encoding of the instruction and the
16*f5c631daSSadaf Ebrahimidisassembly (as produced by VIXL's Disassembler). For example:
17*f5c631daSSadaf Ebrahimi
18*f5c631daSSadaf Ebrahimi    0x00007fbe2a6a9044  d299d200		mov x0, #0xce90
19*f5c631daSSadaf Ebrahimi
20*f5c631daSSadaf EbrahimiThe first field is the address of the instruction, with exactly 16 hexadecimal
21*f5c631daSSadaf Ebrahimicharacters and a leading 0x, and is followed by two spaces. The second field is
22*f5c631daSSadaf Ebrahimithe instruction encoding, with exactly eight hexadecimal characters (and no
23*f5c631daSSadaf Ebrahimileading 0x). This is followed by two _tab_ characters, and the instruction
24*f5c631daSSadaf Ebrahimidisassembly. The following regular expression can be used to capture each field:
25*f5c631daSSadaf Ebrahimi
26*f5c631daSSadaf Ebrahimi    (0x[0-9a-f]{16})  ([0-9a-f]{8})\t\t(.*)
27*f5c631daSSadaf Ebrahimi
28*f5c631daSSadaf EbrahimiFollowing each instruction are zero or more lines of state update. Most notably,
29*f5c631daSSadaf Ebrahimithese represent the register state updates and memory accesses that occurred
30*f5c631daSSadaf Ebrahimiduring simulation of the instruction. All of these lines begin with a '#'
31*f5c631daSSadaf Ebrahimicharacter, so that they can be easily identified, and filtered if necessary. For
32*f5c631daSSadaf Ebrahimiexample:
33*f5c631daSSadaf Ebrahimi
34*f5c631daSSadaf Ebrahimi    0x00007fd2221c907c  8b82200e		add x14, x0, x2, asr #8
35*f5c631daSSadaf Ebrahimi    #            x14: 0xfffedcba98765432
36*f5c631daSSadaf Ebrahimi    0x00007fd2221c9080  0b81200f		add w15, w0, w1, asr #8
37*f5c631daSSadaf Ebrahimi    #            w15:         0xff89abcd
38*f5c631daSSadaf Ebrahimi
39*f5c631daSSadaf EbrahimiNote that the Simulator uses these state update lines to describe its initial
40*f5c631daSSadaf Ebrahimistate. As a result, there will be state trace output before the first simulated
41*f5c631daSSadaf Ebrahimiinstruction, and parsers need to be tolerant of this.
42*f5c631daSSadaf Ebrahimi
43*f5c631daSSadaf EbrahimiNote that padding white space is used liberally to keep values vertically
44*f5c631daSSadaf Ebrahimialigned throughout the trace (as shown with the write to `w15` in the example
45*f5c631daSSadaf Ebrahimiabove). Similarly, some compound values are split into parts using the C++14
46*f5c631daSSadaf Ebrahimiliteral separator (`'`) character. Refer to the "Memory accesses" section
47*f5c631daSSadaf Ebrahimi(below) for examples.
48*f5c631daSSadaf Ebrahimi
49*f5c631daSSadaf EbrahimiOrdering
50*f5c631daSSadaf Ebrahimi--------
51*f5c631daSSadaf Ebrahimi
52*f5c631daSSadaf EbrahimiVIXL guarantees that each instruction is printed before its associated state
53*f5c631daSSadaf Ebrahimitrace.
54*f5c631daSSadaf Ebrahimi
55*f5c631daSSadaf EbrahimiState trace must be interpreted sequentially, line by line. VIXL avoids updating
56*f5c631daSSadaf Ebrahimithe same register more than once (because it makes the trace hard for humans to
57*f5c631daSSadaf Ebrahimiread), but this can occur in some situations, and should be supported by
58*f5c631daSSadaf Ebrahimiparsers.
59*f5c631daSSadaf Ebrahimi
60*f5c631daSSadaf EbrahimiThe state is intended to be consistent with architectural execution at the start
61*f5c631daSSadaf Ebrahimiof each instruction and at the end of the whole trace, but no such guarantees
62*f5c631daSSadaf Ebrahimiare made about the traced state _between_ instructions. VIXL prioritises
63*f5c631daSSadaf Ebrahimihuman-readability when choosing the ordering of state updates.
64*f5c631daSSadaf Ebrahimi
65*f5c631daSSadaf EbrahimiIf simulated registers are modified externally, for example using
66*f5c631daSSadaf Ebrahimi`WriteRegister` from C++ code, their state will (by default) be logged
67*f5c631daSSadaf Ebrahimiimmediately. In the full trace, it will appear as though the (runtime) call or
68*f5c631daSSadaf Ebrahimireturn instruction modified the state. This is consistent with the guarantees
69*f5c631daSSadaf Ebrahimiabove, but it can result in single instructions appearing to generate a large
70*f5c631daSSadaf Ebrahiminumber of state updates.
71*f5c631daSSadaf Ebrahimi
72*f5c631daSSadaf EbrahimiThere is no upper limit on the number of state update lines that any one
73*f5c631daSSadaf Ebrahimiinstruction can generate.
74*f5c631daSSadaf Ebrahimi
75*f5c631daSSadaf EbrahimiWhole register trace
76*f5c631daSSadaf Ebrahimi--------------------
77*f5c631daSSadaf Ebrahimi
78*f5c631daSSadaf EbrahimiThe simplest form of state trace has the form "`REG: VALUE`", meaning that
79*f5c631daSSadaf Ebrahimithe register `REG` has the specified value, and any high-order bits in aliased
80*f5c631daSSadaf Ebrahimiregisters are set to zero.
81*f5c631daSSadaf Ebrahimi
82*f5c631daSSadaf Ebrahimi    0x00007fd2221c907c  8b82200e		add x14, x0, x2, asr #8
83*f5c631daSSadaf Ebrahimi    #            x14: 0xfffedcba98765432
84*f5c631daSSadaf Ebrahimi
85*f5c631daSSadaf EbrahimiNote that to correctly track state, parsers need to be aware of architectural
86*f5c631daSSadaf Ebrahimiregister aliasing rules. Also, VIXL uses some standard register aliases, such as
87*f5c631daSSadaf Ebrahimi`lr` (`x30`). To avoid misinterpreting a register alias (and thereby potentially
88*f5c631daSSadaf Ebrahimimissing an aliased register update), some tools may need to treat an
89*f5c631daSSadaf Ebrahimiunrecognised register name as an error.
90*f5c631daSSadaf Ebrahimi
91*f5c631daSSadaf EbrahimiThis trace format attempts to represent _architectural_ register writes.
92*f5c631daSSadaf EbrahimiHowever, this is not strictly checked or enforced.
93*f5c631daSSadaf Ebrahimi
94*f5c631daSSadaf Ebrahimi`VALUE` is always shown in hexadecimal (raw bits) form, with a leading `0x` and
95*f5c631daSSadaf Ebrahimienough digits to exactly fill `REG`. `VALUE` may also include annotations (for
96*f5c631daSSadaf Ebrahimiexample to show FP arithmetic values) in parentheses. These annotations are for
97*f5c631daSSadaf Ebrahimithe benefit of human readers, and parsers may ignore them.
98*f5c631daSSadaf Ebrahimi
99*f5c631daSSadaf EbrahimiNote that SVE registers _always_ use the partial register trace format,
100*f5c631daSSadaf Ebrahimidescribed below, so a plain `z` or `p` register will never be used in a whole
101*f5c631daSSadaf Ebrahimiregister trace. This is true even if the vector length is configured to 16
102*f5c631daSSadaf Ebrahimibytes.
103*f5c631daSSadaf Ebrahimi
104*f5c631daSSadaf EbrahimiPartial register trace
105*f5c631daSSadaf Ebrahimi----------------------
106*f5c631daSSadaf Ebrahimi
107*f5c631daSSadaf EbrahimiSometimes, VIXL needs to show _part_ of a register without implying that the
108*f5c631daSSadaf Ebrahimirest of the register is zeroed. A partial register value is indicated by a bit
109*f5c631daSSadaf Ebrahimirange in angled brackets after the register name: "`REG<MSB:LSB>: VALUE`".
110*f5c631daSSadaf EbrahimiThis format is used for stores, for example.
111*f5c631daSSadaf Ebrahimi
112*f5c631daSSadaf EbrahimiSVE register updates are split across multiple lines, and therefore always use
113*f5c631daSSadaf Ebrahimithe partial register trace format. For example (with a 384-bit VL):
114*f5c631daSSadaf Ebrahimi
115*f5c631daSSadaf Ebrahimi    0x00007fb1978da044  04214000		index z0.b, #0, #1
116*f5c631daSSadaf Ebrahimi    #   z0<383:256>: 0x2f2e2d2c2b2a29282726252423222120
117*f5c631daSSadaf Ebrahimi    #   z0<255:128>: 0x1f1e1d1c1b1a19181716151413121110
118*f5c631daSSadaf Ebrahimi    #     z0<127:0>: 0x0f0e0d0c0b0a09080706050403020100
119*f5c631daSSadaf Ebrahimi
120*f5c631daSSadaf EbrahimiNote that VIXL will omit whole lines where they are unnecessary, for example if
121*f5c631daSSadaf Ebrahimithey have no active (predicated) lanes. Parsers should not assume that every
122*f5c631daSSadaf Ebrahimipart of a register will appear in such cases.
123*f5c631daSSadaf Ebrahimi
124*f5c631daSSadaf EbrahimiThe `VALUE` has the same format as in the whole register trace, except in the
125*f5c631daSSadaf Ebrahimicase of SVE `p` registers (as described below).
126*f5c631daSSadaf Ebrahimi
127*f5c631daSSadaf EbrahimiSVE `p` registers
128*f5c631daSSadaf Ebrahimi-----------------
129*f5c631daSSadaf Ebrahimi
130*f5c631daSSadaf EbrahimiFor `p` registers, we try to keep the lanes vertically aligned with the
131*f5c631daSSadaf Ebrahimicorresponding parts of the `z` registers that they affect. To do this, we use a
132*f5c631daSSadaf Ebrahimibinary format, with a leading `0b`, and spaces between each digit. For example:
133*f5c631daSSadaf Ebrahimi
134*f5c631daSSadaf Ebrahimi    0x00007f66e539b0b8  04f54607		index z7.d, x16, #-11
135*f5c631daSSadaf Ebrahimi    #     z7<127:0>: 0x00000000000000150000000000000020
136*f5c631daSSadaf Ebrahimi    0x00007f66e539b0bc  25d8e3a7		ptrue p7.d, all
137*f5c631daSSadaf Ebrahimi    #      p7<15:0>: 0b 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1
138*f5c631daSSadaf Ebrahimi
139*f5c631daSSadaf EbrahimiMemory accesses
140*f5c631daSSadaf Ebrahimi---------------
141*f5c631daSSadaf Ebrahimi
142*f5c631daSSadaf EbrahimiThe pattern for a memory access is "`VALUE OP ADDRESS`", where:
143*f5c631daSSadaf Ebrahimi
144*f5c631daSSadaf Ebrahimi- `VALUE` is a hexadecimal value, with visual separators (') between
145*f5c631daSSadaf Ebrahimi  structure components,
146*f5c631daSSadaf Ebrahimi- `OP` is `"->"` for a store, or `"<-"` for a load,
147*f5c631daSSadaf Ebrahimi- `ADDRESS` is the (hexadecimal) address of the access.
148*f5c631daSSadaf Ebrahimi
149*f5c631daSSadaf EbrahimiAccesses shown in this style are always contiguous, and with little-endian
150*f5c631daSSadaf Ebrahimisemantics. However, a given instruction might have multiple lines of memory
151*f5c631daSSadaf Ebrahimiaccess trace, particularly if the instruction performs non-contiguous accesses.
152*f5c631daSSadaf Ebrahimi
153*f5c631daSSadaf EbrahimiIn the case of simple accesses, the `VALUE` is shared with register value trace:
154*f5c631daSSadaf Ebrahimi
155*f5c631daSSadaf Ebrahimi    0x00007f3835372058  e400e401		st1b { z1.b }, p1, [x0]
156*f5c631daSSadaf Ebrahimi    #      z1<127:0>: 0xd4d7dadde0e3e6e9eceff2f5f8fbfe01 -> 0x000055d170298e90
157*f5c631daSSadaf Ebrahimi
158*f5c631daSSadaf EbrahimiSign-extending loads show the whole resulting register value, with the (smaller)
159*f5c631daSSadaf Ebrahimiaccess represented on a separate line. This makes the (differing) values in the
160*f5c631daSSadaf Ebrahimiregister and in memory unambiguous, without parsers needing to understand the
161*f5c631daSSadaf Ebrahimiinstruction set:
162*f5c631daSSadaf Ebrahimi
163*f5c631daSSadaf Ebrahimi    0x00007f47922d0068  79800306		ldrsh x6, [x24]
164*f5c631daSSadaf Ebrahimi    #             x6: 0xffffffffffff8080
165*f5c631daSSadaf Ebrahimi    #                                  ╙─ 0x8080 <- 0x00007fffbc197708
166*f5c631daSSadaf Ebrahimi
167*f5c631daSSadaf EbrahimiSome instructions access several different memory locations. In these cases,
168*f5c631daSSadaf Ebrahimieach access is given its own line, with the highest lane index first so that
169*f5c631daSSadaf Ebrahimi(for contiguous accesses) the lowest address ends up at the bottom:
170*f5c631daSSadaf Ebrahimi
171*f5c631daSSadaf Ebrahimi    0x00007fa6001e9060  e4217c0a		st2b { z10.b, z11.b }, p7, [x0, x1]
172*f5c631daSSadaf Ebrahimi    #     z10<127:0>: 0x0f0e0d0c0b0a09080706050403020100
173*f5c631daSSadaf Ebrahimi    #     z11<127:0>: 0x1f1e1d1c1b1a19181716151413121110
174*f5c631daSSadaf Ebrahimi    #                    ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ╙─ 0x10'00 -> 0x00007ffe485d2f90
175*f5c631daSSadaf Ebrahimi    #                    ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ╙─── 0x11'01 -> 0x00007ffe485d2f92
176*f5c631daSSadaf Ebrahimi    #                    ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ╙───── 0x12'02 -> 0x00007ffe485d2f94
177*f5c631daSSadaf Ebrahimi    #                    ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ╙─────── 0x13'03 -> 0x00007ffe485d2f96
178*f5c631daSSadaf Ebrahimi    #                    ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ╙───────── 0x14'04 -> 0x00007ffe485d2f98
179*f5c631daSSadaf Ebrahimi    #                    ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ╙─────────── 0x15'05 -> 0x00007ffe485d2f9a
180*f5c631daSSadaf Ebrahimi    #                    ║ ║ ║ ║ ║ ║ ║ ║ ║ ╙───────────── 0x16'06 -> 0x00007ffe485d2f9c
181*f5c631daSSadaf Ebrahimi    #                    ║ ║ ║ ║ ║ ║ ║ ║ ╙─────────────── 0x17'07 -> 0x00007ffe485d2f9e
182*f5c631daSSadaf Ebrahimi    #                    ║ ║ ║ ║ ║ ║ ║ ╙───────────────── 0x18'08 -> 0x00007ffe485d2fa0
183*f5c631daSSadaf Ebrahimi    #                    ║ ║ ║ ║ ║ ║ ╙─────────────────── 0x19'09 -> 0x00007ffe485d2fa2
184*f5c631daSSadaf Ebrahimi    #                    ║ ║ ║ ║ ║ ╙───────────────────── 0x1a'0a -> 0x00007ffe485d2fa4
185*f5c631daSSadaf Ebrahimi    #                    ║ ║ ║ ║ ╙─────────────────────── 0x1b'0b -> 0x00007ffe485d2fa6
186*f5c631daSSadaf Ebrahimi    #                    ║ ║ ║ ╙───────────────────────── 0x1c'0c -> 0x00007ffe485d2fa8
187*f5c631daSSadaf Ebrahimi    #                    ║ ║ ╙─────────────────────────── 0x1d'0d -> 0x00007ffe485d2faa
188*f5c631daSSadaf Ebrahimi    #                    ║ ╙───────────────────────────── 0x1e'0e -> 0x00007ffe485d2fac
189*f5c631daSSadaf Ebrahimi    #                    ╙─────────────────────────────── 0x1f'0f -> 0x00007ffe485d2fae
190*f5c631daSSadaf Ebrahimi
191*f5c631daSSadaf EbrahimiThe line-drawing characters are encoded as UTF-8 (as is this document). There is
192*f5c631daSSadaf Ebrahimicurrently no locale handling in VIXL, so this is not configurable. However,
193*f5c631daSSadaf Ebrahimisince these annotations are for the benefit of human readers, parsers can safely
194*f5c631daSSadaf Ebrahimiignore them, and treat the whole trace as an ASCII byte stream (ignoring 8-bit
195*f5c631daSSadaf Ebrahimicharacters). This is useful in situations where UTF-8 handling carries an
196*f5c631daSSadaf Ebrahimiunacceptable performance cost.
197*f5c631daSSadaf Ebrahimi
198*f5c631daSSadaf EbrahimiIn the future, VIXL may offer an option to avoid printing these annotations, so
199*f5c631daSSadaf Ebrahimithat the trace is restricted to single-byte characters.
200*f5c631daSSadaf Ebrahimi
201*f5c631daSSadaf EbrahimiFloating-point value annotations
202*f5c631daSSadaf Ebrahimi--------------------------------
203*f5c631daSSadaf Ebrahimi
204*f5c631daSSadaf EbrahimiSome floating-point operations produce register trace that annotates the raw
205*f5c631daSSadaf Ebrahimivalues with the corresponding FP arithmetic values. This is for the benefit of
206*f5c631daSSadaf Ebrahimihuman readers (and has limited precision). Such annotations follow the `VALUE`
207*f5c631daSSadaf Ebrahimiin parentheses.
208*f5c631daSSadaf Ebrahimi
209*f5c631daSSadaf EbrahimiScalar form:
210*f5c631daSSadaf Ebrahimi
211*f5c631daSSadaf Ebrahimi    #             s1:                         0x3f800000 (1.000) <- 0x00007ffdc64d2314
212*f5c631daSSadaf Ebrahimi
213*f5c631daSSadaf EbrahimiVector form, updating all S lanes using a load:
214*f5c631daSSadaf Ebrahimi
215*f5c631daSSadaf Ebrahimi    #            v16: 0x1211100f0e0d0c0b0a09080706050403 (4.577e-28, 1.739e-30, 6.598e-33, 2.502e-35)
216*f5c631daSSadaf Ebrahimi    #                          ║       ║       ║       ╙─ 0x06050403 <- 0x00007ffe56fd7863
217*f5c631daSSadaf Ebrahimi    #                          ║       ║       ╙───────── 0x0a090807 <- 0x00007ffe56fd7867
218*f5c631daSSadaf Ebrahimi    #                          ║       ╙───────────────── 0x0e0d0c0b <- 0x00007ffe56fd786b
219*f5c631daSSadaf Ebrahimi    #                          ╙───────────────────────── 0x1211100f <- 0x00007ffe56fd786f
220*f5c631daSSadaf Ebrahimi
221*f5c631daSSadaf EbrahimiVector form, updating a single S lane using a load:
222*f5c631daSSadaf Ebrahimi
223*f5c631daSSadaf Ebrahimi    #             v2: 0x03020100040302017ff0f0027f80f000 (..., 1.540e-36, ...)
224*f5c631daSSadaf Ebrahimi    #                                  ╙───────────────── 0x04030201 <- 0x00007ffc7b2e3ca1
225*f5c631daSSadaf Ebrahimi
226*f5c631daSSadaf EbrahimiVector form, replicating a single struct load to all S lanes:
227*f5c631daSSadaf Ebrahimi
228*f5c631daSSadaf Ebrahimi    #            v15: 0x100f0e0d100f0e0d100f0e0d100f0e0d (2.821e-29, 2.821e-29, 2.821e-29, 2.821e-29)
229*f5c631daSSadaf Ebrahimi    #            v16: 0x14131211141312111413121114131211 (7.425e-27, 7.425e-27, 7.425e-27, 7.425e-27)
230*f5c631daSSadaf Ebrahimi    #            v17: 0x18171615181716151817161518171615 (1.953e-24, 1.953e-24, 1.953e-24, 1.953e-24)
231*f5c631daSSadaf Ebrahimi    #                          ╙───────╨───────╨───────╨─ 0x18171615'14131211'100f0e0d <- 0x00007ffdd64d847d
232