ScePaf: Difference between revisions

From Vita Development Wiki
Jump to navigation Jump to search
 
(21 intermediate revisions by 3 users not shown)
Line 1: Line 1:
Much of this page is wrong because much of the PAF is written in C++ but it works as a "function".
Much of this page is wrong because much of the PAF is written in C++ but it works as a "function".
A good resource (to merge here) can be found at [https://github.com/GrapheneCt/ScePaf-headers ScePaf-headers by Graphene].


== Module ==
== Module ==
Line 9: Line 11:
{| class="wikitable"
{| class="wikitable"
|-
|-
! Version !! Name !! World !! Privilege
! Version !! World !! Privilege
|-
|-
| 1.69-3.73 || Non-secure || User
| 1.69-3.740.011 || Non-secure || User
|}
|}


== Libraries ==
== Libraries ==


TOOL version of libpaf module is different from CEX and DEX as it has an additional library: ScePafAutoTestTty. Some TOOL system apps import that library and crash on CEX/DEX systems because of that.
TOOL version of libpaf module is different from CEX and DEX ones as it has an additional library: [[#ScePafAutoTestTty]]. Some TOOL system apps import this library and crash on CEX/DEX systems because of that missing library.


=== Known NIDs ===
=== Known NIDs ===
Line 24: Line 26:
! Version !! Name !! World !! Visibility !! NID
! Version !! Name !! World !! Visibility !! NID
|-
|-
| 3.60 || ScePafLowlayer || Non-secure || User || 0x2342266A
| 3.60 || [[ScePaf#ScePafLowlayer|ScePafLowlayer]] || Non-secure || User || 0x2342266A
|-
|-
| 3.60 || ScePafStdc || Non-secure || User || 0xA7D28DAE
| 3.60 || [[ScePaf#ScePafStdc|ScePafStdc]] || Non-secure || User || 0xA7D28DAE
|-
|-
| 3.60 || ScePafMisc || Non-secure || User || 0x3D643CE8
| 3.60 || [[ScePaf#ScePafMisc|ScePafMisc]] || Non-secure || User || 0x3D643CE8
|-
|-
| 3.60 || ScePafCommon || Non-secure || User || 0x3C1965CD
| 3.60 || [[ScePaf#ScePafCommon|ScePafCommon]] || Non-secure || User || 0x3C1965CD
|-
|-
| 3.60 || ScePafGraphics || Non-secure || User || 0xA070D6A7
| 3.60 || [[ScePaf#ScePafGraphics|ScePafGraphics]] || Non-secure || User || 0xA070D6A7
|-
|-
| 3.60 || ScePafThread || Non-secure || User || 0x54276D19
| 3.60 || [[ScePaf#ScePafThread|ScePafThread]] || Non-secure || User || 0x54276D19
|-
|-
| 3.60 || ScePafResource || Non-secure || User || 0x2836DC9B
| 3.60 || [[ScePaf#ScePafResource|ScePafResource]] || Non-secure || User || 0x2836DC9B
|-
|-
| 3.60 || ScePafToplevel || Non-secure || User || 0x4D9A9DD0
| 3.60 || [[ScePaf#ScePafToplevel|ScePafToplevel]] || Non-secure || User || 0x4D9A9DD0
|-
|-
| 3.60 || ScePafWidget || Non-secure || User || 0x073F8C68
| 3.60 || [[ScePaf#ScePafWidget|ScePafWidget]] || Non-secure || User || 0x073F8C68
|-
|-
| 3.68 TOOL || ScePafAutoTestTty || Non-secure || User || 0xC503BD7C
| 3.68 TOOL || [[ScePaf#ScePafAutoTestTty|ScePafAutoTestTty]] || Non-secure || User || 0xC503BD7C
|}
|}


Line 81: Line 83:
} ScePafHeapOpt;
} ScePafHeapOpt;
</source>
</source>
== ScePafLowlayer ==
== ScePafStdc ==
=== scePafDefaultHeapInfo ===
{| class="wikitable"
|-
! Version !! NID
|-
| 3.60 || 0x261CAF72
|}
<source lang="C">void *scePafDefaultHeapInfo(void);</source>
=== delete ===
{| class="wikitable"
|-
! Version !! NID
|-
| 3.60 || 0x347AFDD9
|}
<source lang="C">void delete(void *ptr);</source>
=== sce_paf_memalign ===
{| class="wikitable"
|-
! Version !! NID
|-
| 3.60 || 0xAA9952E0
|}
<source lang="C">void *sce_paf_memalign(SceSize align, SceSize length);</source>


== ScePafMisc ==
== ScePafMisc ==
=== IsVitaTV ===
{| class="wikitable"
|-
! Version !! NID
|-
| 3.60 || 0xAF4FC3F4
|}
This is a guessed name.


=== scePafGetCurrentClockLocalTime ===
=== scePafGetCurrentClockLocalTime ===
Line 184: Line 230:
<source lang="C">int scePafSha1Result(ScePafSha1Context *context, void *dst);</source>
<source lang="C">int scePafSha1Result(ScePafSha1Context *context, void *dst);</source>


== ScePafStdc ==
== ScePafCommon ==
 
=== scePafCommonCreateStartEventWatchdogThread ===
{| class="wikitable"
|-
! Version !! NID
|-
| 3.60 || 0x6735B503
|}
 
The created thread will run in loop.
 
<source lang="C">int scePafCommonCreateStartEventWatchdogThread(void* eventWatchdogEntry, int unk);</source>


=== scePafDefaultHeapInfo ===
=== scePafCommonFinalizeEventsWatchdogThread ===
{| class="wikitable"
{| class="wikitable"
|-
|-
! Version !! NID
! Version !! NID
|-
|-
| 3.60 || 0x261CAF72
| 3.60 || 0x4A8115D5
|}
|}


<source lang="C">void *scePafDefaultHeapInfo(void);</source>
<source lang="C">int scePafCommonFinalizeEventsWatchdogThread(void* eventWatchdogEntry, int unk);</source>
 
== ScePafGraphics ==


=== delete ===
=== scePafGraphicsUpdateCurrentWave ===
{| class="wikitable"
{| class="wikitable"
|-
|-
! Version !! NID
! Version !! NID
|-
|-
| 3.60 || 0x347AFDD9
| 3.60 || 0x2E30F1B5
|}
|}


<source lang="C">void delete(void *ptr);</source>
This a guessed name.
 
Updates the rendering wave to the wave at the given index.
 
<source lang="C">int scePafGraphicsUpdateCurrentWave(SceUInt32 index, SceFloat32 update_interval);</source>


=== sce_paf_memalign ===
=== scePafGraphicsCurrentWave ===
{| class="wikitable"
{| class="wikitable"
|-
|-
! Version !! NID
! Version !! NID
|-
|-
| 3.60 || 0xAA9952E0
| 3.60 || 0xE71DB07B
|}
|}


<source lang="C">void *sce_paf_memalign(SceSize align, SceSize length);</source>
This a guessed name.
 
<source lang="C">extern SceUInt32 scePafGraphicsCurrentWave;</source>
 
== ScePafThread ==


== ScePafResource ==
== ScePafResource ==
Line 232: Line 300:
<source lang="C">
<source lang="C">
typedef struct ScePafWidgetMainParam {
typedef struct ScePafWidgetMainParam {
ScePafWString name;
ScePafString name;
int unk_08;
int unk_08;
unsigned int id;
unsigned int id;
} ScePafWidgetMainParam;
} ScePafWidgetMainParam;


int scePafResourceSearchIdByName(ScePafWidgetMainParam* widgetToSearchFor, ScePafWidgetMainParam* widgetName);
SceUInt32 scePafResourceSearchIdByName(ScePafWidgetMainParam *widgetToSearchFor, ScePafString *widgetName);
</source>
</source>
== ScePafToplevel ==
<pre>
//ScePafToplevel_F5354FEF
SceInt32 SetInterface(SceUInt32 slot, ScePVoid interfaceTable);
//ScePafToplevel_1DF2C6FD
ScePVoid GetInterface(SceUInt32 slot);
//ScePafToplevel_A5560E60, size of the struct is 0x1C0
void* scePafToplevelInitializeSystemParam(void* pafSystemParam);
//ScePafToplevel_907BA948, fills pafSystemParam with system-specific info to prepare for top level init
void* scePafToplevelSetSystemParam(void* pafSystemParam);
//ScePafToplevel_E2860A99, main init function, buffer size must be 0x7C
void* scePafToplevelInitialize(void* pafInitBuf, void* pafSystemParam);
//ScePafToplevel_3F0DB1BF, name is official
scePafToplevelLoadCommonResourceAsync(void* pafTopLevel, ScePafLoadCRFinishCallback finish_callback);
//ScePafToplevel_400F84CE, size of struct is 0x94
scePafToplevelInitializeResourceInitParam(void* pafRcoParam);
//ScePafToplevel_004D98CC
scePafToplevelAssignResourceName(const char* name);
//ScePafToplevel_F702E40A, name is official
scePafToplevelLoadResourceAsync(void* pafRcoParam, ScePafLoadResourceFinishCallback finish_callback);
//ScePafToplevel_12E33958, thread that calls it becomes locked (does all drawing)
scePafToplevelStartDrawing(void* pafTopLevel);
//ScePafToplevel_9A4B0DC4
scePafTopLevelStopDrawing(void* pafTopLevel);
//ScePafToplevel_32CE0577
scePafTopLevelFinalize(void* pafTopLevel);
//ScePafToplevel_004D98CC, selects from resources registered with scePafToplevelAssignResourceName()
scePafTopLevelSelectResource(const char* resourceName);
//ScePafToplevel_34FE1331, struct size is 0x2C
scePafTopLevelInitializePageData(void* pageData);
//ScePafToplevel_30B442D9
scePafTopLevelLoadPage(void* widgetGroup, ScePafWidgetMainParam* pageParam, void* pageData);
</pre>


== ScePafWidget ==
== ScePafWidget ==
Line 262: Line 379:
|}
|}


Temp wrong name is scePafWidgetCreateNewWidget.
Temp name was scePafWidgetCreateNewWidget.


<source lang="C">
<source lang="C">
Line 309: Line 426:
|}
|}


??? scePafWidgetSetColorEnd ???
A possible name could be scePafWidgetSetColorEnd.


<source lang="C">
<source lang="C">int ScePafWidget_DDB0437F(void *pWidget);</source>
int ScePafWidget_DDB0437F(void *pWidget);
</source>


=== scePafWidgetSetTextOption ===
=== scePafWidgetSetTextOption ===
Line 538: Line 653:
== ScePafAutoTestTty ==
== ScePafAutoTestTty ==


=== ScePafAutoTestTty_9E10E873 ===
=== paf::autotest::Dump ===
{| class="wikitable"
{| class="wikitable"
|-
|-
Line 545: Line 660:
| 3.68 || 0x9E10E873
| 3.68 || 0x9E10E873
|}
|}
Mangled name: _ZN3paf8autotest4DumpENS0_8TestTypeEPKcz.


Can serve both as normal debug printf and also dump some PAF objects as XML. On external version of libpaf this function does nothing because it does not open tty output.
Can serve both as normal debug printf and also dump some PAF objects as XML. On external version of libpaf this function does nothing because it does not open tty output.


<source lang="c++">paf::autotest::Dump(paf::autotest::TestType, char const*, ...);</source>


[[Category:Modules]][[Category:Usermode]]
[[Category:ARM]]
[[Category:Usermode]]
[[Category:Modules]]
[[Category:Library]]

Latest revision as of 23:47, 28 March 2024

Much of this page is wrong because much of the PAF is written in C++ but it works as a "function".

A good resource (to merge here) can be found at ScePaf-headers by Graphene.

Module

ScePaf is a C++ runtime.

This module has many virtual tables that point to exported functions. It would be great to start from marking which function belongs to which vtable. This way we can restore initial class structure.

Version World Privilege
1.69-3.740.011 Non-secure User

Libraries

TOOL version of libpaf module is different from CEX and DEX ones as it has an additional library: #ScePafAutoTestTty. Some TOOL system apps import this library and crash on CEX/DEX systems because of that missing library.

Known NIDs

Version Name World Visibility NID
3.60 ScePafLowlayer Non-secure User 0x2342266A
3.60 ScePafStdc Non-secure User 0xA7D28DAE
3.60 ScePafMisc Non-secure User 0x3D643CE8
3.60 ScePafCommon Non-secure User 0x3C1965CD
3.60 ScePafGraphics Non-secure User 0xA070D6A7
3.60 ScePafThread Non-secure User 0x54276D19
3.60 ScePafResource Non-secure User 0x2836DC9B
3.60 ScePafToplevel Non-secure User 0x4D9A9DD0
3.60 ScePafWidget Non-secure User 0x073F8C68
3.68 TOOL ScePafAutoTestTty Non-secure User 0xC503BD7C

Types

typedef struct ScePafSha1Context { // size is 0x68
	uint32_t h[5];
	char unk[0x54];
} ScePafSha1Context;

typedef struct ScePafDateTime {
  SceDateTime data;
  int data_0x10;
  int data_0x14;
} ScePafDateTime;

typedef struct ScePafHeapContext { // size is 0x60
	void *vtable;
	void *heap;
	void *membase;
	SceSize size;
	char name[0x20];
	SceBool is_import_membase;
	char data_0x30[3];
	int data_0x34;
	SceKernelLwMutexWork lw_mtx;
	SceUID memblk_id;
	int data_0x5C;               // ex:1
} ScePafHeapContext;

typedef struct ScePafHeapOpt { // size is 0x14
	int a1;
	int a2;
	char a3[4];
	int a4;
	int a5;
} ScePafHeapOpt;

ScePafLowlayer

ScePafStdc

scePafDefaultHeapInfo

Version NID
3.60 0x261CAF72
void *scePafDefaultHeapInfo(void);

delete

Version NID
3.60 0x347AFDD9
void delete(void *ptr);

sce_paf_memalign

Version NID
3.60 0xAA9952E0
void *sce_paf_memalign(SceSize align, SceSize length);

ScePafMisc

IsVitaTV

Version NID
3.60 0xAF4FC3F4

This is a guessed name.

scePafGetCurrentClockLocalTime

Version NID
3.60 0x96345146
int scePafGetCurrentClockLocalTime(ScePafDateTime *data);

scePafCreateHeap

Version NID
3.60 0xA2B0BF4D
void scePafCreateHeap(ScePafHeapContext *context, void *membase, SceSize size, const char *name, ScePafHeapOpt *opt);

scePafDeleteHeap

Version NID
3.60 0x25238A3A
void scePafDeleteHeap(ScePafHeapContext *context);

scePafMallocWithContext

Version NID
3.60 0x89A1CE78
void *scePafMallocWithContext(ScePafHeapContext *context, SceSize len);

scePafFreeWithContext

Version NID
3.60 0xCE97B579
void scePafFreeWithContext(ScePafHeapContext *context, void *ptr);

scePafMallocAlignWithContext

Version NID
3.60 0x04716F15
void *scePafMallocAlignWithContext(ScePafHeapContext *context, SceUInt32 align, SceSize len);

scePafReallocWithContext

Version NID
3.60 0x74DB7F5D
void *scePafReallocWithContext(ScePafHeapContext *context, void *ptr, SceSize len);

scePafSha1Init

Version NID
3.60 0xB38C53C0
int scePafSha1Init(ScePafSha1Context *context);

scePafSha1Update

Version NID
3.60 0xE6BB459E
int scePafSha1Update(ScePafSha1Context *context, const void *data, SceSize length);

scePafSha1Result

Version NID
3.60 0xB3BF59FC
int scePafSha1Result(ScePafSha1Context *context, void *dst);

ScePafCommon

scePafCommonCreateStartEventWatchdogThread

Version NID
3.60 0x6735B503

The created thread will run in loop.

int scePafCommonCreateStartEventWatchdogThread(void* eventWatchdogEntry, int unk);

scePafCommonFinalizeEventsWatchdogThread

Version NID
3.60 0x4A8115D5
int scePafCommonFinalizeEventsWatchdogThread(void* eventWatchdogEntry, int unk);

ScePafGraphics

scePafGraphicsUpdateCurrentWave

Version NID
3.60 0x2E30F1B5

This a guessed name.

Updates the rendering wave to the wave at the given index.

int scePafGraphicsUpdateCurrentWave(SceUInt32 index, SceFloat32 update_interval);

scePafGraphicsCurrentWave

Version NID
3.60 0xE71DB07B

This a guessed name.

extern SceUInt32 scePafGraphicsCurrentWave;

ScePafThread

ScePafResource

scePafResourceSearchIdByName

Version NID
3.60 0x5F05DE68

This is a guessed name. Temp name was scePafResourceGetIdByName.

Searches using sha-1.

typedef struct ScePafWidgetMainParam {
	ScePafString name;
	int unk_08;
	unsigned int id;
} ScePafWidgetMainParam;

SceUInt32 scePafResourceSearchIdByName(ScePafWidgetMainParam *widgetToSearchFor, ScePafString *widgetName);

ScePafToplevel

//ScePafToplevel_F5354FEF
SceInt32 SetInterface(SceUInt32 slot, ScePVoid interfaceTable);

//ScePafToplevel_1DF2C6FD
ScePVoid GetInterface(SceUInt32 slot);

//ScePafToplevel_A5560E60, size of the struct is 0x1C0
void* scePafToplevelInitializeSystemParam(void* pafSystemParam);

//ScePafToplevel_907BA948, fills pafSystemParam with system-specific info to prepare for top level init
void* scePafToplevelSetSystemParam(void* pafSystemParam);

//ScePafToplevel_E2860A99, main init function, buffer size must be 0x7C
void* scePafToplevelInitialize(void* pafInitBuf, void* pafSystemParam);

//ScePafToplevel_3F0DB1BF, name is official
scePafToplevelLoadCommonResourceAsync(void* pafTopLevel, ScePafLoadCRFinishCallback finish_callback);

//ScePafToplevel_400F84CE, size of struct is 0x94
scePafToplevelInitializeResourceInitParam(void* pafRcoParam);

//ScePafToplevel_004D98CC
scePafToplevelAssignResourceName(const char* name);

//ScePafToplevel_F702E40A, name is official
scePafToplevelLoadResourceAsync(void* pafRcoParam, ScePafLoadResourceFinishCallback finish_callback);

//ScePafToplevel_12E33958, thread that calls it becomes locked (does all drawing)
scePafToplevelStartDrawing(void* pafTopLevel);

//ScePafToplevel_9A4B0DC4
scePafTopLevelStopDrawing(void* pafTopLevel);

//ScePafToplevel_32CE0577
scePafTopLevelFinalize(void* pafTopLevel);

//ScePafToplevel_004D98CC, selects from resources registered with scePafToplevelAssignResourceName()
scePafTopLevelSelectResource(const char* resourceName);

//ScePafToplevel_34FE1331, struct size is 0x2C
scePafTopLevelInitializePageData(void* pageData);

//ScePafToplevel_30B442D9
scePafTopLevelLoadPage(void* widgetGroup, ScePafWidgetMainParam* pageParam, void* pageData);

ScePafWidget

widget

Type widget ctx size (bytes)
Plane 0x280
Text 0x2D8

scePafWidgetCreateNewTextWidget

Version NID
3.60 0x5C2962E1

Temp name was scePafWidgetCreateNewWidget.

/*
 * a2 is maybe parent widget?
 */
void *scePafWidgetCreateNewTextWidget(void *mem_ptr, void *a2, int a3);

scePafWidgetSetColor

Version NID
3.60 0xCD20EF38
#define SCE_PAF_WIDGET_COLOR_UNKNOWN_1   (1)
#define SCE_PAF_WIDGET_COLOR_TEXT        (2)
#define SCE_PAF_WIDGET_COLOR_TEXT_SHADOW (3)
#define SCE_PAF_WIDGET_COLOR_BACK_BAR    (4)
#define SCE_PAF_WIDGET_COLOR_UNKNOWN_5   (5)

typedef struct ScePafWidgetColor {
  float red;
  float green;
  float blue;
  float alpha;
} ScePafWidgetColor;

/*
 * a2 - set SCE_PAF_WIDGET_COLOR
 * a3 - unknow, set 0
 * a4 - unknow, set 0
 */
int scePafWidgetSetColor(void *pWidget, int a2, int a3, int a4, const ScePafWidgetColor *pColoer);

ScePafWidget_DDB0437F

Version NID
3.60 0xDDB0437F

A possible name could be scePafWidgetSetColorEnd.

int ScePafWidget_DDB0437F(void *pWidget);

scePafWidgetSetTextOption

Version NID
3.60 0xF2A2E2E6
#define SCE_PAF_WIDGET_OPTION_TEXT_BOLD          (0x7)
#define SCE_PAF_WIDGET_OPTION_TEXT_SHADOW        (0xC)
#define SCE_PAF_WIDGET_OPTION_TEXT_EXTERNAL_LINE (0xD)

/*
 * a2 - set SCE_PAF_WIDGET_OPTION_TEXT
 * a3 - unknow, set 0
 * a4 - unknow, set 0
 */
int scePafWidgetSetTextOption(void *pWidget, int a2, int a3, int a4, int enable);

scePafWidgetSetTextOption2

Version NID
3.60 0xCCD58ACB
int scePafWidgetSetTextOption2(void *pWidget, int a2, int a3, int a4);

Example of use

/*
 * Display bar color according to character width?
 * If this function is not used, are all character widths treated as lowercase?
 */
scePafWidgetSetTextOption2(p_widget, 2, 2, 0);

scePafWidgetTypeButton

Version NID
3.60 0xB773464D
const char *scePafWidgetTypeButton(void);

scePafWidgetTypeText

Version NID
3.60 0x723F6A4C
const char *scePafWidgetTypeText(void);

scePafWidgetTypeText2

Version NID
3.60 0x45AA2058

same to scePafWidgetTypeText

const char *scePafWidgetTypeText2(void);

scePafWidgetTypeBusyIndicator1

Version NID
3.60 0xDBCC58BB
const char *scePafWidgetTypeBusyIndicator1(void);

scePafWidgetTypeBusyIndicator2

Version NID
3.60 0x1D1F5BF7

same to scePafWidgetTypeBusyIndicator1

const char *scePafWidgetTypeBusyIndicator2(void);

scePafWidgetCmpTypeBase

Version NID
3.60 0x8EDFDE19
int scePafWidgetCmpTypeBase(void *pWidget, const char *type);

scePafWidgetCmpTypeBusyIndicator

Version NID
3.60 0xB954B379
int scePafWidgetCmpTypeBusyIndicator(void *pWidget, const char *type);

scePafWidgetSetFontSize

Version NID
3.60 0x39B15B98
int scePafWidgetSetFontSize(void *pWidget, float size, int unk, SceSize pos, SceSize len);

Example of use

// Set the font size of the entire text
scePafWidgetSetFontSize(p_widget, 22.0f, 1, 0, 0);

// When changing the font size only for the 7th character from the 4th character of the text
scePafWidgetSetFontSize(p_widget, 22.0f, 1, 4, 3);

scePafWidgetSetPosition

Version NID
3.60 0xE29AB31F

Temp name was scePafWidgetAddWidget.

/*
     x -------------------------------->
    y|---------------------------------|
    ||                |                |
    ||     -x.x       |      +x.x      |
    ||     +y.y       |      +y.y      |
    ||                |                |
    ||----------------0----------------|
    ||                |                |
    ||     -x.x       |      +x.x      |
    ||     -y.y       |      -y.y      |
    ||                |                |
    v|---------------------------------|
*/

typedef struct ScePafWidgetPos {
  float x;      // Distance from display center
  float y;      // Distance from display center
  float z;
  int unk_0x0C; // set 0
} ScePafWidgetPos;

int scePafWidgetSetPosition(void *pWidget, ScePafWidgetPos *pWidgetPos, float a3, int a4, int a5, int a6, int a7, int a8);

Example of use

ScePafWidgetPos widget_pos;
widget_pos.x        = x_pos - (960.0f / 2.0f);
widget_pos.y        = (544.0f / 2.0f) - y_pos;
widget_pos.z        = 0.0f;
widget_pos.unk_0x08 = 0;
scePafWidgetSetPosition(p_widget, &widget_pos, 0.0f, 0, 0x10000, 0, 0, 0);

scePafWidgetSearchWidgetById

Version NID
3.60 0x9D304F4A

Searches the widget corresponding to a2->id from the group of a1 and returns pWidgetCtx if found

typedef struct ScePafWidgetSearchParam {
	void *unk_0;
	unsigned int unk_4;
	void *unk_8;
	unsigned int id;
} ScePafWidgetSearchParam;

void *scePafWidgetSearchWidgetById(void *a1, ScePafWidgetSearchParam *a2, int a3);

scePafWidgetShowBusyIndicator

Version NID
3.60 0x04310E14
void scePafWidgetShowBusyIndicator(void *pWidget);

scePafWidgetHideBusyIndicator

Version NID
3.60 0x73D27A1B
void scePafWidgetHideBusyIndicator(void *pWidget);

ScePafAutoTestTty

paf::autotest::Dump

Version NID
3.68 0x9E10E873

Mangled name: _ZN3paf8autotest4DumpENS0_8TestTypeEPKcz.

Can serve both as normal debug printf and also dump some PAF objects as XML. On external version of libpaf this function does nothing because it does not open tty output.

paf::autotest::Dump(paf::autotest::TestType, char const*, ...);