1
0

header.c 106 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904
  1. // SPDX-License-Identifier: GPL-2.0
  2. #include <errno.h>
  3. #include <inttypes.h>
  4. #include "string2.h"
  5. #include <sys/param.h>
  6. #include <sys/types.h>
  7. #include <byteswap.h>
  8. #include <unistd.h>
  9. #include <regex.h>
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <linux/compiler.h>
  13. #include <linux/list.h>
  14. #include <linux/kernel.h>
  15. #include <linux/bitops.h>
  16. #include <linux/string.h>
  17. #include <linux/stringify.h>
  18. #include <linux/zalloc.h>
  19. #include <sys/stat.h>
  20. #include <sys/utsname.h>
  21. #include <linux/time64.h>
  22. #include <dirent.h>
  23. #ifdef HAVE_LIBBPF_SUPPORT
  24. #include <bpf/libbpf.h>
  25. #endif
  26. #include <perf/cpumap.h>
  27. #include <tools/libc_compat.h> // reallocarray
  28. #include "dso.h"
  29. #include "evlist.h"
  30. #include "evsel.h"
  31. #include "util/evsel_fprintf.h"
  32. #include "header.h"
  33. #include "memswap.h"
  34. #include "trace-event.h"
  35. #include "session.h"
  36. #include "symbol.h"
  37. #include "debug.h"
  38. #include "cpumap.h"
  39. #include "pmu.h"
  40. #include "pmus.h"
  41. #include "vdso.h"
  42. #include "strbuf.h"
  43. #include "build-id.h"
  44. #include "data.h"
  45. #include <api/fs/fs.h>
  46. #include <api/io_dir.h>
  47. #include "asm/bug.h"
  48. #include "tool.h"
  49. #include "time-utils.h"
  50. #include "units.h"
  51. #include "util/util.h" // perf_exe()
  52. #include "cputopo.h"
  53. #include "bpf-event.h"
  54. #include "bpf-utils.h"
  55. #include "clockid.h"
  56. #include <linux/ctype.h>
  57. #include <internal/lib.h>
  58. #ifdef HAVE_LIBTRACEEVENT
  59. #include <event-parse.h>
  60. #endif
  61. /*
  62. * magic2 = "PERFILE2"
  63. * must be a numerical value to let the endianness
  64. * determine the memory layout. That way we are able
  65. * to detect endianness when reading the perf.data file
  66. * back.
  67. *
  68. * we check for legacy (PERFFILE) format.
  69. */
  70. static const char *__perf_magic1 = "PERFFILE";
  71. static const u64 __perf_magic2 = 0x32454c4946524550ULL;
  72. static const u64 __perf_magic2_sw = 0x50455246494c4532ULL;
  73. #define PERF_MAGIC __perf_magic2
  74. #define DNAME_LEN 16
  75. const char perf_version_string[] = PERF_VERSION;
  76. struct perf_file_attr {
  77. struct perf_event_attr attr;
  78. struct perf_file_section ids;
  79. };
  80. void perf_header__set_feat(struct perf_header *header, int feat)
  81. {
  82. __set_bit(feat, header->adds_features);
  83. }
  84. void perf_header__clear_feat(struct perf_header *header, int feat)
  85. {
  86. __clear_bit(feat, header->adds_features);
  87. }
  88. bool perf_header__has_feat(const struct perf_header *header, int feat)
  89. {
  90. return test_bit(feat, header->adds_features);
  91. }
  92. static int __do_write_fd(struct feat_fd *ff, const void *buf, size_t size)
  93. {
  94. ssize_t ret = writen(ff->fd, buf, size);
  95. if (ret != (ssize_t)size)
  96. return ret < 0 ? (int)ret : -1;
  97. return 0;
  98. }
  99. static int __do_write_buf(struct feat_fd *ff, const void *buf, size_t size)
  100. {
  101. /* struct perf_event_header::size is u16 */
  102. const size_t max_size = 0xffff - sizeof(struct perf_event_header);
  103. size_t new_size = ff->size;
  104. void *addr;
  105. if (size + ff->offset > max_size)
  106. return -E2BIG;
  107. while (size > (new_size - ff->offset))
  108. new_size <<= 1;
  109. new_size = min(max_size, new_size);
  110. if (ff->size < new_size) {
  111. addr = realloc(ff->buf, new_size);
  112. if (!addr)
  113. return -ENOMEM;
  114. ff->buf = addr;
  115. ff->size = new_size;
  116. }
  117. memcpy(ff->buf + ff->offset, buf, size);
  118. ff->offset += size;
  119. return 0;
  120. }
  121. /* Return: 0 if succeeded, -ERR if failed. */
  122. int do_write(struct feat_fd *ff, const void *buf, size_t size)
  123. {
  124. if (!ff->buf)
  125. return __do_write_fd(ff, buf, size);
  126. return __do_write_buf(ff, buf, size);
  127. }
  128. /* Return: 0 if succeeded, -ERR if failed. */
  129. static int do_write_bitmap(struct feat_fd *ff, unsigned long *set, u64 size)
  130. {
  131. u64 *p = (u64 *) set;
  132. int i, ret;
  133. ret = do_write(ff, &size, sizeof(size));
  134. if (ret < 0)
  135. return ret;
  136. for (i = 0; (u64) i < BITS_TO_U64(size); i++) {
  137. ret = do_write(ff, p + i, sizeof(*p));
  138. if (ret < 0)
  139. return ret;
  140. }
  141. return 0;
  142. }
  143. /* Return: 0 if succeeded, -ERR if failed. */
  144. int write_padded(struct feat_fd *ff, const void *bf,
  145. size_t count, size_t count_aligned)
  146. {
  147. static const char zero_buf[NAME_ALIGN];
  148. int err = do_write(ff, bf, count);
  149. if (!err)
  150. err = do_write(ff, zero_buf, count_aligned - count);
  151. return err;
  152. }
  153. #define string_size(str) \
  154. (PERF_ALIGN((strlen(str) + 1), NAME_ALIGN) + sizeof(u32))
  155. /* Return: 0 if succeeded, -ERR if failed. */
  156. static int do_write_string(struct feat_fd *ff, const char *str)
  157. {
  158. u32 len, olen;
  159. int ret;
  160. olen = strlen(str) + 1;
  161. len = PERF_ALIGN(olen, NAME_ALIGN);
  162. /* write len, incl. \0 */
  163. ret = do_write(ff, &len, sizeof(len));
  164. if (ret < 0)
  165. return ret;
  166. return write_padded(ff, str, olen, len);
  167. }
  168. static int __do_read_fd(struct feat_fd *ff, void *addr, ssize_t size)
  169. {
  170. ssize_t ret = readn(ff->fd, addr, size);
  171. if (ret != size)
  172. return ret < 0 ? (int)ret : -1;
  173. return 0;
  174. }
  175. static int __do_read_buf(struct feat_fd *ff, void *addr, ssize_t size)
  176. {
  177. if (size > (ssize_t)ff->size - ff->offset)
  178. return -1;
  179. memcpy(addr, ff->buf + ff->offset, size);
  180. ff->offset += size;
  181. return 0;
  182. }
  183. static int __do_read(struct feat_fd *ff, void *addr, ssize_t size)
  184. {
  185. if (!ff->buf)
  186. return __do_read_fd(ff, addr, size);
  187. return __do_read_buf(ff, addr, size);
  188. }
  189. static int do_read_u32(struct feat_fd *ff, u32 *addr)
  190. {
  191. int ret;
  192. ret = __do_read(ff, addr, sizeof(*addr));
  193. if (ret)
  194. return ret;
  195. if (ff->ph->needs_swap)
  196. *addr = bswap_32(*addr);
  197. return 0;
  198. }
  199. static int do_read_u64(struct feat_fd *ff, u64 *addr)
  200. {
  201. int ret;
  202. ret = __do_read(ff, addr, sizeof(*addr));
  203. if (ret)
  204. return ret;
  205. if (ff->ph->needs_swap)
  206. *addr = bswap_64(*addr);
  207. return 0;
  208. }
  209. static char *do_read_string(struct feat_fd *ff)
  210. {
  211. u32 len;
  212. char *buf;
  213. if (do_read_u32(ff, &len))
  214. return NULL;
  215. buf = malloc(len);
  216. if (!buf)
  217. return NULL;
  218. if (!__do_read(ff, buf, len)) {
  219. /*
  220. * strings are padded by zeroes
  221. * thus the actual strlen of buf
  222. * may be less than len
  223. */
  224. return buf;
  225. }
  226. free(buf);
  227. return NULL;
  228. }
  229. /* Return: 0 if succeeded, -ERR if failed. */
  230. static int do_read_bitmap(struct feat_fd *ff, unsigned long **pset, u64 *psize)
  231. {
  232. unsigned long *set;
  233. u64 size, *p;
  234. int i, ret;
  235. ret = do_read_u64(ff, &size);
  236. if (ret)
  237. return ret;
  238. set = bitmap_zalloc(size);
  239. if (!set)
  240. return -ENOMEM;
  241. p = (u64 *) set;
  242. for (i = 0; (u64) i < BITS_TO_U64(size); i++) {
  243. ret = do_read_u64(ff, p + i);
  244. if (ret < 0) {
  245. free(set);
  246. return ret;
  247. }
  248. }
  249. *pset = set;
  250. *psize = size;
  251. return 0;
  252. }
  253. #ifdef HAVE_LIBTRACEEVENT
  254. static int write_tracing_data(struct feat_fd *ff,
  255. struct evlist *evlist)
  256. {
  257. if (WARN(ff->buf, "Error: calling %s in pipe-mode.\n", __func__))
  258. return -1;
  259. return read_tracing_data(ff->fd, &evlist->core.entries);
  260. }
  261. #endif
  262. static int write_build_id(struct feat_fd *ff,
  263. struct evlist *evlist __maybe_unused)
  264. {
  265. struct perf_session *session;
  266. int err;
  267. session = container_of(ff->ph, struct perf_session, header);
  268. if (!perf_session__read_build_ids(session, true))
  269. return -1;
  270. if (WARN(ff->buf, "Error: calling %s in pipe-mode.\n", __func__))
  271. return -1;
  272. err = perf_session__write_buildid_table(session, ff);
  273. if (err < 0) {
  274. pr_debug("failed to write buildid table\n");
  275. return err;
  276. }
  277. return 0;
  278. }
  279. static int write_hostname(struct feat_fd *ff,
  280. struct evlist *evlist __maybe_unused)
  281. {
  282. struct utsname uts;
  283. int ret;
  284. ret = uname(&uts);
  285. if (ret < 0)
  286. return -1;
  287. return do_write_string(ff, uts.nodename);
  288. }
  289. static int write_osrelease(struct feat_fd *ff,
  290. struct evlist *evlist __maybe_unused)
  291. {
  292. struct utsname uts;
  293. int ret;
  294. ret = uname(&uts);
  295. if (ret < 0)
  296. return -1;
  297. return do_write_string(ff, uts.release);
  298. }
  299. static int write_arch(struct feat_fd *ff,
  300. struct evlist *evlist __maybe_unused)
  301. {
  302. struct utsname uts;
  303. int ret;
  304. ret = uname(&uts);
  305. if (ret < 0)
  306. return -1;
  307. return do_write_string(ff, uts.machine);
  308. }
  309. static int write_e_machine(struct feat_fd *ff,
  310. struct evlist *evlist __maybe_unused)
  311. {
  312. /* e_machine expanded from 16 to 32-bits for alignment. */
  313. uint32_t e_flags;
  314. uint32_t e_machine = perf_session__e_machine(evlist->session, &e_flags);
  315. int ret;
  316. ret = do_write(ff, &e_machine, sizeof(e_machine));
  317. if (ret)
  318. return ret;
  319. return do_write(ff, &e_flags, sizeof(e_flags));
  320. }
  321. static int write_version(struct feat_fd *ff,
  322. struct evlist *evlist __maybe_unused)
  323. {
  324. return do_write_string(ff, perf_version_string);
  325. }
  326. static int __write_cpudesc(struct feat_fd *ff, const char *cpuinfo_proc)
  327. {
  328. FILE *file;
  329. char *buf = NULL;
  330. char *s, *p;
  331. const char *search = cpuinfo_proc;
  332. size_t len = 0;
  333. int ret = -1;
  334. if (!search)
  335. return -1;
  336. file = fopen("/proc/cpuinfo", "r");
  337. if (!file)
  338. return -1;
  339. while (getline(&buf, &len, file) > 0) {
  340. ret = strncmp(buf, search, strlen(search));
  341. if (!ret)
  342. break;
  343. }
  344. if (ret) {
  345. ret = -1;
  346. goto done;
  347. }
  348. s = buf;
  349. p = strchr(buf, ':');
  350. if (p && *(p+1) == ' ' && *(p+2))
  351. s = p + 2;
  352. p = strchr(s, '\n');
  353. if (p)
  354. *p = '\0';
  355. /* squash extra space characters (branding string) */
  356. p = s;
  357. while (*p) {
  358. if (isspace(*p)) {
  359. char *r = p + 1;
  360. char *q = skip_spaces(r);
  361. *p = ' ';
  362. if (q != (p+1))
  363. while ((*r++ = *q++));
  364. }
  365. p++;
  366. }
  367. ret = do_write_string(ff, s);
  368. done:
  369. free(buf);
  370. fclose(file);
  371. return ret;
  372. }
  373. static int write_cpudesc(struct feat_fd *ff,
  374. struct evlist *evlist __maybe_unused)
  375. {
  376. #if defined(__powerpc__) || defined(__hppa__) || defined(__sparc__)
  377. #define CPUINFO_PROC { "cpu", }
  378. #elif defined(__s390__)
  379. #define CPUINFO_PROC { "vendor_id", }
  380. #elif defined(__sh__)
  381. #define CPUINFO_PROC { "cpu type", }
  382. #elif defined(__alpha__) || defined(__mips__)
  383. #define CPUINFO_PROC { "cpu model", }
  384. #elif defined(__arm__)
  385. #define CPUINFO_PROC { "model name", "Processor", }
  386. #elif defined(__arc__)
  387. #define CPUINFO_PROC { "Processor", }
  388. #elif defined(__xtensa__)
  389. #define CPUINFO_PROC { "core ID", }
  390. #elif defined(__loongarch__)
  391. #define CPUINFO_PROC { "Model Name", }
  392. #else
  393. #define CPUINFO_PROC { "model name", }
  394. #endif
  395. const char *cpuinfo_procs[] = CPUINFO_PROC;
  396. #undef CPUINFO_PROC
  397. unsigned int i;
  398. for (i = 0; i < ARRAY_SIZE(cpuinfo_procs); i++) {
  399. int ret;
  400. ret = __write_cpudesc(ff, cpuinfo_procs[i]);
  401. if (ret >= 0)
  402. return ret;
  403. }
  404. return -1;
  405. }
  406. static int write_nrcpus(struct feat_fd *ff,
  407. struct evlist *evlist __maybe_unused)
  408. {
  409. long nr;
  410. u32 nrc, nra;
  411. int ret;
  412. nrc = cpu__max_present_cpu().cpu;
  413. nr = sysconf(_SC_NPROCESSORS_ONLN);
  414. if (nr < 0)
  415. return -1;
  416. nra = (u32)(nr & UINT_MAX);
  417. ret = do_write(ff, &nrc, sizeof(nrc));
  418. if (ret < 0)
  419. return ret;
  420. return do_write(ff, &nra, sizeof(nra));
  421. }
  422. static int write_event_desc(struct feat_fd *ff,
  423. struct evlist *evlist)
  424. {
  425. struct evsel *evsel;
  426. u32 nre, nri, sz;
  427. int ret;
  428. nre = evlist->core.nr_entries;
  429. /*
  430. * write number of events
  431. */
  432. ret = do_write(ff, &nre, sizeof(nre));
  433. if (ret < 0)
  434. return ret;
  435. /*
  436. * size of perf_event_attr struct
  437. */
  438. sz = (u32)sizeof(evsel->core.attr);
  439. ret = do_write(ff, &sz, sizeof(sz));
  440. if (ret < 0)
  441. return ret;
  442. evlist__for_each_entry(evlist, evsel) {
  443. ret = do_write(ff, &evsel->core.attr, sz);
  444. if (ret < 0)
  445. return ret;
  446. /*
  447. * write number of unique id per event
  448. * there is one id per instance of an event
  449. *
  450. * copy into an nri to be independent of the
  451. * type of ids,
  452. */
  453. nri = evsel->core.ids;
  454. ret = do_write(ff, &nri, sizeof(nri));
  455. if (ret < 0)
  456. return ret;
  457. /*
  458. * write event string as passed on cmdline
  459. */
  460. ret = do_write_string(ff, evsel__name(evsel));
  461. if (ret < 0)
  462. return ret;
  463. /*
  464. * write unique ids for this event
  465. */
  466. ret = do_write(ff, evsel->core.id, evsel->core.ids * sizeof(u64));
  467. if (ret < 0)
  468. return ret;
  469. }
  470. return 0;
  471. }
  472. static int write_cmdline(struct feat_fd *ff,
  473. struct evlist *evlist __maybe_unused)
  474. {
  475. struct perf_env *env = &ff->ph->env;
  476. char pbuf[MAXPATHLEN], *buf;
  477. int i, ret, n;
  478. /* actual path to perf binary */
  479. buf = perf_exe(pbuf, MAXPATHLEN);
  480. /* account for binary path */
  481. n = env->nr_cmdline + 1;
  482. ret = do_write(ff, &n, sizeof(n));
  483. if (ret < 0)
  484. return ret;
  485. ret = do_write_string(ff, buf);
  486. if (ret < 0)
  487. return ret;
  488. for (i = 0 ; i < env->nr_cmdline; i++) {
  489. ret = do_write_string(ff, env->cmdline_argv[i]);
  490. if (ret < 0)
  491. return ret;
  492. }
  493. return 0;
  494. }
  495. static int write_cpu_topology(struct feat_fd *ff,
  496. struct evlist *evlist __maybe_unused)
  497. {
  498. struct perf_env *env = &ff->ph->env;
  499. struct cpu_topology *tp;
  500. u32 i;
  501. int ret, j;
  502. tp = cpu_topology__new();
  503. if (!tp)
  504. return -1;
  505. ret = do_write(ff, &tp->package_cpus_lists, sizeof(tp->package_cpus_lists));
  506. if (ret < 0)
  507. goto done;
  508. for (i = 0; i < tp->package_cpus_lists; i++) {
  509. ret = do_write_string(ff, tp->package_cpus_list[i]);
  510. if (ret < 0)
  511. goto done;
  512. }
  513. ret = do_write(ff, &tp->core_cpus_lists, sizeof(tp->core_cpus_lists));
  514. if (ret < 0)
  515. goto done;
  516. for (i = 0; i < tp->core_cpus_lists; i++) {
  517. ret = do_write_string(ff, tp->core_cpus_list[i]);
  518. if (ret < 0)
  519. break;
  520. }
  521. ret = perf_env__read_cpu_topology_map(env);
  522. if (ret < 0)
  523. goto done;
  524. for (j = 0; j < env->nr_cpus_avail; j++) {
  525. ret = do_write(ff, &env->cpu[j].core_id,
  526. sizeof(env->cpu[j].core_id));
  527. if (ret < 0)
  528. return ret;
  529. ret = do_write(ff, &env->cpu[j].socket_id,
  530. sizeof(env->cpu[j].socket_id));
  531. if (ret < 0)
  532. return ret;
  533. }
  534. if (!tp->die_cpus_lists)
  535. goto done;
  536. ret = do_write(ff, &tp->die_cpus_lists, sizeof(tp->die_cpus_lists));
  537. if (ret < 0)
  538. goto done;
  539. for (i = 0; i < tp->die_cpus_lists; i++) {
  540. ret = do_write_string(ff, tp->die_cpus_list[i]);
  541. if (ret < 0)
  542. goto done;
  543. }
  544. for (j = 0; j < env->nr_cpus_avail; j++) {
  545. ret = do_write(ff, &env->cpu[j].die_id,
  546. sizeof(env->cpu[j].die_id));
  547. if (ret < 0)
  548. return ret;
  549. }
  550. done:
  551. cpu_topology__delete(tp);
  552. return ret;
  553. }
  554. static int write_total_mem(struct feat_fd *ff,
  555. struct evlist *evlist __maybe_unused)
  556. {
  557. char *buf = NULL;
  558. FILE *fp;
  559. size_t len = 0;
  560. int ret = -1, n;
  561. uint64_t mem;
  562. fp = fopen("/proc/meminfo", "r");
  563. if (!fp)
  564. return -1;
  565. while (getline(&buf, &len, fp) > 0) {
  566. ret = strncmp(buf, "MemTotal:", 9);
  567. if (!ret)
  568. break;
  569. }
  570. if (!ret) {
  571. n = sscanf(buf, "%*s %"PRIu64, &mem);
  572. if (n == 1)
  573. ret = do_write(ff, &mem, sizeof(mem));
  574. } else
  575. ret = -1;
  576. free(buf);
  577. fclose(fp);
  578. return ret;
  579. }
  580. static int write_numa_topology(struct feat_fd *ff,
  581. struct evlist *evlist __maybe_unused)
  582. {
  583. struct numa_topology *tp;
  584. int ret = -1;
  585. u32 i;
  586. tp = numa_topology__new();
  587. if (!tp)
  588. return -ENOMEM;
  589. ret = do_write(ff, &tp->nr, sizeof(u32));
  590. if (ret < 0)
  591. goto err;
  592. for (i = 0; i < tp->nr; i++) {
  593. struct numa_topology_node *n = &tp->nodes[i];
  594. ret = do_write(ff, &n->node, sizeof(u32));
  595. if (ret < 0)
  596. goto err;
  597. ret = do_write(ff, &n->mem_total, sizeof(u64));
  598. if (ret)
  599. goto err;
  600. ret = do_write(ff, &n->mem_free, sizeof(u64));
  601. if (ret)
  602. goto err;
  603. ret = do_write_string(ff, n->cpus);
  604. if (ret < 0)
  605. goto err;
  606. }
  607. ret = 0;
  608. err:
  609. numa_topology__delete(tp);
  610. return ret;
  611. }
  612. /*
  613. * File format:
  614. *
  615. * struct pmu_mappings {
  616. * u32 pmu_num;
  617. * struct pmu_map {
  618. * u32 type;
  619. * char name[];
  620. * }[pmu_num];
  621. * };
  622. */
  623. static int write_pmu_mappings(struct feat_fd *ff,
  624. struct evlist *evlist __maybe_unused)
  625. {
  626. struct perf_pmu *pmu = NULL;
  627. u32 pmu_num = 0;
  628. int ret;
  629. /*
  630. * Do a first pass to count number of pmu to avoid lseek so this
  631. * works in pipe mode as well.
  632. */
  633. while ((pmu = perf_pmus__scan(pmu)))
  634. pmu_num++;
  635. ret = do_write(ff, &pmu_num, sizeof(pmu_num));
  636. if (ret < 0)
  637. return ret;
  638. while ((pmu = perf_pmus__scan(pmu))) {
  639. ret = do_write(ff, &pmu->type, sizeof(pmu->type));
  640. if (ret < 0)
  641. return ret;
  642. ret = do_write_string(ff, pmu->name);
  643. if (ret < 0)
  644. return ret;
  645. }
  646. return 0;
  647. }
  648. /*
  649. * File format:
  650. *
  651. * struct group_descs {
  652. * u32 nr_groups;
  653. * struct group_desc {
  654. * char name[];
  655. * u32 leader_idx;
  656. * u32 nr_members;
  657. * }[nr_groups];
  658. * };
  659. */
  660. static int write_group_desc(struct feat_fd *ff,
  661. struct evlist *evlist)
  662. {
  663. u32 nr_groups = evlist__nr_groups(evlist);
  664. struct evsel *evsel;
  665. int ret;
  666. ret = do_write(ff, &nr_groups, sizeof(nr_groups));
  667. if (ret < 0)
  668. return ret;
  669. evlist__for_each_entry(evlist, evsel) {
  670. if (evsel__is_group_leader(evsel) && evsel->core.nr_members > 1) {
  671. const char *name = evsel->group_name ?: "{anon_group}";
  672. u32 leader_idx = evsel->core.idx;
  673. u32 nr_members = evsel->core.nr_members;
  674. ret = do_write_string(ff, name);
  675. if (ret < 0)
  676. return ret;
  677. ret = do_write(ff, &leader_idx, sizeof(leader_idx));
  678. if (ret < 0)
  679. return ret;
  680. ret = do_write(ff, &nr_members, sizeof(nr_members));
  681. if (ret < 0)
  682. return ret;
  683. }
  684. }
  685. return 0;
  686. }
  687. /*
  688. * Return the CPU id as a raw string.
  689. *
  690. * Each architecture should provide a more precise id string that
  691. * can be use to match the architecture's "mapfile".
  692. */
  693. char * __weak get_cpuid_str(struct perf_cpu cpu __maybe_unused)
  694. {
  695. return NULL;
  696. }
  697. char *get_cpuid_allow_env_override(struct perf_cpu cpu)
  698. {
  699. char *cpuid;
  700. static bool printed;
  701. cpuid = getenv("PERF_CPUID");
  702. if (cpuid)
  703. cpuid = strdup(cpuid);
  704. if (!cpuid)
  705. cpuid = get_cpuid_str(cpu);
  706. if (!cpuid)
  707. return NULL;
  708. if (!printed) {
  709. pr_debug("Using CPUID %s\n", cpuid);
  710. printed = true;
  711. }
  712. return cpuid;
  713. }
  714. /* Return zero when the cpuid from the mapfile.csv matches the
  715. * cpuid string generated on this platform.
  716. * Otherwise return non-zero.
  717. */
  718. int __weak strcmp_cpuid_str(const char *mapcpuid, const char *cpuid)
  719. {
  720. regex_t re;
  721. regmatch_t pmatch[1];
  722. int match;
  723. if (regcomp(&re, mapcpuid, REG_EXTENDED) != 0) {
  724. /* Warn unable to generate match particular string. */
  725. pr_info("Invalid regular expression %s\n", mapcpuid);
  726. return 1;
  727. }
  728. match = !regexec(&re, cpuid, 1, pmatch, 0);
  729. regfree(&re);
  730. if (match) {
  731. size_t match_len = (pmatch[0].rm_eo - pmatch[0].rm_so);
  732. /* Verify the entire string matched. */
  733. if (match_len == strlen(cpuid))
  734. return 0;
  735. }
  736. return 1;
  737. }
  738. /*
  739. * default get_cpuid(): nothing gets recorded
  740. * actual implementation must be in arch/$(SRCARCH)/util/header.c
  741. */
  742. int __weak get_cpuid(char *buffer __maybe_unused, size_t sz __maybe_unused,
  743. struct perf_cpu cpu __maybe_unused)
  744. {
  745. return ENOSYS; /* Not implemented */
  746. }
  747. static int write_cpuid(struct feat_fd *ff, struct evlist *evlist)
  748. {
  749. struct perf_cpu cpu = perf_cpu_map__min(evlist->core.all_cpus);
  750. char buffer[64];
  751. int ret;
  752. ret = get_cpuid(buffer, sizeof(buffer), cpu);
  753. if (ret)
  754. return -1;
  755. return do_write_string(ff, buffer);
  756. }
  757. static int write_branch_stack(struct feat_fd *ff __maybe_unused,
  758. struct evlist *evlist __maybe_unused)
  759. {
  760. return 0;
  761. }
  762. static int write_auxtrace(struct feat_fd *ff,
  763. struct evlist *evlist __maybe_unused)
  764. {
  765. struct perf_session *session;
  766. int err;
  767. if (WARN(ff->buf, "Error: calling %s in pipe-mode.\n", __func__))
  768. return -1;
  769. session = container_of(ff->ph, struct perf_session, header);
  770. err = auxtrace_index__write(ff->fd, &session->auxtrace_index);
  771. if (err < 0)
  772. pr_err("Failed to write auxtrace index\n");
  773. return err;
  774. }
  775. static int write_clockid(struct feat_fd *ff,
  776. struct evlist *evlist __maybe_unused)
  777. {
  778. return do_write(ff, &ff->ph->env.clock.clockid_res_ns,
  779. sizeof(ff->ph->env.clock.clockid_res_ns));
  780. }
  781. static int write_clock_data(struct feat_fd *ff,
  782. struct evlist *evlist __maybe_unused)
  783. {
  784. u64 *data64;
  785. u32 data32;
  786. int ret;
  787. /* version */
  788. data32 = 1;
  789. ret = do_write(ff, &data32, sizeof(data32));
  790. if (ret < 0)
  791. return ret;
  792. /* clockid */
  793. data32 = ff->ph->env.clock.clockid;
  794. ret = do_write(ff, &data32, sizeof(data32));
  795. if (ret < 0)
  796. return ret;
  797. /* TOD ref time */
  798. data64 = &ff->ph->env.clock.tod_ns;
  799. ret = do_write(ff, data64, sizeof(*data64));
  800. if (ret < 0)
  801. return ret;
  802. /* clockid ref time */
  803. data64 = &ff->ph->env.clock.clockid_ns;
  804. return do_write(ff, data64, sizeof(*data64));
  805. }
  806. static int write_hybrid_topology(struct feat_fd *ff,
  807. struct evlist *evlist __maybe_unused)
  808. {
  809. struct hybrid_topology *tp;
  810. int ret;
  811. u32 i;
  812. tp = hybrid_topology__new();
  813. if (!tp)
  814. return -ENOENT;
  815. ret = do_write(ff, &tp->nr, sizeof(u32));
  816. if (ret < 0)
  817. goto err;
  818. for (i = 0; i < tp->nr; i++) {
  819. struct hybrid_topology_node *n = &tp->nodes[i];
  820. ret = do_write_string(ff, n->pmu_name);
  821. if (ret < 0)
  822. goto err;
  823. ret = do_write_string(ff, n->cpus);
  824. if (ret < 0)
  825. goto err;
  826. }
  827. ret = 0;
  828. err:
  829. hybrid_topology__delete(tp);
  830. return ret;
  831. }
  832. static int write_dir_format(struct feat_fd *ff,
  833. struct evlist *evlist __maybe_unused)
  834. {
  835. struct perf_session *session;
  836. struct perf_data *data;
  837. session = container_of(ff->ph, struct perf_session, header);
  838. data = session->data;
  839. if (WARN_ON(!perf_data__is_dir(data)))
  840. return -1;
  841. return do_write(ff, &data->dir.version, sizeof(data->dir.version));
  842. }
  843. #ifdef HAVE_LIBBPF_SUPPORT
  844. static int write_bpf_prog_info(struct feat_fd *ff,
  845. struct evlist *evlist __maybe_unused)
  846. {
  847. struct perf_env *env = &ff->ph->env;
  848. struct rb_root *root;
  849. struct rb_node *next;
  850. int ret = 0;
  851. down_read(&env->bpf_progs.lock);
  852. ret = do_write(ff, &env->bpf_progs.infos_cnt,
  853. sizeof(env->bpf_progs.infos_cnt));
  854. if (ret < 0 || env->bpf_progs.infos_cnt == 0)
  855. goto out;
  856. root = &env->bpf_progs.infos;
  857. next = rb_first(root);
  858. while (next) {
  859. struct bpf_prog_info_node *node;
  860. size_t len;
  861. node = rb_entry(next, struct bpf_prog_info_node, rb_node);
  862. next = rb_next(&node->rb_node);
  863. len = sizeof(struct perf_bpil) +
  864. node->info_linear->data_len;
  865. /* before writing to file, translate address to offset */
  866. bpil_addr_to_offs(node->info_linear);
  867. ret = do_write(ff, node->info_linear, len);
  868. /*
  869. * translate back to address even when do_write() fails,
  870. * so that this function never changes the data.
  871. */
  872. bpil_offs_to_addr(node->info_linear);
  873. if (ret < 0)
  874. goto out;
  875. }
  876. out:
  877. up_read(&env->bpf_progs.lock);
  878. return ret;
  879. }
  880. static int write_bpf_btf(struct feat_fd *ff,
  881. struct evlist *evlist __maybe_unused)
  882. {
  883. struct perf_env *env = &ff->ph->env;
  884. struct rb_root *root;
  885. struct rb_node *next;
  886. int ret = 0;
  887. down_read(&env->bpf_progs.lock);
  888. ret = do_write(ff, &env->bpf_progs.btfs_cnt,
  889. sizeof(env->bpf_progs.btfs_cnt));
  890. if (ret < 0 || env->bpf_progs.btfs_cnt == 0)
  891. goto out;
  892. root = &env->bpf_progs.btfs;
  893. next = rb_first(root);
  894. while (next) {
  895. struct btf_node *node;
  896. node = rb_entry(next, struct btf_node, rb_node);
  897. next = rb_next(&node->rb_node);
  898. ret = do_write(ff, &node->id,
  899. sizeof(u32) * 2 + node->data_size);
  900. if (ret < 0)
  901. goto out;
  902. }
  903. out:
  904. up_read(&env->bpf_progs.lock);
  905. return ret;
  906. }
  907. #endif // HAVE_LIBBPF_SUPPORT
  908. static int cpu_cache_level__sort(const void *a, const void *b)
  909. {
  910. struct cpu_cache_level *cache_a = (struct cpu_cache_level *)a;
  911. struct cpu_cache_level *cache_b = (struct cpu_cache_level *)b;
  912. return cache_a->level - cache_b->level;
  913. }
  914. static bool cpu_cache_level__cmp(struct cpu_cache_level *a, struct cpu_cache_level *b)
  915. {
  916. if (a->level != b->level)
  917. return false;
  918. if (a->line_size != b->line_size)
  919. return false;
  920. if (a->sets != b->sets)
  921. return false;
  922. if (a->ways != b->ways)
  923. return false;
  924. if (strcmp(a->type, b->type))
  925. return false;
  926. if (strcmp(a->size, b->size))
  927. return false;
  928. if (strcmp(a->map, b->map))
  929. return false;
  930. return true;
  931. }
  932. static int cpu_cache_level__read(struct cpu_cache_level *cache, u32 cpu, u16 level)
  933. {
  934. char path[PATH_MAX], file[PATH_MAX];
  935. struct stat st;
  936. size_t len;
  937. scnprintf(path, PATH_MAX, "devices/system/cpu/cpu%d/cache/index%d/", cpu, level);
  938. scnprintf(file, PATH_MAX, "%s/%s", sysfs__mountpoint(), path);
  939. if (stat(file, &st))
  940. return 1;
  941. scnprintf(file, PATH_MAX, "%s/level", path);
  942. if (sysfs__read_int(file, (int *) &cache->level))
  943. return -1;
  944. scnprintf(file, PATH_MAX, "%s/coherency_line_size", path);
  945. if (sysfs__read_int(file, (int *) &cache->line_size))
  946. return -1;
  947. scnprintf(file, PATH_MAX, "%s/number_of_sets", path);
  948. if (sysfs__read_int(file, (int *) &cache->sets))
  949. return -1;
  950. scnprintf(file, PATH_MAX, "%s/ways_of_associativity", path);
  951. if (sysfs__read_int(file, (int *) &cache->ways))
  952. return -1;
  953. scnprintf(file, PATH_MAX, "%s/type", path);
  954. if (sysfs__read_str(file, &cache->type, &len))
  955. return -1;
  956. cache->type[len] = 0;
  957. cache->type = strim(cache->type);
  958. scnprintf(file, PATH_MAX, "%s/size", path);
  959. if (sysfs__read_str(file, &cache->size, &len)) {
  960. zfree(&cache->type);
  961. return -1;
  962. }
  963. cache->size[len] = 0;
  964. cache->size = strim(cache->size);
  965. scnprintf(file, PATH_MAX, "%s/shared_cpu_list", path);
  966. if (sysfs__read_str(file, &cache->map, &len)) {
  967. zfree(&cache->size);
  968. zfree(&cache->type);
  969. return -1;
  970. }
  971. cache->map[len] = 0;
  972. cache->map = strim(cache->map);
  973. return 0;
  974. }
  975. static void cpu_cache_level__fprintf(FILE *out, struct cpu_cache_level *c)
  976. {
  977. fprintf(out, "L%d %-15s %8s [%s]\n", c->level, c->type, c->size, c->map);
  978. }
  979. /*
  980. * Build caches levels for a particular CPU from the data in
  981. * /sys/devices/system/cpu/cpu<cpu>/cache/
  982. * The cache level data is stored in caches[] from index at
  983. * *cntp.
  984. */
  985. int build_caches_for_cpu(u32 cpu, struct cpu_cache_level caches[], u32 *cntp)
  986. {
  987. u16 level;
  988. for (level = 0; level < MAX_CACHE_LVL; level++) {
  989. struct cpu_cache_level c;
  990. int err;
  991. u32 i;
  992. err = cpu_cache_level__read(&c, cpu, level);
  993. if (err < 0)
  994. return err;
  995. if (err == 1)
  996. break;
  997. for (i = 0; i < *cntp; i++) {
  998. if (cpu_cache_level__cmp(&c, &caches[i]))
  999. break;
  1000. }
  1001. if (i == *cntp) {
  1002. caches[*cntp] = c;
  1003. *cntp = *cntp + 1;
  1004. } else
  1005. cpu_cache_level__free(&c);
  1006. }
  1007. return 0;
  1008. }
  1009. static int build_caches(struct cpu_cache_level caches[], u32 *cntp)
  1010. {
  1011. u32 nr, cpu, cnt = 0;
  1012. nr = cpu__max_cpu().cpu;
  1013. for (cpu = 0; cpu < nr; cpu++) {
  1014. int ret = build_caches_for_cpu(cpu, caches, &cnt);
  1015. if (ret)
  1016. return ret;
  1017. }
  1018. *cntp = cnt;
  1019. return 0;
  1020. }
  1021. static int write_cache(struct feat_fd *ff,
  1022. struct evlist *evlist __maybe_unused)
  1023. {
  1024. u32 max_caches = cpu__max_cpu().cpu * MAX_CACHE_LVL;
  1025. struct cpu_cache_level caches[max_caches];
  1026. u32 cnt = 0, i, version = 1;
  1027. int ret;
  1028. ret = build_caches(caches, &cnt);
  1029. if (ret)
  1030. goto out;
  1031. qsort(&caches, cnt, sizeof(struct cpu_cache_level), cpu_cache_level__sort);
  1032. ret = do_write(ff, &version, sizeof(u32));
  1033. if (ret < 0)
  1034. goto out;
  1035. ret = do_write(ff, &cnt, sizeof(u32));
  1036. if (ret < 0)
  1037. goto out;
  1038. for (i = 0; i < cnt; i++) {
  1039. struct cpu_cache_level *c = &caches[i];
  1040. #define _W(v) \
  1041. ret = do_write(ff, &c->v, sizeof(u32)); \
  1042. if (ret < 0) \
  1043. goto out;
  1044. _W(level)
  1045. _W(line_size)
  1046. _W(sets)
  1047. _W(ways)
  1048. #undef _W
  1049. #define _W(v) \
  1050. ret = do_write_string(ff, (const char *) c->v); \
  1051. if (ret < 0) \
  1052. goto out;
  1053. _W(type)
  1054. _W(size)
  1055. _W(map)
  1056. #undef _W
  1057. }
  1058. out:
  1059. for (i = 0; i < cnt; i++)
  1060. cpu_cache_level__free(&caches[i]);
  1061. return ret;
  1062. }
  1063. static int write_stat(struct feat_fd *ff __maybe_unused,
  1064. struct evlist *evlist __maybe_unused)
  1065. {
  1066. return 0;
  1067. }
  1068. static int write_sample_time(struct feat_fd *ff,
  1069. struct evlist *evlist)
  1070. {
  1071. int ret;
  1072. ret = do_write(ff, &evlist->first_sample_time,
  1073. sizeof(evlist->first_sample_time));
  1074. if (ret < 0)
  1075. return ret;
  1076. return do_write(ff, &evlist->last_sample_time,
  1077. sizeof(evlist->last_sample_time));
  1078. }
  1079. static int memory_node__read(struct memory_node *n, unsigned long idx)
  1080. {
  1081. unsigned int phys, size = 0;
  1082. char path[PATH_MAX];
  1083. struct io_dirent64 *ent;
  1084. struct io_dir dir;
  1085. #define for_each_memory(mem, dir) \
  1086. while ((ent = io_dir__readdir(&dir)) != NULL) \
  1087. if (strcmp(ent->d_name, ".") && \
  1088. strcmp(ent->d_name, "..") && \
  1089. sscanf(ent->d_name, "memory%u", &mem) == 1)
  1090. scnprintf(path, PATH_MAX,
  1091. "%s/devices/system/node/node%lu",
  1092. sysfs__mountpoint(), idx);
  1093. io_dir__init(&dir, open(path, O_CLOEXEC | O_DIRECTORY | O_RDONLY));
  1094. if (dir.dirfd < 0) {
  1095. pr_warning("failed: can't open memory sysfs data '%s'\n", path);
  1096. return -1;
  1097. }
  1098. for_each_memory(phys, dir) {
  1099. size = max(phys, size);
  1100. }
  1101. size++;
  1102. n->set = bitmap_zalloc(size);
  1103. if (!n->set) {
  1104. close(dir.dirfd);
  1105. return -ENOMEM;
  1106. }
  1107. n->node = idx;
  1108. n->size = size;
  1109. io_dir__rewinddir(&dir);
  1110. for_each_memory(phys, dir) {
  1111. __set_bit(phys, n->set);
  1112. }
  1113. close(dir.dirfd);
  1114. return 0;
  1115. }
  1116. static void memory_node__delete_nodes(struct memory_node *nodesp, u64 cnt)
  1117. {
  1118. for (u64 i = 0; i < cnt; i++)
  1119. bitmap_free(nodesp[i].set);
  1120. free(nodesp);
  1121. }
  1122. static int memory_node__sort(const void *a, const void *b)
  1123. {
  1124. const struct memory_node *na = a;
  1125. const struct memory_node *nb = b;
  1126. return na->node - nb->node;
  1127. }
  1128. static int build_mem_topology(struct memory_node **nodesp, u64 *cntp)
  1129. {
  1130. char path[PATH_MAX];
  1131. struct io_dirent64 *ent;
  1132. struct io_dir dir;
  1133. int ret = 0;
  1134. size_t cnt = 0, size = 0;
  1135. struct memory_node *nodes = NULL;
  1136. scnprintf(path, PATH_MAX, "%s/devices/system/node/",
  1137. sysfs__mountpoint());
  1138. io_dir__init(&dir, open(path, O_CLOEXEC | O_DIRECTORY | O_RDONLY));
  1139. if (dir.dirfd < 0) {
  1140. pr_debug2("%s: couldn't read %s, does this arch have topology information?\n",
  1141. __func__, path);
  1142. return -1;
  1143. }
  1144. while (!ret && (ent = io_dir__readdir(&dir))) {
  1145. unsigned int idx;
  1146. int r;
  1147. if (!strcmp(ent->d_name, ".") ||
  1148. !strcmp(ent->d_name, ".."))
  1149. continue;
  1150. r = sscanf(ent->d_name, "node%u", &idx);
  1151. if (r != 1)
  1152. continue;
  1153. if (cnt >= size) {
  1154. struct memory_node *new_nodes =
  1155. reallocarray(nodes, cnt + 4, sizeof(*nodes));
  1156. if (!new_nodes) {
  1157. pr_err("Failed to write MEM_TOPOLOGY, size %zd nodes\n", size);
  1158. ret = -ENOMEM;
  1159. goto out;
  1160. }
  1161. nodes = new_nodes;
  1162. size += 4;
  1163. }
  1164. ret = memory_node__read(&nodes[cnt], idx);
  1165. if (!ret)
  1166. cnt += 1;
  1167. }
  1168. out:
  1169. close(dir.dirfd);
  1170. if (!ret) {
  1171. *cntp = cnt;
  1172. *nodesp = nodes;
  1173. qsort(nodes, cnt, sizeof(nodes[0]), memory_node__sort);
  1174. } else
  1175. memory_node__delete_nodes(nodes, cnt);
  1176. return ret;
  1177. }
  1178. /*
  1179. * The MEM_TOPOLOGY holds physical memory map for every
  1180. * node in system. The format of data is as follows:
  1181. *
  1182. * 0 - version | for future changes
  1183. * 8 - block_size_bytes | /sys/devices/system/memory/block_size_bytes
  1184. * 16 - count | number of nodes
  1185. *
  1186. * For each node we store map of physical indexes for
  1187. * each node:
  1188. *
  1189. * 32 - node id | node index
  1190. * 40 - size | size of bitmap
  1191. * 48 - bitmap | bitmap of memory indexes that belongs to node
  1192. */
  1193. static int write_mem_topology(struct feat_fd *ff __maybe_unused,
  1194. struct evlist *evlist __maybe_unused)
  1195. {
  1196. struct memory_node *nodes = NULL;
  1197. u64 bsize, version = 1, i, nr = 0;
  1198. int ret;
  1199. ret = sysfs__read_xll("devices/system/memory/block_size_bytes",
  1200. (unsigned long long *) &bsize);
  1201. if (ret)
  1202. return ret;
  1203. ret = build_mem_topology(&nodes, &nr);
  1204. if (ret)
  1205. return ret;
  1206. ret = do_write(ff, &version, sizeof(version));
  1207. if (ret < 0)
  1208. goto out;
  1209. ret = do_write(ff, &bsize, sizeof(bsize));
  1210. if (ret < 0)
  1211. goto out;
  1212. ret = do_write(ff, &nr, sizeof(nr));
  1213. if (ret < 0)
  1214. goto out;
  1215. for (i = 0; i < nr; i++) {
  1216. struct memory_node *n = &nodes[i];
  1217. #define _W(v) \
  1218. ret = do_write(ff, &n->v, sizeof(n->v)); \
  1219. if (ret < 0) \
  1220. goto out;
  1221. _W(node)
  1222. _W(size)
  1223. #undef _W
  1224. ret = do_write_bitmap(ff, n->set, n->size);
  1225. if (ret < 0)
  1226. goto out;
  1227. }
  1228. out:
  1229. memory_node__delete_nodes(nodes, nr);
  1230. return ret;
  1231. }
  1232. static int write_compressed(struct feat_fd *ff __maybe_unused,
  1233. struct evlist *evlist __maybe_unused)
  1234. {
  1235. int ret;
  1236. ret = do_write(ff, &(ff->ph->env.comp_ver), sizeof(ff->ph->env.comp_ver));
  1237. if (ret)
  1238. return ret;
  1239. ret = do_write(ff, &(ff->ph->env.comp_type), sizeof(ff->ph->env.comp_type));
  1240. if (ret)
  1241. return ret;
  1242. ret = do_write(ff, &(ff->ph->env.comp_level), sizeof(ff->ph->env.comp_level));
  1243. if (ret)
  1244. return ret;
  1245. ret = do_write(ff, &(ff->ph->env.comp_ratio), sizeof(ff->ph->env.comp_ratio));
  1246. if (ret)
  1247. return ret;
  1248. return do_write(ff, &(ff->ph->env.comp_mmap_len), sizeof(ff->ph->env.comp_mmap_len));
  1249. }
  1250. static int __write_pmu_caps(struct feat_fd *ff, struct perf_pmu *pmu,
  1251. bool write_pmu)
  1252. {
  1253. struct perf_pmu_caps *caps = NULL;
  1254. int ret;
  1255. ret = do_write(ff, &pmu->nr_caps, sizeof(pmu->nr_caps));
  1256. if (ret < 0)
  1257. return ret;
  1258. list_for_each_entry(caps, &pmu->caps, list) {
  1259. ret = do_write_string(ff, caps->name);
  1260. if (ret < 0)
  1261. return ret;
  1262. ret = do_write_string(ff, caps->value);
  1263. if (ret < 0)
  1264. return ret;
  1265. }
  1266. if (write_pmu) {
  1267. ret = do_write_string(ff, pmu->name);
  1268. if (ret < 0)
  1269. return ret;
  1270. }
  1271. return ret;
  1272. }
  1273. static int write_cpu_pmu_caps(struct feat_fd *ff,
  1274. struct evlist *evlist __maybe_unused)
  1275. {
  1276. struct perf_pmu *cpu_pmu = perf_pmus__find_core_pmu();
  1277. int ret;
  1278. if (!cpu_pmu)
  1279. return -ENOENT;
  1280. ret = perf_pmu__caps_parse(cpu_pmu);
  1281. if (ret < 0)
  1282. return ret;
  1283. return __write_pmu_caps(ff, cpu_pmu, false);
  1284. }
  1285. static int write_pmu_caps(struct feat_fd *ff,
  1286. struct evlist *evlist __maybe_unused)
  1287. {
  1288. struct perf_pmu *pmu = NULL;
  1289. int nr_pmu = 0;
  1290. int ret;
  1291. while ((pmu = perf_pmus__scan(pmu))) {
  1292. if (!strcmp(pmu->name, "cpu")) {
  1293. /*
  1294. * The "cpu" PMU is special and covered by
  1295. * HEADER_CPU_PMU_CAPS. Note, core PMUs are
  1296. * counted/written here for ARM, s390 and Intel hybrid.
  1297. */
  1298. continue;
  1299. }
  1300. if (perf_pmu__caps_parse(pmu) <= 0)
  1301. continue;
  1302. nr_pmu++;
  1303. }
  1304. ret = do_write(ff, &nr_pmu, sizeof(nr_pmu));
  1305. if (ret < 0)
  1306. return ret;
  1307. if (!nr_pmu)
  1308. return 0;
  1309. /*
  1310. * Note older perf tools assume core PMUs come first, this is a property
  1311. * of perf_pmus__scan.
  1312. */
  1313. pmu = NULL;
  1314. while ((pmu = perf_pmus__scan(pmu))) {
  1315. if (!strcmp(pmu->name, "cpu")) {
  1316. /* Skip as above. */
  1317. continue;
  1318. }
  1319. if (perf_pmu__caps_parse(pmu) <= 0)
  1320. continue;
  1321. ret = __write_pmu_caps(ff, pmu, true);
  1322. if (ret < 0)
  1323. return ret;
  1324. }
  1325. return 0;
  1326. }
  1327. struct cpu_domain_map **build_cpu_domain_map(u32 *schedstat_version, u32 *max_sched_domains, u32 nr)
  1328. {
  1329. char dname[DNAME_LEN], cpumask[MAX_NR_CPUS];
  1330. struct domain_info *domain_info;
  1331. struct cpu_domain_map **cd_map;
  1332. char cpulist[MAX_NR_CPUS];
  1333. char *line = NULL;
  1334. u32 cpu, domain;
  1335. u32 dcount = 0;
  1336. size_t len;
  1337. FILE *fp;
  1338. fp = fopen("/proc/schedstat", "r");
  1339. if (!fp) {
  1340. pr_err("Failed to open /proc/schedstat\n");
  1341. return NULL;
  1342. }
  1343. cd_map = zalloc(sizeof(*cd_map) * nr);
  1344. if (!cd_map)
  1345. goto out;
  1346. while (getline(&line, &len, fp) > 0) {
  1347. int retval;
  1348. if (strncmp(line, "version", 7) == 0) {
  1349. retval = sscanf(line, "version %d\n", schedstat_version);
  1350. if (retval != 1)
  1351. continue;
  1352. } else if (strncmp(line, "cpu", 3) == 0) {
  1353. retval = sscanf(line, "cpu%u %*s", &cpu);
  1354. if (retval == 1) {
  1355. cd_map[cpu] = zalloc(sizeof(*cd_map[cpu]));
  1356. if (!cd_map[cpu])
  1357. goto out_free_line;
  1358. cd_map[cpu]->cpu = cpu;
  1359. } else
  1360. continue;
  1361. dcount = 0;
  1362. } else if (strncmp(line, "domain", 6) == 0) {
  1363. struct domain_info **temp_domains;
  1364. dcount++;
  1365. temp_domains = realloc(cd_map[cpu]->domains, dcount * sizeof(domain_info));
  1366. if (!temp_domains)
  1367. goto out_free_line;
  1368. else
  1369. cd_map[cpu]->domains = temp_domains;
  1370. domain_info = zalloc(sizeof(*domain_info));
  1371. if (!domain_info)
  1372. goto out_free_line;
  1373. cd_map[cpu]->domains[dcount - 1] = domain_info;
  1374. if (*schedstat_version >= 17) {
  1375. retval = sscanf(line, "domain%u %s %s %*s", &domain, dname,
  1376. cpumask);
  1377. if (retval != 3)
  1378. continue;
  1379. domain_info->dname = strdup(dname);
  1380. if (!domain_info->dname)
  1381. goto out_free_line;
  1382. } else {
  1383. retval = sscanf(line, "domain%u %s %*s", &domain, cpumask);
  1384. if (retval != 2)
  1385. continue;
  1386. }
  1387. domain_info->domain = domain;
  1388. if (domain > *max_sched_domains)
  1389. *max_sched_domains = domain;
  1390. domain_info->cpumask = strdup(cpumask);
  1391. if (!domain_info->cpumask)
  1392. goto out_free_line;
  1393. cpumask_to_cpulist(cpumask, cpulist);
  1394. domain_info->cpulist = strdup(cpulist);
  1395. if (!domain_info->cpulist)
  1396. goto out_free_line;
  1397. cd_map[cpu]->nr_domains = dcount;
  1398. }
  1399. }
  1400. out_free_line:
  1401. free(line);
  1402. out:
  1403. fclose(fp);
  1404. return cd_map;
  1405. }
  1406. static int write_cpu_domain_info(struct feat_fd *ff,
  1407. struct evlist *evlist __maybe_unused)
  1408. {
  1409. u32 max_sched_domains = 0, schedstat_version = 0;
  1410. struct cpu_domain_map **cd_map;
  1411. u32 i, j, nr, ret;
  1412. nr = cpu__max_present_cpu().cpu;
  1413. cd_map = build_cpu_domain_map(&schedstat_version, &max_sched_domains, nr);
  1414. if (!cd_map)
  1415. return -1;
  1416. ret = do_write(ff, &schedstat_version, sizeof(u32));
  1417. if (ret < 0)
  1418. goto out;
  1419. max_sched_domains += 1;
  1420. ret = do_write(ff, &max_sched_domains, sizeof(u32));
  1421. if (ret < 0)
  1422. goto out;
  1423. for (i = 0; i < nr; i++) {
  1424. if (!cd_map[i])
  1425. continue;
  1426. ret = do_write(ff, &cd_map[i]->cpu, sizeof(u32));
  1427. if (ret < 0)
  1428. goto out;
  1429. ret = do_write(ff, &cd_map[i]->nr_domains, sizeof(u32));
  1430. if (ret < 0)
  1431. goto out;
  1432. for (j = 0; j < cd_map[i]->nr_domains; j++) {
  1433. ret = do_write(ff, &cd_map[i]->domains[j]->domain, sizeof(u32));
  1434. if (ret < 0)
  1435. goto out;
  1436. if (schedstat_version >= 17) {
  1437. ret = do_write_string(ff, cd_map[i]->domains[j]->dname);
  1438. if (ret < 0)
  1439. goto out;
  1440. }
  1441. ret = do_write_string(ff, cd_map[i]->domains[j]->cpumask);
  1442. if (ret < 0)
  1443. goto out;
  1444. ret = do_write_string(ff, cd_map[i]->domains[j]->cpulist);
  1445. if (ret < 0)
  1446. goto out;
  1447. }
  1448. }
  1449. out:
  1450. free_cpu_domain_info(cd_map, schedstat_version, nr);
  1451. return ret;
  1452. }
  1453. static void print_hostname(struct feat_fd *ff, FILE *fp)
  1454. {
  1455. fprintf(fp, "# hostname : %s\n", ff->ph->env.hostname);
  1456. }
  1457. static void print_osrelease(struct feat_fd *ff, FILE *fp)
  1458. {
  1459. fprintf(fp, "# os release : %s\n", ff->ph->env.os_release);
  1460. }
  1461. static void print_arch(struct feat_fd *ff, FILE *fp)
  1462. {
  1463. fprintf(fp, "# arch : %s\n", ff->ph->env.arch);
  1464. }
  1465. static void print_e_machine(struct feat_fd *ff, FILE *fp)
  1466. {
  1467. fprintf(fp, "# e_machine : %u\n", ff->ph->env.e_machine);
  1468. fprintf(fp, "# e_flags : %u\n", ff->ph->env.e_flags);
  1469. }
  1470. static void print_cpudesc(struct feat_fd *ff, FILE *fp)
  1471. {
  1472. fprintf(fp, "# cpudesc : %s\n", ff->ph->env.cpu_desc);
  1473. }
  1474. static void print_nrcpus(struct feat_fd *ff, FILE *fp)
  1475. {
  1476. fprintf(fp, "# nrcpus online : %u\n", ff->ph->env.nr_cpus_online);
  1477. fprintf(fp, "# nrcpus avail : %u\n", ff->ph->env.nr_cpus_avail);
  1478. }
  1479. static void print_version(struct feat_fd *ff, FILE *fp)
  1480. {
  1481. fprintf(fp, "# perf version : %s\n", ff->ph->env.version);
  1482. }
  1483. static void print_cmdline(struct feat_fd *ff, FILE *fp)
  1484. {
  1485. int nr, i;
  1486. nr = ff->ph->env.nr_cmdline;
  1487. fprintf(fp, "# cmdline : ");
  1488. for (i = 0; i < nr; i++) {
  1489. char *argv_i = strdup(ff->ph->env.cmdline_argv[i]);
  1490. if (!argv_i) {
  1491. fprintf(fp, "%s ", ff->ph->env.cmdline_argv[i]);
  1492. } else {
  1493. char *mem = argv_i;
  1494. do {
  1495. char *quote = strchr(argv_i, '\'');
  1496. if (!quote)
  1497. break;
  1498. *quote++ = '\0';
  1499. fprintf(fp, "%s\\\'", argv_i);
  1500. argv_i = quote;
  1501. } while (1);
  1502. fprintf(fp, "%s ", argv_i);
  1503. free(mem);
  1504. }
  1505. }
  1506. fputc('\n', fp);
  1507. }
  1508. static void print_cpu_topology(struct feat_fd *ff, FILE *fp)
  1509. {
  1510. struct perf_header *ph = ff->ph;
  1511. int cpu_nr = ph->env.nr_cpus_avail;
  1512. int nr, i;
  1513. char *str;
  1514. nr = ph->env.nr_sibling_cores;
  1515. str = ph->env.sibling_cores;
  1516. for (i = 0; i < nr; i++) {
  1517. fprintf(fp, "# sibling sockets : %s\n", str);
  1518. str += strlen(str) + 1;
  1519. }
  1520. if (ph->env.nr_sibling_dies) {
  1521. nr = ph->env.nr_sibling_dies;
  1522. str = ph->env.sibling_dies;
  1523. for (i = 0; i < nr; i++) {
  1524. fprintf(fp, "# sibling dies : %s\n", str);
  1525. str += strlen(str) + 1;
  1526. }
  1527. }
  1528. nr = ph->env.nr_sibling_threads;
  1529. str = ph->env.sibling_threads;
  1530. for (i = 0; i < nr; i++) {
  1531. fprintf(fp, "# sibling threads : %s\n", str);
  1532. str += strlen(str) + 1;
  1533. }
  1534. if (ph->env.nr_sibling_dies) {
  1535. if (ph->env.cpu != NULL) {
  1536. for (i = 0; i < cpu_nr; i++)
  1537. fprintf(fp, "# CPU %d: Core ID %d, "
  1538. "Die ID %d, Socket ID %d\n",
  1539. i, ph->env.cpu[i].core_id,
  1540. ph->env.cpu[i].die_id,
  1541. ph->env.cpu[i].socket_id);
  1542. } else
  1543. fprintf(fp, "# Core ID, Die ID and Socket ID "
  1544. "information is not available\n");
  1545. } else {
  1546. if (ph->env.cpu != NULL) {
  1547. for (i = 0; i < cpu_nr; i++)
  1548. fprintf(fp, "# CPU %d: Core ID %d, "
  1549. "Socket ID %d\n",
  1550. i, ph->env.cpu[i].core_id,
  1551. ph->env.cpu[i].socket_id);
  1552. } else
  1553. fprintf(fp, "# Core ID and Socket ID "
  1554. "information is not available\n");
  1555. }
  1556. }
  1557. static void print_clockid(struct feat_fd *ff, FILE *fp)
  1558. {
  1559. fprintf(fp, "# clockid frequency: %"PRIu64" MHz\n",
  1560. ff->ph->env.clock.clockid_res_ns * 1000);
  1561. }
  1562. static void print_clock_data(struct feat_fd *ff, FILE *fp)
  1563. {
  1564. struct timespec clockid_ns;
  1565. char tstr[64], date[64];
  1566. struct timeval tod_ns;
  1567. clockid_t clockid;
  1568. struct tm ltime;
  1569. u64 ref;
  1570. if (!ff->ph->env.clock.enabled) {
  1571. fprintf(fp, "# reference time disabled\n");
  1572. return;
  1573. }
  1574. /* Compute TOD time. */
  1575. ref = ff->ph->env.clock.tod_ns;
  1576. tod_ns.tv_sec = ref / NSEC_PER_SEC;
  1577. ref -= tod_ns.tv_sec * NSEC_PER_SEC;
  1578. tod_ns.tv_usec = ref / NSEC_PER_USEC;
  1579. /* Compute clockid time. */
  1580. ref = ff->ph->env.clock.clockid_ns;
  1581. clockid_ns.tv_sec = ref / NSEC_PER_SEC;
  1582. ref -= clockid_ns.tv_sec * NSEC_PER_SEC;
  1583. clockid_ns.tv_nsec = ref;
  1584. clockid = ff->ph->env.clock.clockid;
  1585. if (localtime_r(&tod_ns.tv_sec, &ltime) == NULL)
  1586. snprintf(tstr, sizeof(tstr), "<error>");
  1587. else {
  1588. strftime(date, sizeof(date), "%F %T", &ltime);
  1589. scnprintf(tstr, sizeof(tstr), "%s.%06d",
  1590. date, (int) tod_ns.tv_usec);
  1591. }
  1592. fprintf(fp, "# clockid: %s (%u)\n", clockid_name(clockid), clockid);
  1593. fprintf(fp, "# reference time: %s = %ld.%06d (TOD) = %ld.%09ld (%s)\n",
  1594. tstr, (long) tod_ns.tv_sec, (int) tod_ns.tv_usec,
  1595. (long) clockid_ns.tv_sec, clockid_ns.tv_nsec,
  1596. clockid_name(clockid));
  1597. }
  1598. static void print_hybrid_topology(struct feat_fd *ff, FILE *fp)
  1599. {
  1600. int i;
  1601. struct hybrid_node *n;
  1602. fprintf(fp, "# hybrid cpu system:\n");
  1603. for (i = 0; i < ff->ph->env.nr_hybrid_nodes; i++) {
  1604. n = &ff->ph->env.hybrid_nodes[i];
  1605. fprintf(fp, "# %s cpu list : %s\n", n->pmu_name, n->cpus);
  1606. }
  1607. }
  1608. static void print_dir_format(struct feat_fd *ff, FILE *fp)
  1609. {
  1610. struct perf_session *session;
  1611. struct perf_data *data;
  1612. session = container_of(ff->ph, struct perf_session, header);
  1613. data = session->data;
  1614. fprintf(fp, "# directory data version : %"PRIu64"\n", data->dir.version);
  1615. }
  1616. #ifdef HAVE_LIBBPF_SUPPORT
  1617. static void print_bpf_prog_info(struct feat_fd *ff, FILE *fp)
  1618. {
  1619. struct perf_env *env = &ff->ph->env;
  1620. struct rb_root *root;
  1621. struct rb_node *next;
  1622. down_read(&env->bpf_progs.lock);
  1623. root = &env->bpf_progs.infos;
  1624. next = rb_first(root);
  1625. if (!next)
  1626. printf("# bpf_prog_info empty\n");
  1627. while (next) {
  1628. struct bpf_prog_info_node *node;
  1629. node = rb_entry(next, struct bpf_prog_info_node, rb_node);
  1630. next = rb_next(&node->rb_node);
  1631. __bpf_event__print_bpf_prog_info(&node->info_linear->info,
  1632. env, fp);
  1633. }
  1634. up_read(&env->bpf_progs.lock);
  1635. }
  1636. static void print_bpf_btf(struct feat_fd *ff, FILE *fp)
  1637. {
  1638. struct perf_env *env = &ff->ph->env;
  1639. struct rb_root *root;
  1640. struct rb_node *next;
  1641. down_read(&env->bpf_progs.lock);
  1642. root = &env->bpf_progs.btfs;
  1643. next = rb_first(root);
  1644. if (!next)
  1645. printf("# btf info empty\n");
  1646. while (next) {
  1647. struct btf_node *node;
  1648. node = rb_entry(next, struct btf_node, rb_node);
  1649. next = rb_next(&node->rb_node);
  1650. fprintf(fp, "# btf info of id %u\n", node->id);
  1651. }
  1652. up_read(&env->bpf_progs.lock);
  1653. }
  1654. #endif // HAVE_LIBBPF_SUPPORT
  1655. static void free_event_desc(struct evsel *events)
  1656. {
  1657. struct evsel *evsel;
  1658. if (!events)
  1659. return;
  1660. for (evsel = events; evsel->core.attr.size; evsel++) {
  1661. zfree(&evsel->name);
  1662. zfree(&evsel->core.id);
  1663. }
  1664. free(events);
  1665. }
  1666. static bool perf_attr_check(struct perf_event_attr *attr)
  1667. {
  1668. if (attr->__reserved_1 || attr->__reserved_2 || attr->__reserved_3) {
  1669. pr_warning("Reserved bits are set unexpectedly. "
  1670. "Please update perf tool.\n");
  1671. return false;
  1672. }
  1673. if (attr->sample_type & ~(PERF_SAMPLE_MAX-1)) {
  1674. pr_warning("Unknown sample type (0x%llx) is detected. "
  1675. "Please update perf tool.\n",
  1676. attr->sample_type);
  1677. return false;
  1678. }
  1679. if (attr->read_format & ~(PERF_FORMAT_MAX-1)) {
  1680. pr_warning("Unknown read format (0x%llx) is detected. "
  1681. "Please update perf tool.\n",
  1682. attr->read_format);
  1683. return false;
  1684. }
  1685. if ((attr->sample_type & PERF_SAMPLE_BRANCH_STACK) &&
  1686. (attr->branch_sample_type & ~(PERF_SAMPLE_BRANCH_MAX-1))) {
  1687. pr_warning("Unknown branch sample type (0x%llx) is detected. "
  1688. "Please update perf tool.\n",
  1689. attr->branch_sample_type);
  1690. return false;
  1691. }
  1692. return true;
  1693. }
  1694. static struct evsel *read_event_desc(struct feat_fd *ff)
  1695. {
  1696. struct evsel *evsel, *events = NULL;
  1697. u64 *id;
  1698. void *buf = NULL;
  1699. u32 nre, sz, nr, i, j;
  1700. size_t msz;
  1701. /* number of events */
  1702. if (do_read_u32(ff, &nre))
  1703. goto error;
  1704. if (do_read_u32(ff, &sz))
  1705. goto error;
  1706. /* buffer to hold on file attr struct */
  1707. buf = malloc(sz);
  1708. if (!buf)
  1709. goto error;
  1710. /* the last event terminates with evsel->core.attr.size == 0: */
  1711. events = calloc(nre + 1, sizeof(*events));
  1712. if (!events)
  1713. goto error;
  1714. msz = sizeof(evsel->core.attr);
  1715. if (sz < msz)
  1716. msz = sz;
  1717. for (i = 0, evsel = events; i < nre; evsel++, i++) {
  1718. evsel->core.idx = i;
  1719. /*
  1720. * must read entire on-file attr struct to
  1721. * sync up with layout.
  1722. */
  1723. if (__do_read(ff, buf, sz))
  1724. goto error;
  1725. if (ff->ph->needs_swap)
  1726. perf_event__attr_swap(buf);
  1727. memcpy(&evsel->core.attr, buf, msz);
  1728. if (!perf_attr_check(&evsel->core.attr))
  1729. goto error;
  1730. if (do_read_u32(ff, &nr))
  1731. goto error;
  1732. if (ff->ph->needs_swap)
  1733. evsel->needs_swap = true;
  1734. evsel->name = do_read_string(ff);
  1735. if (!evsel->name)
  1736. goto error;
  1737. if (!nr)
  1738. continue;
  1739. id = calloc(nr, sizeof(*id));
  1740. if (!id)
  1741. goto error;
  1742. evsel->core.ids = nr;
  1743. evsel->core.id = id;
  1744. for (j = 0 ; j < nr; j++) {
  1745. if (do_read_u64(ff, id))
  1746. goto error;
  1747. id++;
  1748. }
  1749. }
  1750. out:
  1751. free(buf);
  1752. return events;
  1753. error:
  1754. free_event_desc(events);
  1755. events = NULL;
  1756. goto out;
  1757. }
  1758. static int __desc_attr__fprintf(FILE *fp, const char *name, const char *val,
  1759. void *priv __maybe_unused)
  1760. {
  1761. return fprintf(fp, ", %s = %s", name, val);
  1762. }
  1763. static void print_event_desc(struct feat_fd *ff, FILE *fp)
  1764. {
  1765. struct evsel *evsel, *events;
  1766. u32 j;
  1767. u64 *id;
  1768. if (ff->events)
  1769. events = ff->events;
  1770. else
  1771. events = read_event_desc(ff);
  1772. if (!events) {
  1773. fprintf(fp, "# event desc: not available or unable to read\n");
  1774. return;
  1775. }
  1776. for (evsel = events; evsel->core.attr.size; evsel++) {
  1777. fprintf(fp, "# event : name = %s, ", evsel->name);
  1778. if (evsel->core.ids) {
  1779. fprintf(fp, ", id = {");
  1780. for (j = 0, id = evsel->core.id; j < evsel->core.ids; j++, id++) {
  1781. if (j)
  1782. fputc(',', fp);
  1783. fprintf(fp, " %"PRIu64, *id);
  1784. }
  1785. fprintf(fp, " }");
  1786. }
  1787. perf_event_attr__fprintf(fp, &evsel->core.attr, __desc_attr__fprintf, NULL);
  1788. fputc('\n', fp);
  1789. }
  1790. free_event_desc(events);
  1791. ff->events = NULL;
  1792. }
  1793. static void print_total_mem(struct feat_fd *ff, FILE *fp)
  1794. {
  1795. fprintf(fp, "# total memory : %llu kB\n", ff->ph->env.total_mem);
  1796. }
  1797. static void print_numa_topology(struct feat_fd *ff, FILE *fp)
  1798. {
  1799. int i;
  1800. struct numa_node *n;
  1801. for (i = 0; i < ff->ph->env.nr_numa_nodes; i++) {
  1802. n = &ff->ph->env.numa_nodes[i];
  1803. fprintf(fp, "# node%u meminfo : total = %"PRIu64" kB,"
  1804. " free = %"PRIu64" kB\n",
  1805. n->node, n->mem_total, n->mem_free);
  1806. fprintf(fp, "# node%u cpu list : ", n->node);
  1807. cpu_map__fprintf(n->map, fp);
  1808. }
  1809. }
  1810. static void print_cpuid(struct feat_fd *ff, FILE *fp)
  1811. {
  1812. fprintf(fp, "# cpuid : %s\n", ff->ph->env.cpuid);
  1813. }
  1814. static void print_branch_stack(struct feat_fd *ff __maybe_unused, FILE *fp)
  1815. {
  1816. fprintf(fp, "# contains samples with branch stack\n");
  1817. }
  1818. static void print_auxtrace(struct feat_fd *ff __maybe_unused, FILE *fp)
  1819. {
  1820. fprintf(fp, "# contains AUX area data (e.g. instruction trace)\n");
  1821. }
  1822. static void print_stat(struct feat_fd *ff __maybe_unused, FILE *fp)
  1823. {
  1824. fprintf(fp, "# contains stat data\n");
  1825. }
  1826. static void print_cache(struct feat_fd *ff, FILE *fp __maybe_unused)
  1827. {
  1828. int i;
  1829. fprintf(fp, "# CPU cache info:\n");
  1830. for (i = 0; i < ff->ph->env.caches_cnt; i++) {
  1831. fprintf(fp, "# ");
  1832. cpu_cache_level__fprintf(fp, &ff->ph->env.caches[i]);
  1833. }
  1834. }
  1835. static void print_compressed(struct feat_fd *ff, FILE *fp)
  1836. {
  1837. fprintf(fp, "# compressed : %s, level = %d, ratio = %d\n",
  1838. ff->ph->env.comp_type == PERF_COMP_ZSTD ? "Zstd" : "Unknown",
  1839. ff->ph->env.comp_level, ff->ph->env.comp_ratio);
  1840. }
  1841. static void __print_pmu_caps(FILE *fp, int nr_caps, char **caps, char *pmu_name)
  1842. {
  1843. const char *delimiter = "";
  1844. int i;
  1845. if (!nr_caps) {
  1846. fprintf(fp, "# %s pmu capabilities: not available\n", pmu_name);
  1847. return;
  1848. }
  1849. fprintf(fp, "# %s pmu capabilities: ", pmu_name);
  1850. for (i = 0; i < nr_caps; i++) {
  1851. fprintf(fp, "%s%s", delimiter, caps[i]);
  1852. delimiter = ", ";
  1853. }
  1854. fprintf(fp, "\n");
  1855. }
  1856. static void print_cpu_pmu_caps(struct feat_fd *ff, FILE *fp)
  1857. {
  1858. __print_pmu_caps(fp, ff->ph->env.nr_cpu_pmu_caps,
  1859. ff->ph->env.cpu_pmu_caps, (char *)"cpu");
  1860. }
  1861. static void print_pmu_caps(struct feat_fd *ff, FILE *fp)
  1862. {
  1863. struct perf_env *env = &ff->ph->env;
  1864. struct pmu_caps *pmu_caps;
  1865. for (int i = 0; i < env->nr_pmus_with_caps; i++) {
  1866. pmu_caps = &env->pmu_caps[i];
  1867. __print_pmu_caps(fp, pmu_caps->nr_caps, pmu_caps->caps,
  1868. pmu_caps->pmu_name);
  1869. }
  1870. if (strcmp(perf_env__arch(env), "x86") == 0 &&
  1871. perf_env__has_pmu_mapping(env, "ibs_op")) {
  1872. char *max_precise = perf_env__find_pmu_cap(env, "cpu", "max_precise");
  1873. if (max_precise != NULL && atoi(max_precise) == 0)
  1874. fprintf(fp, "# AMD systems uses ibs_op// PMU for some precise events, e.g.: cycles:p, see the 'perf list' man page for further details.\n");
  1875. }
  1876. }
  1877. static void print_pmu_mappings(struct feat_fd *ff, FILE *fp)
  1878. {
  1879. struct perf_env *env = &ff->ph->env;
  1880. const char *delimiter = "# pmu mappings: ";
  1881. char *str, *tmp;
  1882. u32 pmu_num;
  1883. u32 type;
  1884. pmu_num = env->nr_pmu_mappings;
  1885. if (!pmu_num) {
  1886. fprintf(fp, "# pmu mappings: not available\n");
  1887. return;
  1888. }
  1889. str = env->pmu_mappings;
  1890. while (pmu_num) {
  1891. type = strtoul(str, &tmp, 0);
  1892. if (*tmp != ':')
  1893. goto error;
  1894. str = tmp + 1;
  1895. fprintf(fp, "%s%s = %" PRIu32, delimiter, str, type);
  1896. delimiter = ", ";
  1897. str += strlen(str) + 1;
  1898. pmu_num--;
  1899. }
  1900. fprintf(fp, "\n");
  1901. if (!pmu_num)
  1902. return;
  1903. error:
  1904. fprintf(fp, "# pmu mappings: unable to read\n");
  1905. }
  1906. static void print_group_desc(struct feat_fd *ff, FILE *fp)
  1907. {
  1908. struct perf_session *session;
  1909. struct evsel *evsel;
  1910. u32 nr = 0;
  1911. session = container_of(ff->ph, struct perf_session, header);
  1912. evlist__for_each_entry(session->evlist, evsel) {
  1913. if (evsel__is_group_leader(evsel) && evsel->core.nr_members > 1) {
  1914. fprintf(fp, "# group: %s{%s", evsel->group_name ?: "", evsel__name(evsel));
  1915. nr = evsel->core.nr_members - 1;
  1916. } else if (nr) {
  1917. fprintf(fp, ",%s", evsel__name(evsel));
  1918. if (--nr == 0)
  1919. fprintf(fp, "}\n");
  1920. }
  1921. }
  1922. }
  1923. static void print_sample_time(struct feat_fd *ff, FILE *fp)
  1924. {
  1925. struct perf_session *session;
  1926. char time_buf[32];
  1927. double d;
  1928. session = container_of(ff->ph, struct perf_session, header);
  1929. timestamp__scnprintf_usec(session->evlist->first_sample_time,
  1930. time_buf, sizeof(time_buf));
  1931. fprintf(fp, "# time of first sample : %s\n", time_buf);
  1932. timestamp__scnprintf_usec(session->evlist->last_sample_time,
  1933. time_buf, sizeof(time_buf));
  1934. fprintf(fp, "# time of last sample : %s\n", time_buf);
  1935. d = (double)(session->evlist->last_sample_time -
  1936. session->evlist->first_sample_time) / NSEC_PER_MSEC;
  1937. fprintf(fp, "# sample duration : %10.3f ms\n", d);
  1938. }
  1939. static void memory_node__fprintf(struct memory_node *n,
  1940. unsigned long long bsize, FILE *fp)
  1941. {
  1942. char buf_map[100], buf_size[50];
  1943. unsigned long long size;
  1944. size = bsize * bitmap_weight(n->set, n->size);
  1945. unit_number__scnprintf(buf_size, 50, size);
  1946. bitmap_scnprintf(n->set, n->size, buf_map, 100);
  1947. fprintf(fp, "# %3" PRIu64 " [%s]: %s\n", n->node, buf_size, buf_map);
  1948. }
  1949. static void print_mem_topology(struct feat_fd *ff, FILE *fp)
  1950. {
  1951. struct perf_env *env = &ff->ph->env;
  1952. struct memory_node *nodes;
  1953. int i, nr;
  1954. nodes = env->memory_nodes;
  1955. nr = env->nr_memory_nodes;
  1956. fprintf(fp, "# memory nodes (nr %d, block size 0x%llx):\n",
  1957. nr, env->memory_bsize);
  1958. for (i = 0; i < nr; i++) {
  1959. memory_node__fprintf(&nodes[i], env->memory_bsize, fp);
  1960. }
  1961. }
  1962. static void print_cpu_domain_info(struct feat_fd *ff, FILE *fp)
  1963. {
  1964. struct cpu_domain_map **cd_map = ff->ph->env.cpu_domain;
  1965. u32 nr = ff->ph->env.nr_cpus_avail;
  1966. struct domain_info *d_info;
  1967. u32 i, j;
  1968. fprintf(fp, "# schedstat version : %u\n", ff->ph->env.schedstat_version);
  1969. fprintf(fp, "# Maximum sched domains : %u\n", ff->ph->env.max_sched_domains);
  1970. for (i = 0; i < nr; i++) {
  1971. if (!cd_map[i])
  1972. continue;
  1973. fprintf(fp, "# cpu : %u\n", cd_map[i]->cpu);
  1974. fprintf(fp, "# nr_domains : %u\n", cd_map[i]->nr_domains);
  1975. for (j = 0; j < cd_map[i]->nr_domains; j++) {
  1976. d_info = cd_map[i]->domains[j];
  1977. if (!d_info)
  1978. continue;
  1979. fprintf(fp, "# Domain : %u\n", d_info->domain);
  1980. if (ff->ph->env.schedstat_version >= 17)
  1981. fprintf(fp, "# Domain name : %s\n", d_info->dname);
  1982. fprintf(fp, "# Domain cpu map : %s\n", d_info->cpumask);
  1983. fprintf(fp, "# Domain cpu list : %s\n", d_info->cpulist);
  1984. }
  1985. }
  1986. }
  1987. static int __event_process_build_id(struct perf_record_header_build_id *bev,
  1988. char *filename,
  1989. struct perf_session *session)
  1990. {
  1991. int err = -1;
  1992. struct machine *machine;
  1993. u16 cpumode;
  1994. struct dso *dso;
  1995. enum dso_space_type dso_space;
  1996. machine = perf_session__findnew_machine(session, bev->pid);
  1997. if (!machine)
  1998. goto out;
  1999. cpumode = bev->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
  2000. switch (cpumode) {
  2001. case PERF_RECORD_MISC_KERNEL:
  2002. dso_space = DSO_SPACE__KERNEL;
  2003. break;
  2004. case PERF_RECORD_MISC_GUEST_KERNEL:
  2005. dso_space = DSO_SPACE__KERNEL_GUEST;
  2006. break;
  2007. case PERF_RECORD_MISC_USER:
  2008. case PERF_RECORD_MISC_GUEST_USER:
  2009. dso_space = DSO_SPACE__USER;
  2010. break;
  2011. default:
  2012. goto out;
  2013. }
  2014. dso = machine__findnew_dso(machine, filename);
  2015. if (dso != NULL) {
  2016. char sbuild_id[SBUILD_ID_SIZE];
  2017. struct build_id bid;
  2018. size_t size = BUILD_ID_SIZE;
  2019. if (bev->header.misc & PERF_RECORD_MISC_BUILD_ID_SIZE)
  2020. size = bev->size;
  2021. build_id__init(&bid, bev->data, size);
  2022. dso__set_build_id(dso, &bid);
  2023. dso__set_header_build_id(dso, true);
  2024. if (dso_space != DSO_SPACE__USER) {
  2025. struct kmod_path m = { .name = NULL, };
  2026. if (!kmod_path__parse_name(&m, filename) && m.kmod)
  2027. dso__set_module_info(dso, &m, machine);
  2028. dso__set_kernel(dso, dso_space);
  2029. free(m.name);
  2030. }
  2031. build_id__snprintf(dso__bid(dso), sbuild_id, sizeof(sbuild_id));
  2032. pr_debug("build id event received for %s: %s [%zu]\n",
  2033. dso__long_name(dso), sbuild_id, size);
  2034. dso__put(dso);
  2035. }
  2036. err = 0;
  2037. out:
  2038. return err;
  2039. }
  2040. static int perf_header__read_build_ids_abi_quirk(struct perf_header *header,
  2041. int input, u64 offset, u64 size)
  2042. {
  2043. struct perf_session *session = container_of(header, struct perf_session, header);
  2044. struct {
  2045. struct perf_event_header header;
  2046. u8 build_id[PERF_ALIGN(BUILD_ID_SIZE, sizeof(u64))];
  2047. char filename[0];
  2048. } old_bev;
  2049. struct perf_record_header_build_id bev;
  2050. char filename[PATH_MAX];
  2051. u64 limit = offset + size;
  2052. while (offset < limit) {
  2053. ssize_t len;
  2054. if (readn(input, &old_bev, sizeof(old_bev)) != sizeof(old_bev))
  2055. return -1;
  2056. if (header->needs_swap)
  2057. perf_event_header__bswap(&old_bev.header);
  2058. len = old_bev.header.size - sizeof(old_bev);
  2059. if (readn(input, filename, len) != len)
  2060. return -1;
  2061. bev.header = old_bev.header;
  2062. /*
  2063. * As the pid is the missing value, we need to fill
  2064. * it properly. The header.misc value give us nice hint.
  2065. */
  2066. bev.pid = HOST_KERNEL_ID;
  2067. if (bev.header.misc == PERF_RECORD_MISC_GUEST_USER ||
  2068. bev.header.misc == PERF_RECORD_MISC_GUEST_KERNEL)
  2069. bev.pid = DEFAULT_GUEST_KERNEL_ID;
  2070. memcpy(bev.build_id, old_bev.build_id, sizeof(bev.build_id));
  2071. __event_process_build_id(&bev, filename, session);
  2072. offset += bev.header.size;
  2073. }
  2074. return 0;
  2075. }
  2076. static int perf_header__read_build_ids(struct perf_header *header,
  2077. int input, u64 offset, u64 size)
  2078. {
  2079. struct perf_session *session = container_of(header, struct perf_session, header);
  2080. struct perf_record_header_build_id bev;
  2081. char filename[PATH_MAX];
  2082. u64 limit = offset + size, orig_offset = offset;
  2083. int err = -1;
  2084. while (offset < limit) {
  2085. ssize_t len;
  2086. if (readn(input, &bev, sizeof(bev)) != sizeof(bev))
  2087. goto out;
  2088. if (header->needs_swap)
  2089. perf_event_header__bswap(&bev.header);
  2090. len = bev.header.size - sizeof(bev);
  2091. if (readn(input, filename, len) != len)
  2092. goto out;
  2093. /*
  2094. * The a1645ce1 changeset:
  2095. *
  2096. * "perf: 'perf kvm' tool for monitoring guest performance from host"
  2097. *
  2098. * Added a field to struct perf_record_header_build_id that broke the file
  2099. * format.
  2100. *
  2101. * Since the kernel build-id is the first entry, process the
  2102. * table using the old format if the well known
  2103. * '[kernel.kallsyms]' string for the kernel build-id has the
  2104. * first 4 characters chopped off (where the pid_t sits).
  2105. */
  2106. if (memcmp(filename, "nel.kallsyms]", 13) == 0) {
  2107. if (lseek(input, orig_offset, SEEK_SET) == (off_t)-1)
  2108. return -1;
  2109. return perf_header__read_build_ids_abi_quirk(header, input, offset, size);
  2110. }
  2111. __event_process_build_id(&bev, filename, session);
  2112. offset += bev.header.size;
  2113. }
  2114. err = 0;
  2115. out:
  2116. return err;
  2117. }
  2118. /* Macro for features that simply need to read and store a string. */
  2119. #define FEAT_PROCESS_STR_FUN(__feat, __feat_env) \
  2120. static int process_##__feat(struct feat_fd *ff, void *data __maybe_unused) \
  2121. {\
  2122. free(ff->ph->env.__feat_env); \
  2123. ff->ph->env.__feat_env = do_read_string(ff); \
  2124. return ff->ph->env.__feat_env ? 0 : -ENOMEM; \
  2125. }
  2126. FEAT_PROCESS_STR_FUN(hostname, hostname);
  2127. FEAT_PROCESS_STR_FUN(osrelease, os_release);
  2128. FEAT_PROCESS_STR_FUN(version, version);
  2129. FEAT_PROCESS_STR_FUN(arch, arch);
  2130. FEAT_PROCESS_STR_FUN(cpudesc, cpu_desc);
  2131. FEAT_PROCESS_STR_FUN(cpuid, cpuid);
  2132. static int process_e_machine(struct feat_fd *ff, void *data __maybe_unused)
  2133. {
  2134. int ret;
  2135. ret = do_read_u32(ff, &ff->ph->env.e_machine);
  2136. if (ret)
  2137. return ret;
  2138. return do_read_u32(ff, &ff->ph->env.e_flags);
  2139. }
  2140. #ifdef HAVE_LIBTRACEEVENT
  2141. static int process_tracing_data(struct feat_fd *ff, void *data)
  2142. {
  2143. ssize_t ret = trace_report(ff->fd, data, false);
  2144. return ret < 0 ? -1 : 0;
  2145. }
  2146. #endif
  2147. static int process_build_id(struct feat_fd *ff, void *data __maybe_unused)
  2148. {
  2149. if (perf_header__read_build_ids(ff->ph, ff->fd, ff->offset, ff->size))
  2150. pr_debug("Failed to read buildids, continuing...\n");
  2151. return 0;
  2152. }
  2153. static int process_nrcpus(struct feat_fd *ff, void *data __maybe_unused)
  2154. {
  2155. struct perf_env *env = &ff->ph->env;
  2156. int ret;
  2157. u32 nr_cpus_avail, nr_cpus_online;
  2158. ret = do_read_u32(ff, &nr_cpus_avail);
  2159. if (ret)
  2160. return ret;
  2161. ret = do_read_u32(ff, &nr_cpus_online);
  2162. if (ret)
  2163. return ret;
  2164. env->nr_cpus_avail = (int)nr_cpus_avail;
  2165. env->nr_cpus_online = (int)nr_cpus_online;
  2166. return 0;
  2167. }
  2168. static int process_total_mem(struct feat_fd *ff, void *data __maybe_unused)
  2169. {
  2170. struct perf_env *env = &ff->ph->env;
  2171. u64 total_mem;
  2172. int ret;
  2173. ret = do_read_u64(ff, &total_mem);
  2174. if (ret)
  2175. return -1;
  2176. env->total_mem = (unsigned long long)total_mem;
  2177. return 0;
  2178. }
  2179. static struct evsel *evlist__find_by_index(struct evlist *evlist, int idx)
  2180. {
  2181. struct evsel *evsel;
  2182. evlist__for_each_entry(evlist, evsel) {
  2183. if (evsel->core.idx == idx)
  2184. return evsel;
  2185. }
  2186. return NULL;
  2187. }
  2188. static void evlist__set_event_name(struct evlist *evlist, struct evsel *event)
  2189. {
  2190. struct evsel *evsel;
  2191. if (!event->name)
  2192. return;
  2193. evsel = evlist__find_by_index(evlist, event->core.idx);
  2194. if (!evsel)
  2195. return;
  2196. if (evsel->name)
  2197. return;
  2198. evsel->name = strdup(event->name);
  2199. }
  2200. static int
  2201. process_event_desc(struct feat_fd *ff, void *data __maybe_unused)
  2202. {
  2203. struct perf_session *session;
  2204. struct evsel *evsel, *events = read_event_desc(ff);
  2205. if (!events)
  2206. return 0;
  2207. session = container_of(ff->ph, struct perf_session, header);
  2208. if (session->data->is_pipe) {
  2209. /* Save events for reading later by print_event_desc,
  2210. * since they can't be read again in pipe mode. */
  2211. ff->events = events;
  2212. }
  2213. for (evsel = events; evsel->core.attr.size; evsel++)
  2214. evlist__set_event_name(session->evlist, evsel);
  2215. if (!session->data->is_pipe)
  2216. free_event_desc(events);
  2217. return 0;
  2218. }
  2219. static int process_cmdline(struct feat_fd *ff, void *data __maybe_unused)
  2220. {
  2221. struct perf_env *env = &ff->ph->env;
  2222. char *str, *cmdline = NULL, **argv = NULL;
  2223. u32 nr, i, len = 0;
  2224. if (do_read_u32(ff, &nr))
  2225. return -1;
  2226. env->nr_cmdline = nr;
  2227. cmdline = zalloc(ff->size + nr + 1);
  2228. if (!cmdline)
  2229. return -1;
  2230. argv = zalloc(sizeof(char *) * (nr + 1));
  2231. if (!argv)
  2232. goto error;
  2233. for (i = 0; i < nr; i++) {
  2234. str = do_read_string(ff);
  2235. if (!str)
  2236. goto error;
  2237. argv[i] = cmdline + len;
  2238. memcpy(argv[i], str, strlen(str) + 1);
  2239. len += strlen(str) + 1;
  2240. free(str);
  2241. }
  2242. env->cmdline = cmdline;
  2243. env->cmdline_argv = (const char **) argv;
  2244. return 0;
  2245. error:
  2246. free(argv);
  2247. free(cmdline);
  2248. return -1;
  2249. }
  2250. static int process_cpu_topology(struct feat_fd *ff, void *data __maybe_unused)
  2251. {
  2252. u32 nr, i;
  2253. char *str = NULL;
  2254. struct strbuf sb;
  2255. struct perf_env *env = &ff->ph->env;
  2256. int cpu_nr = env->nr_cpus_avail;
  2257. u64 size = 0;
  2258. env->cpu = calloc(cpu_nr, sizeof(*env->cpu));
  2259. if (!env->cpu)
  2260. return -1;
  2261. if (do_read_u32(ff, &nr))
  2262. goto free_cpu;
  2263. env->nr_sibling_cores = nr;
  2264. size += sizeof(u32);
  2265. if (strbuf_init(&sb, 128) < 0)
  2266. goto free_cpu;
  2267. for (i = 0; i < nr; i++) {
  2268. str = do_read_string(ff);
  2269. if (!str)
  2270. goto error;
  2271. /* include a NULL character at the end */
  2272. if (strbuf_add(&sb, str, strlen(str) + 1) < 0)
  2273. goto error;
  2274. size += string_size(str);
  2275. zfree(&str);
  2276. }
  2277. env->sibling_cores = strbuf_detach(&sb, NULL);
  2278. if (do_read_u32(ff, &nr))
  2279. return -1;
  2280. env->nr_sibling_threads = nr;
  2281. size += sizeof(u32);
  2282. for (i = 0; i < nr; i++) {
  2283. str = do_read_string(ff);
  2284. if (!str)
  2285. goto error;
  2286. /* include a NULL character at the end */
  2287. if (strbuf_add(&sb, str, strlen(str) + 1) < 0)
  2288. goto error;
  2289. size += string_size(str);
  2290. zfree(&str);
  2291. }
  2292. env->sibling_threads = strbuf_detach(&sb, NULL);
  2293. /*
  2294. * The header may be from old perf,
  2295. * which doesn't include core id and socket id information.
  2296. */
  2297. if (ff->size <= size) {
  2298. zfree(&env->cpu);
  2299. return 0;
  2300. }
  2301. for (i = 0; i < (u32)cpu_nr; i++) {
  2302. if (do_read_u32(ff, &nr))
  2303. goto free_cpu;
  2304. env->cpu[i].core_id = nr;
  2305. size += sizeof(u32);
  2306. if (do_read_u32(ff, &nr))
  2307. goto free_cpu;
  2308. env->cpu[i].socket_id = nr;
  2309. size += sizeof(u32);
  2310. }
  2311. /*
  2312. * The header may be from old perf,
  2313. * which doesn't include die information.
  2314. */
  2315. if (ff->size <= size)
  2316. return 0;
  2317. if (do_read_u32(ff, &nr))
  2318. return -1;
  2319. env->nr_sibling_dies = nr;
  2320. size += sizeof(u32);
  2321. for (i = 0; i < nr; i++) {
  2322. str = do_read_string(ff);
  2323. if (!str)
  2324. goto error;
  2325. /* include a NULL character at the end */
  2326. if (strbuf_add(&sb, str, strlen(str) + 1) < 0)
  2327. goto error;
  2328. size += string_size(str);
  2329. zfree(&str);
  2330. }
  2331. env->sibling_dies = strbuf_detach(&sb, NULL);
  2332. for (i = 0; i < (u32)cpu_nr; i++) {
  2333. if (do_read_u32(ff, &nr))
  2334. goto free_cpu;
  2335. env->cpu[i].die_id = nr;
  2336. }
  2337. return 0;
  2338. error:
  2339. strbuf_release(&sb);
  2340. zfree(&str);
  2341. free_cpu:
  2342. zfree(&env->cpu);
  2343. return -1;
  2344. }
  2345. static int process_numa_topology(struct feat_fd *ff, void *data __maybe_unused)
  2346. {
  2347. struct perf_env *env = &ff->ph->env;
  2348. struct numa_node *nodes, *n;
  2349. u32 nr, i;
  2350. char *str;
  2351. /* nr nodes */
  2352. if (do_read_u32(ff, &nr))
  2353. return -1;
  2354. nodes = zalloc(sizeof(*nodes) * nr);
  2355. if (!nodes)
  2356. return -ENOMEM;
  2357. for (i = 0; i < nr; i++) {
  2358. n = &nodes[i];
  2359. /* node number */
  2360. if (do_read_u32(ff, &n->node))
  2361. goto error;
  2362. if (do_read_u64(ff, &n->mem_total))
  2363. goto error;
  2364. if (do_read_u64(ff, &n->mem_free))
  2365. goto error;
  2366. str = do_read_string(ff);
  2367. if (!str)
  2368. goto error;
  2369. n->map = perf_cpu_map__new(str);
  2370. free(str);
  2371. if (!n->map)
  2372. goto error;
  2373. }
  2374. env->nr_numa_nodes = nr;
  2375. env->numa_nodes = nodes;
  2376. return 0;
  2377. error:
  2378. free(nodes);
  2379. return -1;
  2380. }
  2381. static int process_pmu_mappings(struct feat_fd *ff, void *data __maybe_unused)
  2382. {
  2383. struct perf_env *env = &ff->ph->env;
  2384. char *name;
  2385. u32 pmu_num;
  2386. u32 type;
  2387. struct strbuf sb;
  2388. if (do_read_u32(ff, &pmu_num))
  2389. return -1;
  2390. if (!pmu_num) {
  2391. pr_debug("pmu mappings not available\n");
  2392. return 0;
  2393. }
  2394. env->nr_pmu_mappings = pmu_num;
  2395. if (strbuf_init(&sb, 128) < 0)
  2396. return -1;
  2397. while (pmu_num) {
  2398. if (do_read_u32(ff, &type))
  2399. goto error;
  2400. name = do_read_string(ff);
  2401. if (!name)
  2402. goto error;
  2403. if (strbuf_addf(&sb, "%u:%s", type, name) < 0)
  2404. goto error;
  2405. /* include a NULL character at the end */
  2406. if (strbuf_add(&sb, "", 1) < 0)
  2407. goto error;
  2408. if (!strcmp(name, "msr"))
  2409. env->msr_pmu_type = type;
  2410. free(name);
  2411. pmu_num--;
  2412. }
  2413. /* AMD may set it by evlist__has_amd_ibs() from perf_session__new() */
  2414. free(env->pmu_mappings);
  2415. env->pmu_mappings = strbuf_detach(&sb, NULL);
  2416. return 0;
  2417. error:
  2418. strbuf_release(&sb);
  2419. return -1;
  2420. }
  2421. static int process_group_desc(struct feat_fd *ff, void *data __maybe_unused)
  2422. {
  2423. struct perf_env *env = &ff->ph->env;
  2424. size_t ret = -1;
  2425. u32 i, nr, nr_groups;
  2426. struct perf_session *session;
  2427. struct evsel *evsel, *leader = NULL;
  2428. struct group_desc {
  2429. char *name;
  2430. u32 leader_idx;
  2431. u32 nr_members;
  2432. } *desc;
  2433. if (do_read_u32(ff, &nr_groups))
  2434. return -1;
  2435. env->nr_groups = nr_groups;
  2436. if (!nr_groups) {
  2437. pr_debug("group desc not available\n");
  2438. return 0;
  2439. }
  2440. desc = calloc(nr_groups, sizeof(*desc));
  2441. if (!desc)
  2442. return -1;
  2443. for (i = 0; i < nr_groups; i++) {
  2444. desc[i].name = do_read_string(ff);
  2445. if (!desc[i].name)
  2446. goto out_free;
  2447. if (do_read_u32(ff, &desc[i].leader_idx))
  2448. goto out_free;
  2449. if (do_read_u32(ff, &desc[i].nr_members))
  2450. goto out_free;
  2451. }
  2452. /*
  2453. * Rebuild group relationship based on the group_desc
  2454. */
  2455. session = container_of(ff->ph, struct perf_session, header);
  2456. i = nr = 0;
  2457. evlist__for_each_entry(session->evlist, evsel) {
  2458. if (i < nr_groups && evsel->core.idx == (int) desc[i].leader_idx) {
  2459. evsel__set_leader(evsel, evsel);
  2460. /* {anon_group} is a dummy name */
  2461. if (strcmp(desc[i].name, "{anon_group}")) {
  2462. evsel->group_name = desc[i].name;
  2463. desc[i].name = NULL;
  2464. }
  2465. evsel->core.nr_members = desc[i].nr_members;
  2466. if (i >= nr_groups || nr > 0) {
  2467. pr_debug("invalid group desc\n");
  2468. goto out_free;
  2469. }
  2470. leader = evsel;
  2471. nr = evsel->core.nr_members - 1;
  2472. i++;
  2473. } else if (nr) {
  2474. /* This is a group member */
  2475. evsel__set_leader(evsel, leader);
  2476. nr--;
  2477. }
  2478. }
  2479. if (i != nr_groups || nr != 0) {
  2480. pr_debug("invalid group desc\n");
  2481. goto out_free;
  2482. }
  2483. ret = 0;
  2484. out_free:
  2485. for (i = 0; i < nr_groups; i++)
  2486. zfree(&desc[i].name);
  2487. free(desc);
  2488. return ret;
  2489. }
  2490. static int process_auxtrace(struct feat_fd *ff, void *data __maybe_unused)
  2491. {
  2492. struct perf_session *session;
  2493. int err;
  2494. session = container_of(ff->ph, struct perf_session, header);
  2495. err = auxtrace_index__process(ff->fd, ff->size, session,
  2496. ff->ph->needs_swap);
  2497. if (err < 0)
  2498. pr_err("Failed to process auxtrace index\n");
  2499. return err;
  2500. }
  2501. static int process_cache(struct feat_fd *ff, void *data __maybe_unused)
  2502. {
  2503. struct perf_env *env = &ff->ph->env;
  2504. struct cpu_cache_level *caches;
  2505. u32 cnt, i, version;
  2506. if (do_read_u32(ff, &version))
  2507. return -1;
  2508. if (version != 1)
  2509. return -1;
  2510. if (do_read_u32(ff, &cnt))
  2511. return -1;
  2512. caches = zalloc(sizeof(*caches) * cnt);
  2513. if (!caches)
  2514. return -1;
  2515. for (i = 0; i < cnt; i++) {
  2516. struct cpu_cache_level *c = &caches[i];
  2517. #define _R(v) \
  2518. if (do_read_u32(ff, &c->v)) \
  2519. goto out_free_caches; \
  2520. _R(level)
  2521. _R(line_size)
  2522. _R(sets)
  2523. _R(ways)
  2524. #undef _R
  2525. #define _R(v) \
  2526. c->v = do_read_string(ff); \
  2527. if (!c->v) \
  2528. goto out_free_caches; \
  2529. _R(type)
  2530. _R(size)
  2531. _R(map)
  2532. #undef _R
  2533. }
  2534. env->caches = caches;
  2535. env->caches_cnt = cnt;
  2536. return 0;
  2537. out_free_caches:
  2538. for (i = 0; i < cnt; i++) {
  2539. free(caches[i].type);
  2540. free(caches[i].size);
  2541. free(caches[i].map);
  2542. }
  2543. free(caches);
  2544. return -1;
  2545. }
  2546. static int process_sample_time(struct feat_fd *ff, void *data __maybe_unused)
  2547. {
  2548. struct perf_session *session;
  2549. u64 first_sample_time, last_sample_time;
  2550. int ret;
  2551. session = container_of(ff->ph, struct perf_session, header);
  2552. ret = do_read_u64(ff, &first_sample_time);
  2553. if (ret)
  2554. return -1;
  2555. ret = do_read_u64(ff, &last_sample_time);
  2556. if (ret)
  2557. return -1;
  2558. session->evlist->first_sample_time = first_sample_time;
  2559. session->evlist->last_sample_time = last_sample_time;
  2560. return 0;
  2561. }
  2562. static int process_mem_topology(struct feat_fd *ff,
  2563. void *data __maybe_unused)
  2564. {
  2565. struct perf_env *env = &ff->ph->env;
  2566. struct memory_node *nodes;
  2567. u64 version, i, nr, bsize;
  2568. int ret = -1;
  2569. if (do_read_u64(ff, &version))
  2570. return -1;
  2571. if (version != 1)
  2572. return -1;
  2573. if (do_read_u64(ff, &bsize))
  2574. return -1;
  2575. if (do_read_u64(ff, &nr))
  2576. return -1;
  2577. nodes = zalloc(sizeof(*nodes) * nr);
  2578. if (!nodes)
  2579. return -1;
  2580. for (i = 0; i < nr; i++) {
  2581. struct memory_node n;
  2582. #define _R(v) \
  2583. if (do_read_u64(ff, &n.v)) \
  2584. goto out; \
  2585. _R(node)
  2586. _R(size)
  2587. #undef _R
  2588. if (do_read_bitmap(ff, &n.set, &n.size))
  2589. goto out;
  2590. nodes[i] = n;
  2591. }
  2592. env->memory_bsize = bsize;
  2593. env->memory_nodes = nodes;
  2594. env->nr_memory_nodes = nr;
  2595. ret = 0;
  2596. out:
  2597. if (ret)
  2598. free(nodes);
  2599. return ret;
  2600. }
  2601. static int process_clockid(struct feat_fd *ff,
  2602. void *data __maybe_unused)
  2603. {
  2604. struct perf_env *env = &ff->ph->env;
  2605. if (do_read_u64(ff, &env->clock.clockid_res_ns))
  2606. return -1;
  2607. return 0;
  2608. }
  2609. static int process_clock_data(struct feat_fd *ff,
  2610. void *_data __maybe_unused)
  2611. {
  2612. struct perf_env *env = &ff->ph->env;
  2613. u32 data32;
  2614. u64 data64;
  2615. /* version */
  2616. if (do_read_u32(ff, &data32))
  2617. return -1;
  2618. if (data32 != 1)
  2619. return -1;
  2620. /* clockid */
  2621. if (do_read_u32(ff, &data32))
  2622. return -1;
  2623. env->clock.clockid = data32;
  2624. /* TOD ref time */
  2625. if (do_read_u64(ff, &data64))
  2626. return -1;
  2627. env->clock.tod_ns = data64;
  2628. /* clockid ref time */
  2629. if (do_read_u64(ff, &data64))
  2630. return -1;
  2631. env->clock.clockid_ns = data64;
  2632. env->clock.enabled = true;
  2633. return 0;
  2634. }
  2635. static int process_hybrid_topology(struct feat_fd *ff,
  2636. void *data __maybe_unused)
  2637. {
  2638. struct perf_env *env = &ff->ph->env;
  2639. struct hybrid_node *nodes, *n;
  2640. u32 nr, i;
  2641. /* nr nodes */
  2642. if (do_read_u32(ff, &nr))
  2643. return -1;
  2644. nodes = zalloc(sizeof(*nodes) * nr);
  2645. if (!nodes)
  2646. return -ENOMEM;
  2647. for (i = 0; i < nr; i++) {
  2648. n = &nodes[i];
  2649. n->pmu_name = do_read_string(ff);
  2650. if (!n->pmu_name)
  2651. goto error;
  2652. n->cpus = do_read_string(ff);
  2653. if (!n->cpus)
  2654. goto error;
  2655. }
  2656. env->nr_hybrid_nodes = nr;
  2657. env->hybrid_nodes = nodes;
  2658. return 0;
  2659. error:
  2660. for (i = 0; i < nr; i++) {
  2661. free(nodes[i].pmu_name);
  2662. free(nodes[i].cpus);
  2663. }
  2664. free(nodes);
  2665. return -1;
  2666. }
  2667. static int process_dir_format(struct feat_fd *ff,
  2668. void *_data __maybe_unused)
  2669. {
  2670. struct perf_session *session;
  2671. struct perf_data *data;
  2672. session = container_of(ff->ph, struct perf_session, header);
  2673. data = session->data;
  2674. if (WARN_ON(!perf_data__is_dir(data)))
  2675. return -1;
  2676. return do_read_u64(ff, &data->dir.version);
  2677. }
  2678. #ifdef HAVE_LIBBPF_SUPPORT
  2679. static int process_bpf_prog_info(struct feat_fd *ff, void *data __maybe_unused)
  2680. {
  2681. struct bpf_prog_info_node *info_node;
  2682. struct perf_env *env = &ff->ph->env;
  2683. struct perf_bpil *info_linear;
  2684. u32 count, i;
  2685. int err = -1;
  2686. if (ff->ph->needs_swap) {
  2687. pr_warning("interpreting bpf_prog_info from systems with endianness is not yet supported\n");
  2688. return 0;
  2689. }
  2690. if (do_read_u32(ff, &count))
  2691. return -1;
  2692. down_write(&env->bpf_progs.lock);
  2693. for (i = 0; i < count; ++i) {
  2694. u32 info_len, data_len;
  2695. info_linear = NULL;
  2696. info_node = NULL;
  2697. if (do_read_u32(ff, &info_len))
  2698. goto out;
  2699. if (do_read_u32(ff, &data_len))
  2700. goto out;
  2701. if (info_len > sizeof(struct bpf_prog_info)) {
  2702. pr_warning("detected invalid bpf_prog_info\n");
  2703. goto out;
  2704. }
  2705. info_linear = malloc(sizeof(struct perf_bpil) +
  2706. data_len);
  2707. if (!info_linear)
  2708. goto out;
  2709. info_linear->info_len = sizeof(struct bpf_prog_info);
  2710. info_linear->data_len = data_len;
  2711. if (do_read_u64(ff, (u64 *)(&info_linear->arrays)))
  2712. goto out;
  2713. if (__do_read(ff, &info_linear->info, info_len))
  2714. goto out;
  2715. if (info_len < sizeof(struct bpf_prog_info))
  2716. memset(((void *)(&info_linear->info)) + info_len, 0,
  2717. sizeof(struct bpf_prog_info) - info_len);
  2718. if (__do_read(ff, info_linear->data, data_len))
  2719. goto out;
  2720. info_node = malloc(sizeof(struct bpf_prog_info_node));
  2721. if (!info_node)
  2722. goto out;
  2723. /* after reading from file, translate offset to address */
  2724. bpil_offs_to_addr(info_linear);
  2725. info_node->info_linear = info_linear;
  2726. info_node->metadata = NULL;
  2727. if (!__perf_env__insert_bpf_prog_info(env, info_node)) {
  2728. free(info_linear);
  2729. free(info_node);
  2730. }
  2731. }
  2732. up_write(&env->bpf_progs.lock);
  2733. return 0;
  2734. out:
  2735. free(info_linear);
  2736. free(info_node);
  2737. up_write(&env->bpf_progs.lock);
  2738. return err;
  2739. }
  2740. static int process_bpf_btf(struct feat_fd *ff, void *data __maybe_unused)
  2741. {
  2742. struct perf_env *env = &ff->ph->env;
  2743. struct btf_node *node = NULL;
  2744. u32 count, i;
  2745. int err = -1;
  2746. if (ff->ph->needs_swap) {
  2747. pr_warning("interpreting btf from systems with endianness is not yet supported\n");
  2748. return 0;
  2749. }
  2750. if (do_read_u32(ff, &count))
  2751. return -1;
  2752. down_write(&env->bpf_progs.lock);
  2753. for (i = 0; i < count; ++i) {
  2754. u32 id, data_size;
  2755. if (do_read_u32(ff, &id))
  2756. goto out;
  2757. if (do_read_u32(ff, &data_size))
  2758. goto out;
  2759. node = malloc(sizeof(struct btf_node) + data_size);
  2760. if (!node)
  2761. goto out;
  2762. node->id = id;
  2763. node->data_size = data_size;
  2764. if (__do_read(ff, node->data, data_size))
  2765. goto out;
  2766. if (!__perf_env__insert_btf(env, node))
  2767. free(node);
  2768. node = NULL;
  2769. }
  2770. err = 0;
  2771. out:
  2772. up_write(&env->bpf_progs.lock);
  2773. free(node);
  2774. return err;
  2775. }
  2776. #endif // HAVE_LIBBPF_SUPPORT
  2777. static int process_compressed(struct feat_fd *ff,
  2778. void *data __maybe_unused)
  2779. {
  2780. struct perf_env *env = &ff->ph->env;
  2781. if (do_read_u32(ff, &(env->comp_ver)))
  2782. return -1;
  2783. if (do_read_u32(ff, &(env->comp_type)))
  2784. return -1;
  2785. if (do_read_u32(ff, &(env->comp_level)))
  2786. return -1;
  2787. if (do_read_u32(ff, &(env->comp_ratio)))
  2788. return -1;
  2789. if (do_read_u32(ff, &(env->comp_mmap_len)))
  2790. return -1;
  2791. return 0;
  2792. }
  2793. static int __process_pmu_caps(struct feat_fd *ff, int *nr_caps,
  2794. char ***caps, unsigned int *max_branches,
  2795. unsigned int *br_cntr_nr,
  2796. unsigned int *br_cntr_width)
  2797. {
  2798. char *name, *value, *ptr;
  2799. u32 nr_pmu_caps, i;
  2800. *nr_caps = 0;
  2801. *caps = NULL;
  2802. if (do_read_u32(ff, &nr_pmu_caps))
  2803. return -1;
  2804. if (!nr_pmu_caps)
  2805. return 0;
  2806. *caps = zalloc(sizeof(char *) * nr_pmu_caps);
  2807. if (!*caps)
  2808. return -1;
  2809. for (i = 0; i < nr_pmu_caps; i++) {
  2810. name = do_read_string(ff);
  2811. if (!name)
  2812. goto error;
  2813. value = do_read_string(ff);
  2814. if (!value)
  2815. goto free_name;
  2816. if (asprintf(&ptr, "%s=%s", name, value) < 0)
  2817. goto free_value;
  2818. (*caps)[i] = ptr;
  2819. if (!strcmp(name, "branches"))
  2820. *max_branches = atoi(value);
  2821. if (!strcmp(name, "branch_counter_nr"))
  2822. *br_cntr_nr = atoi(value);
  2823. if (!strcmp(name, "branch_counter_width"))
  2824. *br_cntr_width = atoi(value);
  2825. free(value);
  2826. free(name);
  2827. }
  2828. *nr_caps = nr_pmu_caps;
  2829. return 0;
  2830. free_value:
  2831. free(value);
  2832. free_name:
  2833. free(name);
  2834. error:
  2835. for (; i > 0; i--)
  2836. free((*caps)[i - 1]);
  2837. free(*caps);
  2838. *caps = NULL;
  2839. *nr_caps = 0;
  2840. return -1;
  2841. }
  2842. static int process_cpu_pmu_caps(struct feat_fd *ff,
  2843. void *data __maybe_unused)
  2844. {
  2845. struct perf_env *env = &ff->ph->env;
  2846. int ret = __process_pmu_caps(ff, &env->nr_cpu_pmu_caps,
  2847. &env->cpu_pmu_caps,
  2848. &env->max_branches,
  2849. &env->br_cntr_nr,
  2850. &env->br_cntr_width);
  2851. if (!ret && !env->cpu_pmu_caps)
  2852. pr_debug("cpu pmu capabilities not available\n");
  2853. return ret;
  2854. }
  2855. static int process_pmu_caps(struct feat_fd *ff, void *data __maybe_unused)
  2856. {
  2857. struct perf_env *env = &ff->ph->env;
  2858. struct pmu_caps *pmu_caps;
  2859. u32 nr_pmu, i;
  2860. int ret;
  2861. int j;
  2862. if (do_read_u32(ff, &nr_pmu))
  2863. return -1;
  2864. if (!nr_pmu) {
  2865. pr_debug("pmu capabilities not available\n");
  2866. return 0;
  2867. }
  2868. pmu_caps = zalloc(sizeof(*pmu_caps) * nr_pmu);
  2869. if (!pmu_caps)
  2870. return -ENOMEM;
  2871. for (i = 0; i < nr_pmu; i++) {
  2872. ret = __process_pmu_caps(ff, &pmu_caps[i].nr_caps,
  2873. &pmu_caps[i].caps,
  2874. &pmu_caps[i].max_branches,
  2875. &pmu_caps[i].br_cntr_nr,
  2876. &pmu_caps[i].br_cntr_width);
  2877. if (ret)
  2878. goto err;
  2879. pmu_caps[i].pmu_name = do_read_string(ff);
  2880. if (!pmu_caps[i].pmu_name) {
  2881. ret = -1;
  2882. goto err;
  2883. }
  2884. if (!pmu_caps[i].nr_caps) {
  2885. pr_debug("%s pmu capabilities not available\n",
  2886. pmu_caps[i].pmu_name);
  2887. }
  2888. }
  2889. env->nr_pmus_with_caps = nr_pmu;
  2890. env->pmu_caps = pmu_caps;
  2891. return 0;
  2892. err:
  2893. for (i = 0; i < nr_pmu; i++) {
  2894. for (j = 0; j < pmu_caps[i].nr_caps; j++)
  2895. free(pmu_caps[i].caps[j]);
  2896. free(pmu_caps[i].caps);
  2897. free(pmu_caps[i].pmu_name);
  2898. }
  2899. free(pmu_caps);
  2900. return ret;
  2901. }
  2902. static int process_cpu_domain_info(struct feat_fd *ff, void *data __maybe_unused)
  2903. {
  2904. u32 schedstat_version, max_sched_domains, cpu, domain, nr_domains;
  2905. struct perf_env *env = &ff->ph->env;
  2906. char *dname, *cpumask, *cpulist;
  2907. struct cpu_domain_map **cd_map;
  2908. struct domain_info *d_info;
  2909. u32 nra, nr, i, j;
  2910. int ret;
  2911. nra = env->nr_cpus_avail;
  2912. nr = env->nr_cpus_online;
  2913. cd_map = zalloc(sizeof(*cd_map) * nra);
  2914. if (!cd_map)
  2915. return -1;
  2916. env->cpu_domain = cd_map;
  2917. ret = do_read_u32(ff, &schedstat_version);
  2918. if (ret)
  2919. return ret;
  2920. env->schedstat_version = schedstat_version;
  2921. ret = do_read_u32(ff, &max_sched_domains);
  2922. if (ret)
  2923. return ret;
  2924. env->max_sched_domains = max_sched_domains;
  2925. for (i = 0; i < nr; i++) {
  2926. if (do_read_u32(ff, &cpu))
  2927. return -1;
  2928. cd_map[cpu] = zalloc(sizeof(*cd_map[cpu]));
  2929. if (!cd_map[cpu])
  2930. return -1;
  2931. cd_map[cpu]->cpu = cpu;
  2932. if (do_read_u32(ff, &nr_domains))
  2933. return -1;
  2934. cd_map[cpu]->nr_domains = nr_domains;
  2935. cd_map[cpu]->domains = zalloc(sizeof(*d_info) * max_sched_domains);
  2936. if (!cd_map[cpu]->domains)
  2937. return -1;
  2938. for (j = 0; j < nr_domains; j++) {
  2939. if (do_read_u32(ff, &domain))
  2940. return -1;
  2941. d_info = zalloc(sizeof(*d_info));
  2942. if (!d_info)
  2943. return -1;
  2944. assert(cd_map[cpu]->domains[domain] == NULL);
  2945. cd_map[cpu]->domains[domain] = d_info;
  2946. d_info->domain = domain;
  2947. if (schedstat_version >= 17) {
  2948. dname = do_read_string(ff);
  2949. if (!dname)
  2950. return -1;
  2951. d_info->dname = dname;
  2952. }
  2953. cpumask = do_read_string(ff);
  2954. if (!cpumask)
  2955. return -1;
  2956. d_info->cpumask = cpumask;
  2957. cpulist = do_read_string(ff);
  2958. if (!cpulist)
  2959. return -1;
  2960. d_info->cpulist = cpulist;
  2961. }
  2962. }
  2963. return ret;
  2964. }
  2965. #define FEAT_OPR(n, func, __full_only) \
  2966. [HEADER_##n] = { \
  2967. .name = __stringify(n), \
  2968. .write = write_##func, \
  2969. .print = print_##func, \
  2970. .full_only = __full_only, \
  2971. .process = process_##func, \
  2972. .synthesize = true \
  2973. }
  2974. #define FEAT_OPN(n, func, __full_only) \
  2975. [HEADER_##n] = { \
  2976. .name = __stringify(n), \
  2977. .write = write_##func, \
  2978. .print = print_##func, \
  2979. .full_only = __full_only, \
  2980. .process = process_##func \
  2981. }
  2982. /* feature_ops not implemented: */
  2983. #define print_tracing_data NULL
  2984. #define print_build_id NULL
  2985. #define process_branch_stack NULL
  2986. #define process_stat NULL
  2987. // Only used in util/synthetic-events.c
  2988. const struct perf_header_feature_ops feat_ops[HEADER_LAST_FEATURE];
  2989. const struct perf_header_feature_ops feat_ops[HEADER_LAST_FEATURE] = {
  2990. #ifdef HAVE_LIBTRACEEVENT
  2991. FEAT_OPN(TRACING_DATA, tracing_data, false),
  2992. #endif
  2993. FEAT_OPN(BUILD_ID, build_id, false),
  2994. FEAT_OPR(HOSTNAME, hostname, false),
  2995. FEAT_OPR(OSRELEASE, osrelease, false),
  2996. FEAT_OPR(VERSION, version, false),
  2997. FEAT_OPR(ARCH, arch, false),
  2998. FEAT_OPR(NRCPUS, nrcpus, false),
  2999. FEAT_OPR(CPUDESC, cpudesc, false),
  3000. FEAT_OPR(CPUID, cpuid, false),
  3001. FEAT_OPR(TOTAL_MEM, total_mem, false),
  3002. FEAT_OPR(EVENT_DESC, event_desc, false),
  3003. FEAT_OPR(CMDLINE, cmdline, false),
  3004. FEAT_OPR(CPU_TOPOLOGY, cpu_topology, true),
  3005. FEAT_OPR(NUMA_TOPOLOGY, numa_topology, true),
  3006. FEAT_OPN(BRANCH_STACK, branch_stack, false),
  3007. FEAT_OPR(PMU_MAPPINGS, pmu_mappings, false),
  3008. FEAT_OPR(GROUP_DESC, group_desc, false),
  3009. FEAT_OPN(AUXTRACE, auxtrace, false),
  3010. FEAT_OPN(STAT, stat, false),
  3011. FEAT_OPN(CACHE, cache, true),
  3012. FEAT_OPR(SAMPLE_TIME, sample_time, false),
  3013. FEAT_OPR(MEM_TOPOLOGY, mem_topology, true),
  3014. FEAT_OPR(CLOCKID, clockid, false),
  3015. FEAT_OPN(DIR_FORMAT, dir_format, false),
  3016. #ifdef HAVE_LIBBPF_SUPPORT
  3017. FEAT_OPR(BPF_PROG_INFO, bpf_prog_info, false),
  3018. FEAT_OPR(BPF_BTF, bpf_btf, false),
  3019. #endif
  3020. FEAT_OPR(COMPRESSED, compressed, false),
  3021. FEAT_OPR(CPU_PMU_CAPS, cpu_pmu_caps, false),
  3022. FEAT_OPR(CLOCK_DATA, clock_data, false),
  3023. FEAT_OPN(HYBRID_TOPOLOGY, hybrid_topology, true),
  3024. FEAT_OPR(PMU_CAPS, pmu_caps, false),
  3025. FEAT_OPR(CPU_DOMAIN_INFO, cpu_domain_info, true),
  3026. FEAT_OPR(E_MACHINE, e_machine, false),
  3027. };
  3028. struct header_print_data {
  3029. FILE *fp;
  3030. bool full; /* extended list of headers */
  3031. };
  3032. static int perf_file_section__fprintf_info(struct perf_file_section *section,
  3033. struct perf_header *ph,
  3034. int feat, int fd, void *data)
  3035. {
  3036. struct header_print_data *hd = data;
  3037. struct feat_fd ff;
  3038. if (lseek(fd, section->offset, SEEK_SET) == (off_t)-1) {
  3039. pr_debug("Failed to lseek to %" PRIu64 " offset for feature "
  3040. "%d, continuing...\n", section->offset, feat);
  3041. return 0;
  3042. }
  3043. if (feat >= HEADER_LAST_FEATURE) {
  3044. pr_warning("unknown feature %d\n", feat);
  3045. return 0;
  3046. }
  3047. if (!feat_ops[feat].print)
  3048. return 0;
  3049. ff = (struct feat_fd) {
  3050. .fd = fd,
  3051. .ph = ph,
  3052. };
  3053. if (!feat_ops[feat].full_only || hd->full)
  3054. feat_ops[feat].print(&ff, hd->fp);
  3055. else
  3056. fprintf(hd->fp, "# %s info available, use -I to display\n",
  3057. feat_ops[feat].name);
  3058. return 0;
  3059. }
  3060. int perf_header__fprintf_info(struct perf_session *session, FILE *fp, bool full)
  3061. {
  3062. struct header_print_data hd;
  3063. struct perf_header *header = &session->header;
  3064. int fd = perf_data__fd(session->data);
  3065. struct stat st;
  3066. time_t stctime;
  3067. int ret, bit;
  3068. hd.fp = fp;
  3069. hd.full = full;
  3070. ret = fstat(fd, &st);
  3071. if (ret == -1)
  3072. return -1;
  3073. stctime = st.st_mtime;
  3074. fprintf(fp, "# captured on : %s", ctime(&stctime));
  3075. fprintf(fp, "# header version : %u\n", header->version);
  3076. fprintf(fp, "# data offset : %" PRIu64 "\n", header->data_offset);
  3077. fprintf(fp, "# data size : %" PRIu64 "\n", header->data_size);
  3078. fprintf(fp, "# feat offset : %" PRIu64 "\n", header->feat_offset);
  3079. perf_header__process_sections(header, fd, &hd,
  3080. perf_file_section__fprintf_info);
  3081. if (session->data->is_pipe)
  3082. return 0;
  3083. fprintf(fp, "# missing features: ");
  3084. for_each_clear_bit(bit, header->adds_features, HEADER_LAST_FEATURE) {
  3085. if (bit)
  3086. fprintf(fp, "%s ", feat_ops[bit].name);
  3087. }
  3088. fprintf(fp, "\n");
  3089. return 0;
  3090. }
  3091. struct header_fw {
  3092. struct feat_writer fw;
  3093. struct feat_fd *ff;
  3094. };
  3095. static int feat_writer_cb(struct feat_writer *fw, void *buf, size_t sz)
  3096. {
  3097. struct header_fw *h = container_of(fw, struct header_fw, fw);
  3098. return do_write(h->ff, buf, sz);
  3099. }
  3100. static int do_write_feat(struct feat_fd *ff, int type,
  3101. struct perf_file_section **p,
  3102. struct evlist *evlist,
  3103. struct feat_copier *fc)
  3104. {
  3105. int err;
  3106. int ret = 0;
  3107. if (perf_header__has_feat(ff->ph, type)) {
  3108. if (!feat_ops[type].write)
  3109. return -1;
  3110. if (WARN(ff->buf, "Error: calling %s in pipe-mode.\n", __func__))
  3111. return -1;
  3112. (*p)->offset = lseek(ff->fd, 0, SEEK_CUR);
  3113. /*
  3114. * Hook to let perf inject copy features sections from the input
  3115. * file.
  3116. */
  3117. if (fc && fc->copy) {
  3118. struct header_fw h = {
  3119. .fw.write = feat_writer_cb,
  3120. .ff = ff,
  3121. };
  3122. /* ->copy() returns 0 if the feature was not copied */
  3123. err = fc->copy(fc, type, &h.fw);
  3124. } else {
  3125. err = 0;
  3126. }
  3127. if (!err)
  3128. err = feat_ops[type].write(ff, evlist);
  3129. if (err < 0) {
  3130. pr_debug("failed to write feature %s\n", feat_ops[type].name);
  3131. /* undo anything written */
  3132. lseek(ff->fd, (*p)->offset, SEEK_SET);
  3133. return -1;
  3134. }
  3135. (*p)->size = lseek(ff->fd, 0, SEEK_CUR) - (*p)->offset;
  3136. (*p)++;
  3137. }
  3138. return ret;
  3139. }
  3140. static int perf_header__adds_write(struct perf_header *header,
  3141. struct evlist *evlist, int fd,
  3142. struct feat_copier *fc)
  3143. {
  3144. int nr_sections;
  3145. struct feat_fd ff = {
  3146. .fd = fd,
  3147. .ph = header,
  3148. };
  3149. struct perf_file_section *feat_sec, *p;
  3150. int sec_size;
  3151. u64 sec_start;
  3152. int feat;
  3153. int err;
  3154. nr_sections = bitmap_weight(header->adds_features, HEADER_FEAT_BITS);
  3155. if (!nr_sections)
  3156. return 0;
  3157. feat_sec = p = calloc(nr_sections, sizeof(*feat_sec));
  3158. if (feat_sec == NULL)
  3159. return -ENOMEM;
  3160. sec_size = sizeof(*feat_sec) * nr_sections;
  3161. sec_start = header->feat_offset;
  3162. lseek(fd, sec_start + sec_size, SEEK_SET);
  3163. for_each_set_bit(feat, header->adds_features, HEADER_FEAT_BITS) {
  3164. if (do_write_feat(&ff, feat, &p, evlist, fc))
  3165. perf_header__clear_feat(header, feat);
  3166. }
  3167. lseek(fd, sec_start, SEEK_SET);
  3168. /*
  3169. * may write more than needed due to dropped feature, but
  3170. * this is okay, reader will skip the missing entries
  3171. */
  3172. err = do_write(&ff, feat_sec, sec_size);
  3173. if (err < 0)
  3174. pr_debug("failed to write feature section\n");
  3175. free(ff.buf); /* TODO: added to silence clang-tidy. */
  3176. free(feat_sec);
  3177. return err;
  3178. }
  3179. int perf_header__write_pipe(int fd)
  3180. {
  3181. struct perf_pipe_file_header f_header;
  3182. struct feat_fd ff = {
  3183. .fd = fd,
  3184. };
  3185. int err;
  3186. f_header = (struct perf_pipe_file_header){
  3187. .magic = PERF_MAGIC,
  3188. .size = sizeof(f_header),
  3189. };
  3190. err = do_write(&ff, &f_header, sizeof(f_header));
  3191. if (err < 0) {
  3192. pr_debug("failed to write perf pipe header\n");
  3193. return err;
  3194. }
  3195. free(ff.buf);
  3196. return 0;
  3197. }
  3198. static int perf_session__do_write_header(struct perf_session *session,
  3199. struct evlist *evlist,
  3200. int fd, bool at_exit,
  3201. struct feat_copier *fc,
  3202. bool write_attrs_after_data)
  3203. {
  3204. struct perf_file_header f_header;
  3205. struct perf_header *header = &session->header;
  3206. struct evsel *evsel;
  3207. struct feat_fd ff = {
  3208. .ph = header,
  3209. .fd = fd,
  3210. };
  3211. u64 attr_offset = sizeof(f_header), attr_size = 0;
  3212. int err;
  3213. if (write_attrs_after_data && at_exit) {
  3214. /*
  3215. * Write features at the end of the file first so that
  3216. * attributes may come after them.
  3217. */
  3218. if (!header->data_offset && header->data_size) {
  3219. pr_err("File contains data but offset unknown\n");
  3220. err = -1;
  3221. goto err_out;
  3222. }
  3223. header->feat_offset = header->data_offset + header->data_size;
  3224. err = perf_header__adds_write(header, evlist, fd, fc);
  3225. if (err < 0)
  3226. goto err_out;
  3227. attr_offset = lseek(fd, 0, SEEK_CUR);
  3228. } else {
  3229. lseek(fd, attr_offset, SEEK_SET);
  3230. }
  3231. evlist__for_each_entry(session->evlist, evsel) {
  3232. evsel->id_offset = attr_offset;
  3233. /* Avoid writing at the end of the file until the session is exiting. */
  3234. if (!write_attrs_after_data || at_exit) {
  3235. err = do_write(&ff, evsel->core.id, evsel->core.ids * sizeof(u64));
  3236. if (err < 0) {
  3237. pr_debug("failed to write perf header\n");
  3238. goto err_out;
  3239. }
  3240. }
  3241. attr_offset += evsel->core.ids * sizeof(u64);
  3242. }
  3243. evlist__for_each_entry(evlist, evsel) {
  3244. if (evsel->core.attr.size < sizeof(evsel->core.attr)) {
  3245. /*
  3246. * We are likely in "perf inject" and have read
  3247. * from an older file. Update attr size so that
  3248. * reader gets the right offset to the ids.
  3249. */
  3250. evsel->core.attr.size = sizeof(evsel->core.attr);
  3251. }
  3252. /* Avoid writing at the end of the file until the session is exiting. */
  3253. if (!write_attrs_after_data || at_exit) {
  3254. struct perf_file_attr f_attr = {
  3255. .attr = evsel->core.attr,
  3256. .ids = {
  3257. .offset = evsel->id_offset,
  3258. .size = evsel->core.ids * sizeof(u64),
  3259. }
  3260. };
  3261. err = do_write(&ff, &f_attr, sizeof(f_attr));
  3262. if (err < 0) {
  3263. pr_debug("failed to write perf header attribute\n");
  3264. goto err_out;
  3265. }
  3266. }
  3267. attr_size += sizeof(struct perf_file_attr);
  3268. }
  3269. if (!header->data_offset) {
  3270. if (write_attrs_after_data)
  3271. header->data_offset = sizeof(f_header);
  3272. else
  3273. header->data_offset = attr_offset + attr_size;
  3274. }
  3275. header->feat_offset = header->data_offset + header->data_size;
  3276. if (!write_attrs_after_data && at_exit) {
  3277. /* Write features now feat_offset is known. */
  3278. err = perf_header__adds_write(header, evlist, fd, fc);
  3279. if (err < 0)
  3280. goto err_out;
  3281. }
  3282. f_header = (struct perf_file_header){
  3283. .magic = PERF_MAGIC,
  3284. .size = sizeof(f_header),
  3285. .attr_size = sizeof(struct perf_file_attr),
  3286. .attrs = {
  3287. .offset = attr_offset,
  3288. .size = attr_size,
  3289. },
  3290. .data = {
  3291. .offset = header->data_offset,
  3292. .size = header->data_size,
  3293. },
  3294. /* event_types is ignored, store zeros */
  3295. };
  3296. memcpy(&f_header.adds_features, &header->adds_features, sizeof(header->adds_features));
  3297. lseek(fd, 0, SEEK_SET);
  3298. err = do_write(&ff, &f_header, sizeof(f_header));
  3299. if (err < 0) {
  3300. pr_debug("failed to write perf header\n");
  3301. goto err_out;
  3302. } else {
  3303. lseek(fd, 0, SEEK_END);
  3304. err = 0;
  3305. }
  3306. err_out:
  3307. free(ff.buf);
  3308. return err;
  3309. }
  3310. int perf_session__write_header(struct perf_session *session,
  3311. struct evlist *evlist,
  3312. int fd, bool at_exit)
  3313. {
  3314. return perf_session__do_write_header(session, evlist, fd, at_exit, /*fc=*/NULL,
  3315. /*write_attrs_after_data=*/false);
  3316. }
  3317. size_t perf_session__data_offset(const struct evlist *evlist)
  3318. {
  3319. struct evsel *evsel;
  3320. size_t data_offset;
  3321. data_offset = sizeof(struct perf_file_header);
  3322. evlist__for_each_entry(evlist, evsel) {
  3323. data_offset += evsel->core.ids * sizeof(u64);
  3324. }
  3325. data_offset += evlist->core.nr_entries * sizeof(struct perf_file_attr);
  3326. return data_offset;
  3327. }
  3328. int perf_session__inject_header(struct perf_session *session,
  3329. struct evlist *evlist,
  3330. int fd,
  3331. struct feat_copier *fc,
  3332. bool write_attrs_after_data)
  3333. {
  3334. return perf_session__do_write_header(session, evlist, fd, true, fc,
  3335. write_attrs_after_data);
  3336. }
  3337. static int perf_header__getbuffer64(struct perf_header *header,
  3338. int fd, void *buf, size_t size)
  3339. {
  3340. if (readn(fd, buf, size) <= 0)
  3341. return -1;
  3342. if (header->needs_swap)
  3343. mem_bswap_64(buf, size);
  3344. return 0;
  3345. }
  3346. int perf_header__process_sections(struct perf_header *header, int fd,
  3347. void *data,
  3348. int (*process)(struct perf_file_section *section,
  3349. struct perf_header *ph,
  3350. int feat, int fd, void *data))
  3351. {
  3352. struct perf_file_section *feat_sec, *sec;
  3353. int nr_sections;
  3354. int sec_size;
  3355. int feat;
  3356. int err;
  3357. nr_sections = bitmap_weight(header->adds_features, HEADER_FEAT_BITS);
  3358. if (!nr_sections)
  3359. return 0;
  3360. feat_sec = sec = calloc(nr_sections, sizeof(*feat_sec));
  3361. if (!feat_sec)
  3362. return -1;
  3363. sec_size = sizeof(*feat_sec) * nr_sections;
  3364. lseek(fd, header->feat_offset, SEEK_SET);
  3365. err = perf_header__getbuffer64(header, fd, feat_sec, sec_size);
  3366. if (err < 0)
  3367. goto out_free;
  3368. for_each_set_bit(feat, header->adds_features, HEADER_LAST_FEATURE) {
  3369. err = process(sec++, header, feat, fd, data);
  3370. if (err < 0)
  3371. goto out_free;
  3372. }
  3373. err = 0;
  3374. out_free:
  3375. free(feat_sec);
  3376. return err;
  3377. }
  3378. static const int attr_file_abi_sizes[] = {
  3379. [0] = PERF_ATTR_SIZE_VER0,
  3380. [1] = PERF_ATTR_SIZE_VER1,
  3381. [2] = PERF_ATTR_SIZE_VER2,
  3382. [3] = PERF_ATTR_SIZE_VER3,
  3383. [4] = PERF_ATTR_SIZE_VER4,
  3384. 0,
  3385. };
  3386. /*
  3387. * In the legacy file format, the magic number is not used to encode endianness.
  3388. * hdr_sz was used to encode endianness. But given that hdr_sz can vary based
  3389. * on ABI revisions, we need to try all combinations for all endianness to
  3390. * detect the endianness.
  3391. */
  3392. static int try_all_file_abis(uint64_t hdr_sz, struct perf_header *ph)
  3393. {
  3394. uint64_t ref_size, attr_size;
  3395. int i;
  3396. for (i = 0 ; attr_file_abi_sizes[i]; i++) {
  3397. ref_size = attr_file_abi_sizes[i]
  3398. + sizeof(struct perf_file_section);
  3399. if (hdr_sz != ref_size) {
  3400. attr_size = bswap_64(hdr_sz);
  3401. if (attr_size != ref_size)
  3402. continue;
  3403. ph->needs_swap = true;
  3404. }
  3405. pr_debug("ABI%d perf.data file detected, need_swap=%d\n",
  3406. i,
  3407. ph->needs_swap);
  3408. return 0;
  3409. }
  3410. /* could not determine endianness */
  3411. return -1;
  3412. }
  3413. #define PERF_PIPE_HDR_VER0 16
  3414. static const size_t attr_pipe_abi_sizes[] = {
  3415. [0] = PERF_PIPE_HDR_VER0,
  3416. 0,
  3417. };
  3418. /*
  3419. * In the legacy pipe format, there is an implicit assumption that endianness
  3420. * between host recording the samples, and host parsing the samples is the
  3421. * same. This is not always the case given that the pipe output may always be
  3422. * redirected into a file and analyzed on a different machine with possibly a
  3423. * different endianness and perf_event ABI revisions in the perf tool itself.
  3424. */
  3425. static int try_all_pipe_abis(uint64_t hdr_sz, struct perf_header *ph)
  3426. {
  3427. u64 attr_size;
  3428. int i;
  3429. for (i = 0 ; attr_pipe_abi_sizes[i]; i++) {
  3430. if (hdr_sz != attr_pipe_abi_sizes[i]) {
  3431. attr_size = bswap_64(hdr_sz);
  3432. if (attr_size != hdr_sz)
  3433. continue;
  3434. ph->needs_swap = true;
  3435. }
  3436. pr_debug("Pipe ABI%d perf.data file detected\n", i);
  3437. return 0;
  3438. }
  3439. return -1;
  3440. }
  3441. bool is_perf_magic(u64 magic)
  3442. {
  3443. if (!memcmp(&magic, __perf_magic1, sizeof(magic))
  3444. || magic == __perf_magic2
  3445. || magic == __perf_magic2_sw)
  3446. return true;
  3447. return false;
  3448. }
  3449. static int check_magic_endian(u64 magic, uint64_t hdr_sz,
  3450. bool is_pipe, struct perf_header *ph)
  3451. {
  3452. int ret;
  3453. /* check for legacy format */
  3454. ret = memcmp(&magic, __perf_magic1, sizeof(magic));
  3455. if (ret == 0) {
  3456. ph->version = PERF_HEADER_VERSION_1;
  3457. pr_debug("legacy perf.data format\n");
  3458. if (is_pipe)
  3459. return try_all_pipe_abis(hdr_sz, ph);
  3460. return try_all_file_abis(hdr_sz, ph);
  3461. }
  3462. /*
  3463. * the new magic number serves two purposes:
  3464. * - unique number to identify actual perf.data files
  3465. * - encode endianness of file
  3466. */
  3467. ph->version = PERF_HEADER_VERSION_2;
  3468. /* check magic number with one endianness */
  3469. if (magic == __perf_magic2)
  3470. return 0;
  3471. /* check magic number with opposite endianness */
  3472. if (magic != __perf_magic2_sw)
  3473. return -1;
  3474. ph->needs_swap = true;
  3475. return 0;
  3476. }
  3477. int perf_file_header__read(struct perf_file_header *header,
  3478. struct perf_header *ph, int fd)
  3479. {
  3480. ssize_t ret;
  3481. lseek(fd, 0, SEEK_SET);
  3482. ret = readn(fd, header, sizeof(*header));
  3483. if (ret <= 0)
  3484. return -1;
  3485. if (check_magic_endian(header->magic,
  3486. header->attr_size, false, ph) < 0) {
  3487. pr_debug("magic/endian check failed\n");
  3488. return -1;
  3489. }
  3490. if (ph->needs_swap) {
  3491. mem_bswap_64(header, offsetof(struct perf_file_header,
  3492. adds_features));
  3493. }
  3494. if (header->size > header->attrs.offset) {
  3495. pr_err("Perf file header corrupt: header overlaps attrs\n");
  3496. return -1;
  3497. }
  3498. if (header->size > header->data.offset) {
  3499. pr_err("Perf file header corrupt: header overlaps data\n");
  3500. return -1;
  3501. }
  3502. if ((header->attrs.offset <= header->data.offset &&
  3503. header->attrs.offset + header->attrs.size > header->data.offset) ||
  3504. (header->attrs.offset > header->data.offset &&
  3505. header->data.offset + header->data.size > header->attrs.offset)) {
  3506. pr_err("Perf file header corrupt: Attributes and data overlap\n");
  3507. return -1;
  3508. }
  3509. if (header->size != sizeof(*header)) {
  3510. /* Support the previous format */
  3511. if (header->size == offsetof(typeof(*header), adds_features))
  3512. bitmap_zero(header->adds_features, HEADER_FEAT_BITS);
  3513. else
  3514. return -1;
  3515. } else if (ph->needs_swap) {
  3516. /*
  3517. * feature bitmap is declared as an array of unsigned longs --
  3518. * not good since its size can differ between the host that
  3519. * generated the data file and the host analyzing the file.
  3520. *
  3521. * We need to handle endianness, but we don't know the size of
  3522. * the unsigned long where the file was generated. Take a best
  3523. * guess at determining it: try 64-bit swap first (ie., file
  3524. * created on a 64-bit host), and check if the hostname feature
  3525. * bit is set (this feature bit is forced on as of fbe96f2).
  3526. * If the bit is not, undo the 64-bit swap and try a 32-bit
  3527. * swap. If the hostname bit is still not set (e.g., older data
  3528. * file), punt and fallback to the original behavior --
  3529. * clearing all feature bits and setting buildid.
  3530. */
  3531. mem_bswap_64(&header->adds_features,
  3532. BITS_TO_U64(HEADER_FEAT_BITS));
  3533. if (!test_bit(HEADER_HOSTNAME, header->adds_features)) {
  3534. /* unswap as u64 */
  3535. mem_bswap_64(&header->adds_features,
  3536. BITS_TO_U64(HEADER_FEAT_BITS));
  3537. /* unswap as u32 */
  3538. mem_bswap_32(&header->adds_features,
  3539. BITS_TO_U32(HEADER_FEAT_BITS));
  3540. }
  3541. if (!test_bit(HEADER_HOSTNAME, header->adds_features)) {
  3542. bitmap_zero(header->adds_features, HEADER_FEAT_BITS);
  3543. __set_bit(HEADER_BUILD_ID, header->adds_features);
  3544. }
  3545. }
  3546. memcpy(&ph->adds_features, &header->adds_features,
  3547. sizeof(ph->adds_features));
  3548. ph->data_offset = header->data.offset;
  3549. ph->data_size = header->data.size;
  3550. ph->feat_offset = header->data.offset + header->data.size;
  3551. return 0;
  3552. }
  3553. static int perf_file_section__process(struct perf_file_section *section,
  3554. struct perf_header *ph,
  3555. int feat, int fd, void *data)
  3556. {
  3557. struct feat_fd fdd = {
  3558. .fd = fd,
  3559. .ph = ph,
  3560. .size = section->size,
  3561. .offset = section->offset,
  3562. };
  3563. if (lseek(fd, section->offset, SEEK_SET) == (off_t)-1) {
  3564. pr_debug("Failed to lseek to %" PRIu64 " offset for feature "
  3565. "%d, continuing...\n", section->offset, feat);
  3566. return 0;
  3567. }
  3568. if (feat >= HEADER_LAST_FEATURE) {
  3569. pr_debug("unknown feature %d, continuing...\n", feat);
  3570. return 0;
  3571. }
  3572. if (!feat_ops[feat].process)
  3573. return 0;
  3574. return feat_ops[feat].process(&fdd, data);
  3575. }
  3576. static int perf_file_header__read_pipe(struct perf_pipe_file_header *header,
  3577. struct perf_header *ph,
  3578. struct perf_data *data)
  3579. {
  3580. ssize_t ret;
  3581. ret = perf_data__read(data, header, sizeof(*header));
  3582. if (ret <= 0)
  3583. return -1;
  3584. if (check_magic_endian(header->magic, header->size, true, ph) < 0) {
  3585. pr_debug("endian/magic failed\n");
  3586. return -1;
  3587. }
  3588. if (ph->needs_swap)
  3589. header->size = bswap_64(header->size);
  3590. return 0;
  3591. }
  3592. static int perf_header__read_pipe(struct perf_session *session)
  3593. {
  3594. struct perf_header *header = &session->header;
  3595. struct perf_pipe_file_header f_header;
  3596. if (perf_file_header__read_pipe(&f_header, header, session->data) < 0) {
  3597. pr_debug("incompatible file format\n");
  3598. return -EINVAL;
  3599. }
  3600. return f_header.size == sizeof(f_header) ? 0 : -1;
  3601. }
  3602. static int read_attr(int fd, struct perf_header *ph,
  3603. struct perf_file_attr *f_attr)
  3604. {
  3605. struct perf_event_attr *attr = &f_attr->attr;
  3606. size_t sz, left;
  3607. size_t our_sz = sizeof(f_attr->attr);
  3608. ssize_t ret;
  3609. memset(f_attr, 0, sizeof(*f_attr));
  3610. /* read minimal guaranteed structure */
  3611. ret = readn(fd, attr, PERF_ATTR_SIZE_VER0);
  3612. if (ret <= 0) {
  3613. pr_debug("cannot read %d bytes of header attr\n",
  3614. PERF_ATTR_SIZE_VER0);
  3615. return -1;
  3616. }
  3617. /* on file perf_event_attr size */
  3618. sz = attr->size;
  3619. if (ph->needs_swap)
  3620. sz = bswap_32(sz);
  3621. if (sz == 0) {
  3622. /* assume ABI0 */
  3623. sz = PERF_ATTR_SIZE_VER0;
  3624. } else if (sz > our_sz) {
  3625. pr_debug("file uses a more recent and unsupported ABI"
  3626. " (%zu bytes extra)\n", sz - our_sz);
  3627. return -1;
  3628. }
  3629. /* what we have not yet read and that we know about */
  3630. left = sz - PERF_ATTR_SIZE_VER0;
  3631. if (left) {
  3632. void *ptr = attr;
  3633. ptr += PERF_ATTR_SIZE_VER0;
  3634. ret = readn(fd, ptr, left);
  3635. }
  3636. /* read perf_file_section, ids are read in caller */
  3637. ret = readn(fd, &f_attr->ids, sizeof(f_attr->ids));
  3638. return ret <= 0 ? -1 : 0;
  3639. }
  3640. #ifdef HAVE_LIBTRACEEVENT
  3641. static int evsel__prepare_tracepoint_event(struct evsel *evsel, struct tep_handle *pevent)
  3642. {
  3643. struct tep_event *event;
  3644. char bf[128];
  3645. /* already prepared */
  3646. if (evsel->tp_format)
  3647. return 0;
  3648. if (pevent == NULL) {
  3649. pr_debug("broken or missing trace data\n");
  3650. return -1;
  3651. }
  3652. event = tep_find_event(pevent, evsel->core.attr.config);
  3653. if (event == NULL) {
  3654. pr_debug("cannot find event format for %d\n", (int)evsel->core.attr.config);
  3655. return -1;
  3656. }
  3657. if (!evsel->name) {
  3658. snprintf(bf, sizeof(bf), "%s:%s", event->system, event->name);
  3659. evsel->name = strdup(bf);
  3660. if (evsel->name == NULL)
  3661. return -1;
  3662. }
  3663. evsel->tp_format = event;
  3664. return 0;
  3665. }
  3666. static int evlist__prepare_tracepoint_events(struct evlist *evlist, struct tep_handle *pevent)
  3667. {
  3668. struct evsel *pos;
  3669. evlist__for_each_entry(evlist, pos) {
  3670. if (pos->core.attr.type == PERF_TYPE_TRACEPOINT &&
  3671. evsel__prepare_tracepoint_event(pos, pevent))
  3672. return -1;
  3673. }
  3674. return 0;
  3675. }
  3676. #endif
  3677. int perf_session__read_header(struct perf_session *session)
  3678. {
  3679. struct perf_data *data = session->data;
  3680. struct perf_header *header = &session->header;
  3681. struct perf_file_header f_header;
  3682. struct perf_file_attr f_attr;
  3683. u64 f_id;
  3684. int nr_attrs, nr_ids, i, j, err;
  3685. int fd = perf_data__fd(data);
  3686. session->evlist = evlist__new();
  3687. if (session->evlist == NULL)
  3688. return -ENOMEM;
  3689. session->evlist->session = session;
  3690. session->machines.host.env = &header->env;
  3691. /*
  3692. * We can read 'pipe' data event from regular file,
  3693. * check for the pipe header regardless of source.
  3694. */
  3695. err = perf_header__read_pipe(session);
  3696. if (!err || perf_data__is_pipe(data)) {
  3697. data->is_pipe = true;
  3698. return err;
  3699. }
  3700. if (perf_file_header__read(&f_header, header, fd) < 0)
  3701. return -EINVAL;
  3702. if (header->needs_swap && data->in_place_update) {
  3703. pr_err("In-place update not supported when byte-swapping is required\n");
  3704. return -EINVAL;
  3705. }
  3706. /*
  3707. * Sanity check that perf.data was written cleanly; data size is
  3708. * initialized to 0 and updated only if the on_exit function is run.
  3709. * If data size is still 0 then the file contains only partial
  3710. * information. Just warn user and process it as much as it can.
  3711. */
  3712. if (f_header.data.size == 0) {
  3713. pr_warning("WARNING: The %s file's data size field is 0 which is unexpected.\n"
  3714. "Was the 'perf record' command properly terminated?\n",
  3715. data->file.path);
  3716. }
  3717. if (f_header.attr_size == 0) {
  3718. pr_err("ERROR: The %s file's attr size field is 0 which is unexpected.\n"
  3719. "Was the 'perf record' command properly terminated?\n",
  3720. data->file.path);
  3721. return -EINVAL;
  3722. }
  3723. nr_attrs = f_header.attrs.size / f_header.attr_size;
  3724. lseek(fd, f_header.attrs.offset, SEEK_SET);
  3725. for (i = 0; i < nr_attrs; i++) {
  3726. struct evsel *evsel;
  3727. off_t tmp;
  3728. if (read_attr(fd, header, &f_attr) < 0)
  3729. goto out_errno;
  3730. if (header->needs_swap) {
  3731. f_attr.ids.size = bswap_64(f_attr.ids.size);
  3732. f_attr.ids.offset = bswap_64(f_attr.ids.offset);
  3733. perf_event__attr_swap(&f_attr.attr);
  3734. }
  3735. tmp = lseek(fd, 0, SEEK_CUR);
  3736. evsel = evsel__new(&f_attr.attr);
  3737. if (evsel == NULL)
  3738. goto out_delete_evlist;
  3739. evsel->needs_swap = header->needs_swap;
  3740. /*
  3741. * Do it before so that if perf_evsel__alloc_id fails, this
  3742. * entry gets purged too at evlist__delete().
  3743. */
  3744. evlist__add(session->evlist, evsel);
  3745. nr_ids = f_attr.ids.size / sizeof(u64);
  3746. /*
  3747. * We don't have the cpu and thread maps on the header, so
  3748. * for allocating the perf_sample_id table we fake 1 cpu and
  3749. * hattr->ids threads.
  3750. */
  3751. if (perf_evsel__alloc_id(&evsel->core, 1, nr_ids))
  3752. goto out_delete_evlist;
  3753. lseek(fd, f_attr.ids.offset, SEEK_SET);
  3754. for (j = 0; j < nr_ids; j++) {
  3755. if (perf_header__getbuffer64(header, fd, &f_id, sizeof(f_id)))
  3756. goto out_errno;
  3757. perf_evlist__id_add(&session->evlist->core, &evsel->core, 0, j, f_id);
  3758. }
  3759. lseek(fd, tmp, SEEK_SET);
  3760. }
  3761. #ifdef HAVE_LIBTRACEEVENT
  3762. perf_header__process_sections(header, fd, &session->tevent,
  3763. perf_file_section__process);
  3764. if (evlist__prepare_tracepoint_events(session->evlist, session->tevent.pevent))
  3765. goto out_delete_evlist;
  3766. #else
  3767. perf_header__process_sections(header, fd, NULL, perf_file_section__process);
  3768. #endif
  3769. return 0;
  3770. out_errno:
  3771. return -errno;
  3772. out_delete_evlist:
  3773. evlist__delete(session->evlist);
  3774. session->evlist = NULL;
  3775. return -ENOMEM;
  3776. }
  3777. int perf_event__process_feature(struct perf_session *session,
  3778. union perf_event *event)
  3779. {
  3780. struct feat_fd ff = { .fd = 0 };
  3781. struct perf_record_header_feature *fe = (struct perf_record_header_feature *)event;
  3782. int type = fe->header.type;
  3783. u64 feat = fe->feat_id;
  3784. int ret = 0;
  3785. bool print = dump_trace;
  3786. if (type < 0 || type >= PERF_RECORD_HEADER_MAX) {
  3787. pr_warning("invalid record type %d in pipe-mode\n", type);
  3788. return 0;
  3789. }
  3790. if (feat == HEADER_RESERVED || feat >= HEADER_LAST_FEATURE) {
  3791. pr_warning("invalid record type %d in pipe-mode\n", type);
  3792. return -1;
  3793. }
  3794. ff.buf = (void *)fe->data;
  3795. ff.size = event->header.size - sizeof(*fe);
  3796. ff.ph = &session->header;
  3797. if (feat_ops[feat].process && feat_ops[feat].process(&ff, NULL)) {
  3798. ret = -1;
  3799. goto out;
  3800. }
  3801. if (session->tool->show_feat_hdr) {
  3802. if (!feat_ops[feat].full_only ||
  3803. session->tool->show_feat_hdr >= SHOW_FEAT_HEADER_FULL_INFO) {
  3804. print = true;
  3805. } else {
  3806. fprintf(stdout, "# %s info available, use -I to display\n",
  3807. feat_ops[feat].name);
  3808. }
  3809. }
  3810. if (dump_trace)
  3811. printf(", ");
  3812. if (print) {
  3813. if (feat_ops[feat].print)
  3814. feat_ops[feat].print(&ff, stdout);
  3815. else
  3816. printf("# %s", feat_ops[feat].name);
  3817. }
  3818. out:
  3819. free_event_desc(ff.events);
  3820. return ret;
  3821. }
  3822. size_t perf_event__fprintf_event_update(union perf_event *event, FILE *fp)
  3823. {
  3824. struct perf_record_event_update *ev = &event->event_update;
  3825. struct perf_cpu_map *map;
  3826. size_t ret;
  3827. ret = fprintf(fp, "\n... id: %" PRI_lu64 "\n", ev->id);
  3828. switch (ev->type) {
  3829. case PERF_EVENT_UPDATE__SCALE:
  3830. ret += fprintf(fp, "... scale: %f\n", ev->scale.scale);
  3831. break;
  3832. case PERF_EVENT_UPDATE__UNIT:
  3833. ret += fprintf(fp, "... unit: %s\n", ev->unit);
  3834. break;
  3835. case PERF_EVENT_UPDATE__NAME:
  3836. ret += fprintf(fp, "... name: %s\n", ev->name);
  3837. break;
  3838. case PERF_EVENT_UPDATE__CPUS:
  3839. ret += fprintf(fp, "... ");
  3840. map = cpu_map__new_data(&ev->cpus.cpus);
  3841. if (map) {
  3842. ret += cpu_map__fprintf(map, fp);
  3843. perf_cpu_map__put(map);
  3844. } else
  3845. ret += fprintf(fp, "failed to get cpus\n");
  3846. break;
  3847. default:
  3848. ret += fprintf(fp, "... unknown type\n");
  3849. break;
  3850. }
  3851. return ret;
  3852. }
  3853. size_t perf_event__fprintf_attr(union perf_event *event, FILE *fp)
  3854. {
  3855. return perf_event_attr__fprintf(fp, &event->attr.attr, __desc_attr__fprintf, NULL);
  3856. }
  3857. int perf_event__process_attr(const struct perf_tool *tool __maybe_unused,
  3858. union perf_event *event,
  3859. struct evlist **pevlist)
  3860. {
  3861. u32 i, n_ids;
  3862. u64 *ids;
  3863. struct evsel *evsel;
  3864. struct evlist *evlist = *pevlist;
  3865. if (dump_trace)
  3866. perf_event__fprintf_attr(event, stdout);
  3867. if (evlist == NULL) {
  3868. *pevlist = evlist = evlist__new();
  3869. if (evlist == NULL)
  3870. return -ENOMEM;
  3871. }
  3872. evsel = evsel__new(&event->attr.attr);
  3873. if (evsel == NULL)
  3874. return -ENOMEM;
  3875. evlist__add(evlist, evsel);
  3876. n_ids = event->header.size - sizeof(event->header) - event->attr.attr.size;
  3877. n_ids = n_ids / sizeof(u64);
  3878. /*
  3879. * We don't have the cpu and thread maps on the header, so
  3880. * for allocating the perf_sample_id table we fake 1 cpu and
  3881. * hattr->ids threads.
  3882. */
  3883. if (perf_evsel__alloc_id(&evsel->core, 1, n_ids))
  3884. return -ENOMEM;
  3885. ids = perf_record_header_attr_id(event);
  3886. for (i = 0; i < n_ids; i++) {
  3887. perf_evlist__id_add(&evlist->core, &evsel->core, 0, i, ids[i]);
  3888. }
  3889. return 0;
  3890. }
  3891. int perf_event__process_event_update(const struct perf_tool *tool __maybe_unused,
  3892. union perf_event *event,
  3893. struct evlist **pevlist)
  3894. {
  3895. struct perf_record_event_update *ev = &event->event_update;
  3896. struct evlist *evlist;
  3897. struct evsel *evsel;
  3898. struct perf_cpu_map *map;
  3899. if (dump_trace)
  3900. perf_event__fprintf_event_update(event, stdout);
  3901. if (!pevlist || *pevlist == NULL)
  3902. return -EINVAL;
  3903. evlist = *pevlist;
  3904. evsel = evlist__id2evsel(evlist, ev->id);
  3905. if (evsel == NULL)
  3906. return -EINVAL;
  3907. switch (ev->type) {
  3908. case PERF_EVENT_UPDATE__UNIT:
  3909. free((char *)evsel->unit);
  3910. evsel->unit = strdup(ev->unit);
  3911. break;
  3912. case PERF_EVENT_UPDATE__NAME:
  3913. free(evsel->name);
  3914. evsel->name = strdup(ev->name);
  3915. break;
  3916. case PERF_EVENT_UPDATE__SCALE:
  3917. evsel->scale = ev->scale.scale;
  3918. break;
  3919. case PERF_EVENT_UPDATE__CPUS:
  3920. map = cpu_map__new_data(&ev->cpus.cpus);
  3921. if (map) {
  3922. perf_cpu_map__put(evsel->core.pmu_cpus);
  3923. evsel->core.pmu_cpus = map;
  3924. } else
  3925. pr_err("failed to get event_update cpus\n");
  3926. default:
  3927. break;
  3928. }
  3929. return 0;
  3930. }
  3931. #ifdef HAVE_LIBTRACEEVENT
  3932. int perf_event__process_tracing_data(const struct perf_tool *tool __maybe_unused,
  3933. struct perf_session *session,
  3934. union perf_event *event)
  3935. {
  3936. ssize_t size_read, padding, size = event->tracing_data.size;
  3937. int fd = perf_data__fd(session->data);
  3938. char buf[BUFSIZ];
  3939. /*
  3940. * The pipe fd is already in proper place and in any case
  3941. * we can't move it, and we'd screw the case where we read
  3942. * 'pipe' data from regular file. The trace_report reads
  3943. * data from 'fd' so we need to set it directly behind the
  3944. * event, where the tracing data starts.
  3945. */
  3946. if (!perf_data__is_pipe(session->data)) {
  3947. off_t offset = lseek(fd, 0, SEEK_CUR);
  3948. /* setup for reading amidst mmap */
  3949. lseek(fd, offset + sizeof(struct perf_record_header_tracing_data),
  3950. SEEK_SET);
  3951. }
  3952. size_read = trace_report(fd, &session->tevent, session->trace_event_repipe);
  3953. padding = PERF_ALIGN(size_read, sizeof(u64)) - size_read;
  3954. if (readn(fd, buf, padding) < 0) {
  3955. pr_err("%s: reading input file", __func__);
  3956. return -1;
  3957. }
  3958. if (session->trace_event_repipe) {
  3959. int retw = write(STDOUT_FILENO, buf, padding);
  3960. if (retw <= 0 || retw != padding) {
  3961. pr_err("%s: repiping tracing data padding", __func__);
  3962. return -1;
  3963. }
  3964. }
  3965. if (size_read + padding != size) {
  3966. pr_err("%s: tracing data size mismatch", __func__);
  3967. return -1;
  3968. }
  3969. evlist__prepare_tracepoint_events(session->evlist, session->tevent.pevent);
  3970. return size_read + padding;
  3971. }
  3972. #endif
  3973. int perf_event__process_build_id(const struct perf_tool *tool __maybe_unused,
  3974. struct perf_session *session,
  3975. union perf_event *event)
  3976. {
  3977. __event_process_build_id(&event->build_id,
  3978. event->build_id.filename,
  3979. session);
  3980. return 0;
  3981. }