€•„EŒsphinx.addnodes”Œdocument”“”)”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)”}”(hhh]”(hŒ pending_xref”“”)”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…””}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ$/translations/zh_CN/arch/powerpc/htm”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)”}”(hhh]”hŒChinese (Traditional)”…””}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ$/translations/zh_TW/arch/powerpc/htm”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ$/translations/it_IT/arch/powerpc/htm”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ$/translations/ja_JP/arch/powerpc/htm”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ$/translations/ko_KR/arch/powerpc/htm”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒSpanish”…””}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ$/translations/sp_SP/arch/powerpc/htm”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒcomment”“”)”}”(hŒ SPDX-License-Identifier: GPL-2.0”h]”hŒ SPDX-License-Identifier: GPL-2.0”…””}”hh£sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1h¡hhhžhhŸŒ>/var/lib/git/docbuild/linux/Documentation/arch/powerpc/htm.rst”h KubhŒtarget”“”)”}”(hŒ.. _htm:”h]”h}”(h]”h ]”h"]”h$]”h&]”Œrefid”Œhtm”uh1h´h KhhhžhhŸh³ubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒHTM (Hardware Trace Macro)”h]”hŒHTM (Hardware Trace Macro)”…””}”(hhÉhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”hÀŒid1”uh1hÇhhÄhžhhŸh³h KubhŒ paragraph”“”)”}”(hŒAthira Rajeev, 2 Mar 2025”h]”hŒAthira Rajeev, 2 Mar 2025”…””}”(hhÚhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hØhŸh³h KhhÄhžhubhŒtopic”“”)”}”(hŒ Contents ”h]”(hÈ)”}”(hŒContents”h]”hŒContents”…””}”(hhîhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÇhhêhŸh³h K ubhŒ bullet_list”“”)”}”(hhh]”hŒ list_item”“”)”}”(hhh]”(hÙ)”}”(hhh]”hŒ reference”“”)”}”(hhh]”hŒHTM (Hardware Trace Macro)”…””}”(hj hžhhŸNh Nubah}”(h]”h×ah ]”h"]”h$]”h&]”Œrefid”Œhtm-hardware-trace-macro”uh1j hjubah}”(h]”h ]”h"]”h$]”h&]”uh1hØhjubhý)”}”(hhh]”(j)”}”(hhh]”hÙ)”}”(hhh]”j )”}”(hhh]”hŒBasic overview”…””}”(hj)hžhhŸNh Nubah}”(h]”Œid2”ah ]”h"]”h$]”h&]”Œrefid”Œbasic-overview”uh1j hj&ubah}”(h]”h ]”h"]”h$]”h&]”uh1hØhj#ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ubj)”}”(hhh]”hÙ)”}”(hhh]”j )”}”(hhh]”hŒHTM debugfs example usage”…””}”(hjKhžhhŸNh Nubah}”(h]”Œid3”ah ]”h"]”h$]”h&]”Œrefid”Œhtm-debugfs-example-usage”uh1j hjHubah}”(h]”h ]”h"]”h$]”h&]”uh1hØhjEubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ubj)”}”(hhh]”hÙ)”}”(hhh]”j )”}”(hhh]”hŒRead the HTM trace data”…””}”(hjmhžhhŸNh Nubah}”(h]”Œid4”ah ]”h"]”h$]”h&]”Œrefid”Œread-the-htm-trace-data”uh1j hjjubah}”(h]”h ]”h"]”h$]”h&]”uh1hØhjgubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ubj)”}”(hhh]”hÙ)”}”(hhh]”j )”}”(hhh]”hŒ'Benefits of using HTM debugfs interface”…””}”(hjhžhhŸNh Nubah}”(h]”Œid5”ah ]”h"]”h$]”h&]”Œrefid”Œ'benefits-of-using-htm-debugfs-interface”uh1j hjŒubah}”(h]”h ]”h"]”h$]”h&]”uh1hØhj‰ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hühjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jhhþubah}”(h]”h ]”h"]”h$]”h&]”uh1hühhêhžhhŸNh Nubeh}”(h]”Œcontents”ah ]”Œcontents”ah"]”Œcontents”ah$]”h&]”uh1hèhŸh³h K hhÄhžhubhÃ)”}”(hhh]”(hÈ)”}”(hŒBasic overview”h]”hŒBasic overview”…””}”(hjÉhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”hÀj2uh1hÇhjÆhžhhŸh³h KubhÙ)”}”(hXÁH_HTM is used as an interface for executing Hardware Trace Macro (HTM) functions, including setup, configuration, control and dumping of the HTM data. For using HTM, it is required to setup HTM buffers and HTM operations can be controlled using the H_HTM hcall. The hcall can be invoked for any core/chip of the system from within a partition itself. To use this feature, a debugfs folder called "htmdump" is present under /sys/kernel/debug/powerpc.”h]”hXÅH_HTM is used as an interface for executing Hardware Trace Macro (HTM) functions, including setup, configuration, control and dumping of the HTM data. For using HTM, it is required to setup HTM buffers and HTM operations can be controlled using the H_HTM hcall. The hcall can be invoked for any core/chip of the system from within a partition itself. To use this feature, a debugfs folder called “htmdump†is present under /sys/kernel/debug/powerpc.”…””}”(hj×hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hØhŸh³h KhjÆhžhubeh}”(h]”j8ah ]”h"]”Œbasic overview”ah$]”h&]”uh1hÂhhÄhžhhŸh³h KubhÃ)”}”(hhh]”(hÈ)”}”(hŒHTM debugfs example usage”h]”hŒHTM debugfs example usage”…””}”(hjïhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”hÀjTuh1hÇhjìhžhhŸh³h KubhŒ literal_block”“”)”}”(hŒ«# ls /sys/kernel/debug/powerpc/htmdump/ coreindexonchip htmcaps htmconfigure htmflags htminfo htmsetup htmstart htmstatus htmtype nodalchipindex nodeindex trace”h]”hŒ«# ls /sys/kernel/debug/powerpc/htmdump/ coreindexonchip htmcaps htmconfigure htmflags htminfo htmsetup htmstart htmstatus htmtype nodalchipindex nodeindex trace”…””}”hjÿsbah}”(h]”h ]”h"]”h$]”h&]”h±h²Œforce”‰Œlanguage”Œsh”Œhighlight_args”}”uh1jýhŸh³h KhjìhžhubhÙ)”}”(hŒDetails on each file:”h]”hŒDetails on each file:”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hØhŸh³h K"hjìhžhubhý)”}”(hhh]”(j)”}”(hŒ^nodeindex, nodalchipindex, coreindexonchip specifies which partition to configure the HTM for.”h]”hÙ)”}”(hj%h]”hŒ^nodeindex, nodalchipindex, coreindexonchip specifies which partition to configure the HTM for.”…””}”(hj'hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hØhŸh³h K$hj#ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj hžhhŸh³h Nubj)”}”(hŒGhtmtype: specifies the type of HTM. Supported target is hardwareTarget.”h]”hÙ)”}”(hj<h]”hŒGhtmtype: specifies the type of HTM. Supported target is hardwareTarget.”…””}”(hj>hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hØhŸh³h K%hj:ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj hžhhŸh³h Nubj)”}”(hŒtrace: is to read the HTM data.”h]”hÙ)”}”(hjSh]”hŒtrace: is to read the HTM data.”…””}”(hjUhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hØhŸh³h K&hjQubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj hžhhŸh³h Nubj)”}”(hŒ‡htmconfigure: Configure/Deconfigure the HTM. Writing 1 to the file will configure the trace, writing 0 to the file will do deconfigure.”h]”hÙ)”}”(hjjh]”hŒ‡htmconfigure: Configure/Deconfigure the HTM. Writing 1 to the file will configure the trace, writing 0 to the file will do deconfigure.”…””}”(hjlhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hØhŸh³h K'hjhubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj hžhhŸh³h Nubj)”}”(hŒxhtmstart: start/Stop the HTM. Writing 1 to the file will start the tracing, writing 0 to the file will stop the tracing.”h]”hÙ)”}”(hjh]”hŒxhtmstart: start/Stop the HTM. Writing 1 to the file will start the tracing, writing 0 to the file will stop the tracing.”…””}”(hjƒhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hØhŸh³h K(hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj hžhhŸh³h Nubj)”}”(hŒbhtmstatus: get the status of HTM. This is needed to understand the HTM state after each operation.”h]”hÙ)”}”(hj˜h]”hŒbhtmstatus: get the status of HTM. This is needed to understand the HTM state after each operation.”…””}”(hjšhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hØhŸh³h K)hj–ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj hžhhŸh³h Nubj)”}”(hŒFhtmsetup: set the HTM buffer size. Size of HTM buffer is in power of 2”h]”hÙ)”}”(hj¯h]”hŒFhtmsetup: set the HTM buffer size. Size of HTM buffer is in power of 2”…””}”(hj±hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hØhŸh³h K*hj­ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj hžhhŸh³h Nubj)”}”(hŒ¡htminfo: provides the system processor configuration details. This is needed to understand the appropriate values for nodeindex, nodalchipindex, coreindexonchip.”h]”hÙ)”}”(hjÆh]”hŒ¡htminfo: provides the system processor configuration details. This is needed to understand the appropriate values for nodeindex, nodalchipindex, coreindexonchip.”…””}”(hjÈhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hØhŸh³h K+hjÄubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj hžhhŸh³h Nubj)”}”(hŒthtmcaps : provides the HTM capabilities like minimum/maximum buffer size, what kind of tracing the HTM supports etc.”h]”hÙ)”}”(hjÝh]”hŒthtmcaps : provides the HTM capabilities like minimum/maximum buffer size, what kind of tracing the HTM supports etc.”…””}”(hjßhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hØhŸh³h K,hjÛubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj hžhhŸh³h Nubj)”}”(hŒehtmflags : allows to pass flags to hcall. Currently supports controlling the wrapping of HTM buffer. ”h]”hÙ)”}”(hŒdhtmflags : allows to pass flags to hcall. Currently supports controlling the wrapping of HTM buffer.”h]”hŒdhtmflags : allows to pass flags to hcall. Currently supports controlling the wrapping of HTM buffer.”…””}”(hjöhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hØhŸh³h K-hjòubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj hžhhŸh³h Nubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ*”uh1hühŸh³h K$hjìhžhubhÙ)”}”(hŒ2To see the system processor configuration details:”h]”hŒ2To see the system processor configuration details:”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hØhŸh³h K/hjìhžhubjþ)”}”(hŒ># cat /sys/kernel/debug/powerpc/htmdump/htminfo > htminfo_file”h]”hŒ># cat /sys/kernel/debug/powerpc/htmdump/htminfo > htminfo_file”…””}”hj sbah}”(h]”h ]”h"]”h$]”h&]”h±h²j ‰jŒsh”j}”uh1jýhŸh³h K1hjìhžhubhÙ)”}”(hŒ,The result can be interpreted using hexdump.”h]”hŒ,The result can be interpreted using hexdump.”…””}”(hj0hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hØhŸh³h K5hjìhžhubhÙ)”}”(hŒuTo collect HTM traces for a partition represented by nodeindex as zero, nodalchipindex as 1 and coreindexonchip as 12”h]”hŒuTo collect HTM traces for a partition represented by nodeindex as zero, nodalchipindex as 1 and coreindexonchip as 12”…””}”(hj>hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hØhŸh³h K7hjìhžhubjþ)”}”(hŒ# cd /sys/kernel/debug/powerpc/htmdump/ # echo 2 > htmtype # echo 33 > htmsetup ( sets 8GB memory for HTM buffer, number is size in power of 2 )”h]”hŒ# cd /sys/kernel/debug/powerpc/htmdump/ # echo 2 > htmtype # echo 33 > htmsetup ( sets 8GB memory for HTM buffer, number is size in power of 2 )”…””}”hjLsbah}”(h]”h ]”h"]”h$]”h&]”h±h²j ‰jŒsh”j}”uh1jýhŸh³h K:hjìhžhubhÙ)”}”(hŒ htmtype # echo 0 > nodeindex # echo 1 > nodalchipindex # echo 12 > coreindexonchip # echo 1 > htmflags # to set noWrap for HTM buffers # echo 1 > htmconfigure # Configure the HTM # echo 1 > htmstart # Start the HTM # echo 0 > htmstart # Stop the HTM # echo 0 > htmconfigure # Deconfigure the HTM # cat htmstatus # Dump the status of HTM entries as data”h]”hX§# cd /sys/kernel/debug/powerpc/htmdump/ # echo 2 > htmtype # echo 0 > nodeindex # echo 1 > nodalchipindex # echo 12 > coreindexonchip # echo 1 > htmflags # to set noWrap for HTM buffers # echo 1 > htmconfigure # Configure the HTM # echo 1 > htmstart # Start the HTM # echo 0 > htmstart # Stop the HTM # echo 0 > htmconfigure # Deconfigure the HTM # cat htmstatus # Dump the status of HTM entries as data”…””}”hjjsbah}”(h]”h ]”h"]”h$]”h&]”h±h²j ‰jŒsh”j}”uh1jýhŸh³h KBhjìhžhubhÙ)”}”(hŒ\Above will set the htmtype and core details, followed by executing respective HTM operation.”h]”hŒ\Above will set the htmtype and core details, followed by executing respective HTM operation.”…””}”(hjzhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hØhŸh³h KPhjìhžhubeh}”(h]”jZah ]”h"]”Œhtm debugfs example usage”ah$]”h&]”uh1hÂhhÄhžhhŸh³h KubhÃ)”}”(hhh]”(hÈ)”}”(hŒRead the HTM trace data”h]”hŒRead the HTM trace data”…””}”(hj’hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”hÀjvuh1hÇhjhžhhŸh³h KSubhÙ)”}”(hŒ”After starting the trace collection, run the workload of interest. Stop the trace collection after required period of time, and read the trace file.”h]”hŒ”After starting the trace collection, run the workload of interest. Stop the trace collection after required period of time, and read the trace file.”…””}”(hj hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hØhŸh³h KUhjhžhubjþ)”}”(hŒ:# cat /sys/kernel/debug/powerpc/htmdump/trace > trace_file”h]”hŒ:# cat /sys/kernel/debug/powerpc/htmdump/trace > trace_file”…””}”hj®sbah}”(h]”h ]”h"]”h$]”h&]”h±h²j ‰jŒsh”j}”uh1jýhŸh³h KYhjhžhubhÙ)”}”(hŒªThis trace file will contain the relevant instruction traces collected during the workload execution. And can be used as input file for trace decoders to understand data.”h]”hŒªThis trace file will contain the relevant instruction traces collected during the workload execution. And can be used as input file for trace decoders to understand data.”…””}”(hj¾hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hØhŸh³h K]hjhžhubeh}”(h]”j|ah ]”h"]”Œread the htm trace data”ah$]”h&]”uh1hÂhhÄhžhhŸh³h KSubhÃ)”}”(hhh]”(hÈ)”}”(hŒ'Benefits of using HTM debugfs interface”h]”hŒ'Benefits of using HTM debugfs interface”…””}”(hjÖhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”hÀj˜uh1hÇhjÓhžhhŸh³h KbubhÙ)”}”(hX7It is now possible to collect traces for a particular core/chip from within any partition of the system and decode it. Through this enablement, a small partition can be dedicated to collect the trace data and analyze to provide important information for Performance analysis, Software tuning, or Hardware debug.”h]”hX7It is now possible to collect traces for a particular core/chip from within any partition of the system and decode it. Through this enablement, a small partition can be dedicated to collect the trace data and analyze to provide important information for Performance analysis, Software tuning, or Hardware debug.”…””}”(hjähžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hØhŸh³h KdhjÓhžhubeh}”(h]”jžah ]”h"]”Œ'benefits of using htm debugfs interface”ah$]”h&]”uh1hÂhhÄhžhhŸh³h Kbubeh}”(h]”(jhÁeh ]”h"]”(Œhtm (hardware trace macro)”Œhtm”eh$]”h&]”uh1hÂhhhžhhŸh³h KŒexpect_referenced_by_name”}”jþh¶sŒexpect_referenced_by_id”}”hÁh¶subeh}”(h]”h ]”h"]”h$]”h&]”Œsource”h³uh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)”}”(hÇNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”j(Œerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”h³Œ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”hÁ]”h¶asŒnameids”}”(jþhÁjýjjÃj¿jéj8jŒjZjÐj|jöjžuŒ nametypes”}”(jþˆjý‰jÉjé‰jŒ‰jЉjö‰uh}”(hÁhÄjhÄj¿hêj8jÆjZjìj|jjžjÓh×j j2j)jTjKjvjmj˜juŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”j6Ks…”R”Œparse_messages”]”Œtransform_messages”]”hŒsystem_message”“”)”}”(hhh]”hÙ)”}”(hhh]”hŒ)Hyperlink target "htm" is not referenced.”…””}”hj’sbah}”(h]”h ]”h"]”h$]”h&]”uh1hØhjubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”ŒINFO”Œsource”h³Œline”Kuh1jubaŒ transformer”NŒ include_log”]”Œ decoration”Nhžhub.