This chapter documents how to use the pttc tool to generate and run tests. Pttc takes a yasm assembly file and creates a Processor Trace stream from special directives in its input.
$ pttc path/to/file.ptt
If no error occurs, the following files will be generated in the current working directory:
file.lst file.bin file.pt file.exp
The .lst
and .bin
files are generated by a call to yasm. The .pt
file contains the Processor Trace and the .exp
file contains the content of the comments after the .exp
directive.
Pttc prints the filenames of the generated .exp
files to stdout.
Pttc allows annotations in the comments of yasm assembler source files. The parser recognizes all comments that contain the @pt
directive marker.
Every pt directive can be preceded by a label name followed by a colon (:
). Refer to the description of the .exp()
directive below on how to use these labels.
The general syntax for pt directives is as follows:
@pt [label:]directive([arguments])
This section lists the directives that are understood by pttc.
@pt psb() @pt psbend() @pt pad() @pt ovf() @pt stop()
These packets do not have any arguments and correspond to the packets from the specification.
@pt tnt(args) @pt tnt64(args)
The arguments of the tnt and tnt64 packets is a list of Takens t
and Not-Takens n
. For better readability an arbitrary number of blanks and dots can be intervened.
It is an error if no characters, only blanks or dots, or other characters are in the payload. Additionally for the TNT packet and the TNT64 packet it is an error to have more than 6 and more than 47 t‘s or n’s in the payload, respectively.
@pt tip(ipc: addr) @pt tip.pge(ipc: addr) @pt tip.pgd(ipc: addr) @pt fup(ipc: addr)
These packets accept arbitrary addresses. Addr
must be a parsable integer or a valid label name. Ipc
specifies the IP compression bits as integer number.
If addr
is given as a label, the address is truncated according to the IP bytes value given in ipc
. Otherwise the address needs to be a zero-extended integer no bigger than specified in ipc
.
@pt mode.exec(mode) @pt mode.tsx(state)
Mode
must be either 16bit
or 32bit
or 64bit
; state
must be begin
or abort
or commit
.
@pt pip(addr[, nr])
Addr is the value that was written to CR3.
If nr is specified after addr, the non-root bit is set.
@pt tsc(value)
Value is the timestamp.
@pt cbr(value)
Value is the core/bus ratio.
@pt tma(ctc, fc)
Ctc is the 16bit crystal clock component. Fc is the 9bit fast counter component.
@pt mtc(value)
Value is the 8bit crystal clock component.
@pt cyc(value)
Value is the cycle count.
@pt vmcs(value)
Value is the VMCS base address. Beware that only bits 12 to 51 will be used. The rest will be silently ignored.
@pt mnt(value)
Value is the 8-byte packet payload represented as 64-bit little-endian number.
@pt .exp([extra])
Every occurrence of this directive prints all the lines, following this directive, to a file[-extra].exp
.
The first occurrence of this directive stops processing of other directives.
In order to have a valid yasm file, it is necessary to put the expected output into yasm comments (with the semi-colon character (;
)). Any character up to (and including) the semi-colon is not printed to the .exp
file. Trailing white space is removed from each line.
Comments are made with the #
character and go to the end of line. Comments and whitespace before comments are not printed in the .exp
file.
Each line that contains no yasm comment at all is not printed to the exp file. Empty lines can be used to structure the expected output text.
In .exp
files, the address of a yasm label can be substituted using:
%[?0]label[.<number>].
Labels are prefixed with %
, for example, %%label
. A label name can consist of alphanumeric characters and underscores. Labels must be unique. The address of label will be substituted with a hex number including leading 0x
.
Prefixing the label with 0
, for example %0label
, prints the address with leading zeroes using 16 hex digits plus the leading 0x
.
The least significant n
bytes of an address can be masked by appending .n
to the label. For example, %%label.2
with label
= 0xffffff004c
is printed as 0x4c
.
Prefixing the label with ?
in combination with masking replaces the masked out parts with ?
using 16 digits for the address plus the leading 0x
. The remaining number is zero extended. For example, %?label.2
with label
= 0xc0001
is printed as 0x????????????0001
.
The packet number of pt directives can also be substituted in the output. These numbers are printed in decimal. The syntax is as follows:
%label
There is a special label for the byte offset after the last packet: %%eos
.
Labels in sections are relative to the section's vstart address. PTTC also adds the following special section labels:
Beware that PTTC does not support switching back and forth between sections.