12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711107121071310714107151071610717107181071910720107211072210723107241072510726107271072810729107301073110732107331073410735107361073710738107391074010741107421074310744107451074610747107481074910750107511075210753107541075510756107571075810759107601076110762107631076410765107661076710768107691077010771107721077310774107751077610777107781077910780107811078210783107841078510786107871078810789107901079110792107931079410795107961079710798107991080010801108021080310804108051080610807108081080910810108111081210813108141081510816108171081810819108201082110822108231082410825108261082710828108291083010831108321083310834108351083610837108381083910840108411084210843108441084510846108471084810849108501085110852108531085410855108561085710858108591086010861108621086310864108651086610867108681086910870108711087210873108741087510876108771087810879108801088110882108831088410885108861088710888108891089010891108921089310894108951089610897108981089910900109011090210903109041090510906109071090810909109101091110912109131091410915109161091710918109191092010921109221092310924109251092610927109281092910930109311093210933109341093510936109371093810939109401094110942109431094410945109461094710948109491095010951109521095310954109551095610957109581095910960109611096210963109641096510966109671096810969109701097110972109731097410975109761097710978109791098010981109821098310984109851098610987109881098910990109911099210993109941099510996109971099810999110001100111002110031100411005110061100711008110091101011011110121101311014110151101611017110181101911020110211102211023110241102511026110271102811029110301103111032110331103411035110361103711038110391104011041110421104311044110451104611047110481104911050110511105211053110541105511056110571105811059110601106111062110631106411065110661106711068110691107011071110721107311074110751107611077110781107911080110811108211083110841108511086110871108811089110901109111092110931109411095110961109711098110991110011101111021110311104111051110611107111081110911110111111111211113111141111511116111171111811119111201112111122111231112411125111261112711128111291113011131111321113311134111351113611137111381113911140111411114211143111441114511146111471114811149111501115111152111531115411155111561115711158111591116011161111621116311164111651116611167111681116911170111711117211173111741117511176111771117811179111801118111182111831118411185111861118711188111891119011191111921119311194111951119611197111981119911200112011120211203112041120511206112071120811209112101121111212112131121411215112161121711218112191122011221112221122311224112251122611227112281122911230112311123211233112341123511236112371123811239112401124111242112431124411245112461124711248112491125011251112521125311254112551125611257112581125911260112611126211263112641126511266112671126811269112701127111272112731127411275112761127711278112791128011281112821128311284112851128611287112881128911290112911129211293112941129511296112971129811299113001130111302113031130411305113061130711308113091131011311113121131311314113151131611317113181131911320113211132211323113241132511326113271132811329113301133111332113331133411335113361133711338113391134011341113421134311344113451134611347113481134911350113511135211353113541135511356113571135811359113601136111362113631136411365113661136711368113691137011371113721137311374113751137611377113781137911380113811138211383113841138511386113871138811389113901139111392113931139411395113961139711398113991140011401114021140311404114051140611407114081140911410114111141211413114141141511416114171141811419114201142111422114231142411425114261142711428114291143011431114321143311434114351143611437114381143911440114411144211443114441144511446114471144811449114501145111452114531145411455114561145711458114591146011461114621146311464114651146611467114681146911470114711147211473114741147511476114771147811479114801148111482114831148411485114861148711488114891149011491114921149311494114951149611497114981149911500115011150211503115041150511506115071150811509115101151111512115131151411515115161151711518115191152011521115221152311524115251152611527115281152911530115311153211533115341153511536115371153811539115401154111542115431154411545115461154711548115491155011551115521155311554115551155611557115581155911560115611156211563115641156511566115671156811569115701157111572115731157411575115761157711578115791158011581115821158311584115851158611587115881158911590115911159211593115941159511596115971159811599116001160111602116031160411605116061160711608116091161011611116121161311614116151161611617116181161911620116211162211623116241162511626116271162811629116301163111632116331163411635116361163711638116391164011641116421164311644116451164611647116481164911650116511165211653116541165511656116571165811659116601166111662116631166411665116661166711668116691167011671116721167311674116751167611677116781167911680116811168211683116841168511686116871168811689116901169111692116931169411695116961169711698116991170011701117021170311704117051170611707117081170911710117111171211713117141171511716117171171811719117201172111722117231172411725117261172711728117291173011731117321173311734117351173611737117381173911740117411174211743117441174511746117471174811749117501175111752117531175411755117561175711758117591176011761117621176311764117651176611767117681176911770117711177211773117741177511776117771177811779117801178111782117831178411785117861178711788117891179011791117921179311794117951179611797117981179911800118011180211803118041180511806118071180811809118101181111812118131181411815118161181711818118191182011821118221182311824118251182611827118281182911830118311183211833118341183511836118371183811839118401184111842118431184411845118461184711848118491185011851118521185311854118551185611857118581185911860118611186211863118641186511866118671186811869118701187111872118731187411875118761187711878118791188011881118821188311884118851188611887118881188911890118911189211893118941189511896118971189811899119001190111902119031190411905119061190711908119091191011911119121191311914119151191611917119181191911920119211192211923119241192511926119271192811929119301193111932119331193411935119361193711938119391194011941119421194311944119451194611947119481194911950119511195211953119541195511956119571195811959119601196111962119631196411965119661196711968119691197011971119721197311974119751197611977119781197911980119811198211983119841198511986119871198811989119901199111992119931199411995119961199711998119991200012001120021200312004120051200612007120081200912010120111201212013120141201512016120171201812019120201202112022120231202412025120261202712028120291203012031120321203312034120351203612037120381203912040120411204212043120441204512046120471204812049120501205112052120531205412055120561205712058120591206012061120621206312064120651206612067120681206912070120711207212073120741207512076120771207812079120801208112082120831208412085120861208712088120891209012091120921209312094120951209612097120981209912100121011210212103121041210512106121071210812109121101211112112121131211412115121161211712118121191212012121121221212312124121251212612127121281212912130121311213212133121341213512136121371213812139121401214112142121431214412145121461214712148121491215012151121521215312154121551215612157121581215912160121611216212163121641216512166121671216812169121701217112172121731217412175121761217712178121791218012181121821218312184121851218612187121881218912190121911219212193121941219512196121971219812199122001220112202122031220412205122061220712208122091221012211122121221312214122151221612217122181221912220122211222212223122241222512226122271222812229122301223112232122331223412235122361223712238122391224012241122421224312244122451224612247122481224912250122511225212253122541225512256122571225812259122601226112262122631226412265122661226712268122691227012271122721227312274122751227612277122781227912280122811228212283122841228512286122871228812289122901229112292122931229412295122961229712298122991230012301123021230312304123051230612307123081230912310123111231212313123141231512316123171231812319123201232112322123231232412325123261232712328123291233012331123321233312334123351233612337123381233912340123411234212343123441234512346123471234812349123501235112352123531235412355123561235712358123591236012361123621236312364123651236612367123681236912370123711237212373123741237512376123771237812379123801238112382123831238412385123861238712388123891239012391123921239312394123951239612397123981239912400124011240212403124041240512406124071240812409124101241112412124131241412415124161241712418124191242012421124221242312424124251242612427124281242912430124311243212433124341243512436124371243812439124401244112442124431244412445124461244712448124491245012451124521245312454124551245612457124581245912460124611246212463124641246512466124671246812469124701247112472124731247412475124761247712478124791248012481124821248312484124851248612487124881248912490124911249212493124941249512496124971249812499125001250112502125031250412505125061250712508125091251012511125121251312514125151251612517125181251912520125211252212523125241252512526125271252812529125301253112532125331253412535125361253712538125391254012541125421254312544125451254612547125481254912550125511255212553125541255512556125571255812559125601256112562125631256412565125661256712568125691257012571125721257312574125751257612577125781257912580125811258212583125841258512586125871258812589125901259112592125931259412595125961259712598125991260012601126021260312604126051260612607126081260912610126111261212613126141261512616126171261812619126201262112622126231262412625126261262712628126291263012631126321263312634126351263612637126381263912640126411264212643126441264512646126471264812649126501265112652126531265412655126561265712658126591266012661126621266312664126651266612667126681266912670126711267212673126741267512676126771267812679126801268112682126831268412685126861268712688126891269012691126921269312694126951269612697126981269912700127011270212703127041270512706127071270812709127101271112712127131271412715127161271712718127191272012721127221272312724127251272612727127281272912730127311273212733127341273512736127371273812739127401274112742127431274412745127461274712748127491275012751127521275312754127551275612757127581275912760127611276212763127641276512766127671276812769127701277112772127731277412775127761277712778127791278012781127821278312784127851278612787127881278912790127911279212793127941279512796127971279812799128001280112802128031280412805128061280712808128091281012811128121281312814128151281612817128181281912820128211282212823128241282512826128271282812829128301283112832128331283412835128361283712838128391284012841128421284312844128451284612847128481284912850128511285212853128541285512856128571285812859128601286112862128631286412865128661286712868128691287012871128721287312874128751287612877128781287912880128811288212883128841288512886128871288812889128901289112892128931289412895128961289712898128991290012901129021290312904129051290612907129081290912910129111291212913129141291512916129171291812919129201292112922129231292412925129261292712928129291293012931129321293312934129351293612937129381293912940129411294212943129441294512946129471294812949129501295112952129531295412955129561295712958129591296012961129621296312964129651296612967129681296912970129711297212973129741297512976129771297812979129801298112982129831298412985129861298712988129891299012991129921299312994129951299612997129981299913000130011300213003130041300513006130071300813009130101301113012130131301413015130161301713018130191302013021130221302313024130251302613027130281302913030130311303213033130341303513036130371303813039130401304113042130431304413045130461304713048130491305013051130521305313054130551305613057130581305913060130611306213063130641306513066130671306813069130701307113072130731307413075130761307713078130791308013081130821308313084130851308613087130881308913090130911309213093130941309513096130971309813099131001310113102131031310413105131061310713108131091311013111131121311313114131151311613117131181311913120131211312213123131241312513126131271312813129131301313113132131331313413135131361313713138131391314013141131421314313144131451314613147131481314913150131511315213153131541315513156131571315813159131601316113162131631316413165131661316713168131691317013171131721317313174131751317613177131781317913180131811318213183131841318513186131871318813189131901319113192131931319413195131961319713198131991320013201132021320313204132051320613207132081320913210132111321213213132141321513216132171321813219132201322113222132231322413225132261322713228132291323013231132321323313234132351323613237132381323913240132411324213243132441324513246132471324813249132501325113252132531325413255132561325713258132591326013261132621326313264132651326613267132681326913270132711327213273132741327513276132771327813279132801328113282132831328413285132861328713288132891329013291132921329313294132951329613297132981329913300133011330213303133041330513306133071330813309133101331113312133131331413315133161331713318133191332013321133221332313324133251332613327133281332913330133311333213333133341333513336133371333813339133401334113342133431334413345133461334713348133491335013351133521335313354133551335613357133581335913360133611336213363133641336513366133671336813369133701337113372133731337413375133761337713378133791338013381133821338313384133851338613387133881338913390133911339213393133941339513396133971339813399134001340113402134031340413405134061340713408134091341013411134121341313414134151341613417134181341913420134211342213423134241342513426134271342813429134301343113432134331343413435134361343713438134391344013441134421344313444134451344613447134481344913450134511345213453134541345513456134571345813459134601346113462134631346413465134661346713468134691347013471134721347313474134751347613477134781347913480134811348213483134841348513486134871348813489134901349113492134931349413495134961349713498134991350013501135021350313504135051350613507135081350913510135111351213513135141351513516135171351813519135201352113522135231352413525135261352713528135291353013531135321353313534135351353613537135381353913540135411354213543135441354513546135471354813549135501355113552135531355413555135561355713558135591356013561135621356313564135651356613567135681356913570135711357213573135741357513576135771357813579135801358113582135831358413585135861358713588135891359013591135921359313594135951359613597135981359913600136011360213603136041360513606136071360813609136101361113612136131361413615136161361713618136191362013621136221362313624136251362613627136281362913630136311363213633136341363513636136371363813639136401364113642136431364413645136461364713648136491365013651136521365313654136551365613657136581365913660136611366213663136641366513666136671366813669136701367113672136731367413675136761367713678136791368013681136821368313684136851368613687136881368913690136911369213693136941369513696136971369813699137001370113702137031370413705137061370713708137091371013711137121371313714137151371613717137181371913720137211372213723137241372513726137271372813729137301373113732137331373413735137361373713738137391374013741137421374313744137451374613747137481374913750137511375213753137541375513756137571375813759137601376113762137631376413765137661376713768137691377013771137721377313774137751377613777137781377913780137811378213783137841378513786137871378813789137901379113792137931379413795137961379713798137991380013801138021380313804138051380613807138081380913810138111381213813138141381513816138171381813819138201382113822138231382413825138261382713828138291383013831138321383313834138351383613837138381383913840138411384213843138441384513846138471384813849138501385113852138531385413855138561385713858138591386013861138621386313864138651386613867138681386913870138711387213873138741387513876138771387813879138801388113882138831388413885138861388713888138891389013891138921389313894138951389613897138981389913900139011390213903139041390513906139071390813909139101391113912139131391413915139161391713918139191392013921139221392313924139251392613927139281392913930139311393213933139341393513936139371393813939139401394113942139431394413945139461394713948139491395013951139521395313954139551395613957139581395913960139611396213963139641396513966139671396813969139701397113972139731397413975139761397713978139791398013981139821398313984139851398613987139881398913990139911399213993139941399513996139971399813999140001400114002140031400414005140061400714008140091401014011140121401314014140151401614017140181401914020140211402214023140241402514026140271402814029140301403114032140331403414035140361403714038140391404014041140421404314044140451404614047140481404914050140511405214053140541405514056140571405814059140601406114062140631406414065140661406714068140691407014071140721407314074140751407614077140781407914080140811408214083140841408514086140871408814089140901409114092140931409414095140961409714098140991410014101141021410314104141051410614107141081410914110141111411214113141141411514116141171411814119141201412114122141231412414125141261412714128141291413014131141321413314134141351413614137141381413914140141411414214143141441414514146141471414814149141501415114152141531415414155141561415714158141591416014161141621416314164141651416614167141681416914170141711417214173141741417514176141771417814179141801418114182141831418414185141861418714188141891419014191141921419314194141951419614197141981419914200142011420214203142041420514206142071420814209142101421114212142131421414215142161421714218142191422014221142221422314224142251422614227142281422914230142311423214233142341423514236142371423814239142401424114242142431424414245142461424714248142491425014251142521425314254142551425614257142581425914260142611426214263142641426514266142671426814269142701427114272142731427414275142761427714278142791428014281142821428314284142851428614287142881428914290142911429214293142941429514296142971429814299143001430114302143031430414305143061430714308143091431014311143121431314314143151431614317143181431914320143211432214323143241432514326143271432814329143301433114332143331433414335143361433714338143391434014341143421434314344143451434614347143481434914350143511435214353143541435514356143571435814359143601436114362143631436414365143661436714368143691437014371143721437314374143751437614377143781437914380143811438214383143841438514386143871438814389143901439114392143931439414395143961439714398143991440014401144021440314404144051440614407144081440914410144111441214413144141441514416144171441814419144201442114422144231442414425144261442714428144291443014431144321443314434144351443614437144381443914440144411444214443144441444514446144471444814449144501445114452144531445414455144561445714458144591446014461144621446314464144651446614467144681446914470144711447214473144741447514476144771447814479144801448114482144831448414485144861448714488144891449014491144921449314494144951449614497144981449914500145011450214503145041450514506145071450814509145101451114512145131451414515145161451714518145191452014521145221452314524145251452614527145281452914530145311453214533145341453514536145371453814539145401454114542145431454414545145461454714548145491455014551145521455314554145551455614557145581455914560145611456214563145641456514566145671456814569145701457114572145731457414575145761457714578145791458014581145821458314584145851458614587145881458914590145911459214593145941459514596145971459814599146001460114602146031460414605146061460714608146091461014611146121461314614146151461614617146181461914620146211462214623146241462514626146271462814629146301463114632146331463414635146361463714638146391464014641146421464314644146451464614647146481464914650146511465214653146541465514656146571465814659146601466114662146631466414665146661466714668146691467014671146721467314674146751467614677146781467914680146811468214683146841468514686146871468814689146901469114692146931469414695146961469714698146991470014701147021470314704147051470614707147081470914710147111471214713147141471514716147171471814719147201472114722147231472414725147261472714728147291473014731147321473314734147351473614737147381473914740147411474214743147441474514746147471474814749147501475114752147531475414755147561475714758147591476014761147621476314764147651476614767147681476914770147711477214773147741477514776147771477814779147801478114782147831478414785147861478714788147891479014791147921479314794147951479614797147981479914800148011480214803148041480514806148071480814809148101481114812148131481414815148161481714818148191482014821148221482314824148251482614827148281482914830148311483214833148341483514836148371483814839148401484114842148431484414845148461484714848148491485014851148521485314854148551485614857148581485914860148611486214863148641486514866148671486814869148701487114872148731487414875148761487714878148791488014881148821488314884148851488614887148881488914890148911489214893148941489514896148971489814899149001490114902149031490414905149061490714908149091491014911149121491314914149151491614917149181491914920149211492214923149241492514926149271492814929149301493114932149331493414935149361493714938149391494014941149421494314944149451494614947149481494914950149511495214953149541495514956149571495814959149601496114962149631496414965149661496714968149691497014971149721497314974149751497614977149781497914980149811498214983149841498514986149871498814989149901499114992149931499414995149961499714998149991500015001150021500315004150051500615007150081500915010150111501215013150141501515016150171501815019150201502115022150231502415025150261502715028150291503015031150321503315034150351503615037150381503915040150411504215043150441504515046150471504815049150501505115052150531505415055150561505715058150591506015061150621506315064150651506615067150681506915070150711507215073150741507515076150771507815079150801508115082150831508415085150861508715088150891509015091150921509315094150951509615097150981509915100151011510215103151041510515106151071510815109151101511115112151131511415115151161511715118151191512015121151221512315124151251512615127151281512915130151311513215133151341513515136151371513815139151401514115142151431514415145151461514715148151491515015151151521515315154151551515615157151581515915160151611516215163151641516515166151671516815169151701517115172151731517415175151761517715178151791518015181151821518315184151851518615187151881518915190151911519215193151941519515196151971519815199152001520115202152031520415205152061520715208152091521015211152121521315214152151521615217152181521915220152211522215223152241522515226152271522815229152301523115232152331523415235152361523715238152391524015241152421524315244152451524615247152481524915250152511525215253152541525515256152571525815259152601526115262152631526415265152661526715268152691527015271152721527315274152751527615277152781527915280152811528215283152841528515286152871528815289152901529115292152931529415295152961529715298152991530015301153021530315304153051530615307153081530915310153111531215313153141531515316153171531815319153201532115322153231532415325153261532715328153291533015331153321533315334153351533615337153381533915340153411534215343153441534515346153471534815349153501535115352153531535415355153561535715358153591536015361153621536315364153651536615367153681536915370153711537215373153741537515376153771537815379153801538115382153831538415385153861538715388153891539015391153921539315394153951539615397153981539915400154011540215403154041540515406154071540815409154101541115412154131541415415154161541715418154191542015421154221542315424154251542615427154281542915430154311543215433154341543515436154371543815439154401544115442154431544415445154461544715448154491545015451154521545315454154551545615457154581545915460154611546215463154641546515466154671546815469154701547115472154731547415475154761547715478154791548015481154821548315484154851548615487154881548915490154911549215493154941549515496154971549815499155001550115502155031550415505155061550715508155091551015511155121551315514155151551615517155181551915520155211552215523155241552515526155271552815529155301553115532155331553415535155361553715538155391554015541155421554315544155451554615547155481554915550155511555215553155541555515556155571555815559155601556115562155631556415565155661556715568155691557015571155721557315574155751557615577155781557915580155811558215583155841558515586155871558815589155901559115592155931559415595155961559715598155991560015601156021560315604156051560615607156081560915610156111561215613156141561515616156171561815619156201562115622156231562415625156261562715628156291563015631156321563315634156351563615637156381563915640156411564215643156441564515646156471564815649156501565115652156531565415655156561565715658156591566015661156621566315664156651566615667156681566915670156711567215673156741567515676156771567815679156801568115682156831568415685156861568715688156891569015691156921569315694156951569615697156981569915700157011570215703157041570515706157071570815709157101571115712157131571415715157161571715718157191572015721157221572315724157251572615727157281572915730157311573215733157341573515736157371573815739157401574115742157431574415745157461574715748157491575015751157521575315754157551575615757157581575915760157611576215763157641576515766157671576815769157701577115772157731577415775157761577715778157791578015781157821578315784157851578615787157881578915790157911579215793157941579515796157971579815799158001580115802158031580415805158061580715808158091581015811158121581315814158151581615817158181581915820158211582215823158241582515826158271582815829158301583115832158331583415835158361583715838158391584015841158421584315844158451584615847158481584915850158511585215853158541585515856158571585815859158601586115862158631586415865158661586715868158691587015871158721587315874158751587615877158781587915880158811588215883158841588515886158871588815889158901589115892158931589415895158961589715898158991590015901159021590315904159051590615907159081590915910159111591215913159141591515916159171591815919159201592115922159231592415925159261592715928159291593015931159321593315934159351593615937159381593915940159411594215943159441594515946159471594815949159501595115952159531595415955159561595715958159591596015961159621596315964159651596615967159681596915970159711597215973159741597515976159771597815979159801598115982159831598415985159861598715988159891599015991159921599315994159951599615997159981599916000160011600216003160041600516006160071600816009160101601116012160131601416015160161601716018160191602016021160221602316024160251602616027160281602916030160311603216033160341603516036160371603816039160401604116042160431604416045160461604716048160491605016051160521605316054160551605616057160581605916060160611606216063160641606516066160671606816069160701607116072160731607416075160761607716078160791608016081160821608316084160851608616087160881608916090160911609216093160941609516096160971609816099161001610116102161031610416105161061610716108161091611016111161121611316114161151611616117161181611916120161211612216123161241612516126161271612816129161301613116132161331613416135161361613716138161391614016141161421614316144161451614616147161481614916150161511615216153161541615516156161571615816159161601616116162161631616416165161661616716168161691617016171161721617316174161751617616177161781617916180161811618216183161841618516186161871618816189161901619116192161931619416195161961619716198161991620016201162021620316204162051620616207162081620916210162111621216213162141621516216162171621816219162201622116222162231622416225162261622716228162291623016231162321623316234162351623616237162381623916240162411624216243162441624516246162471624816249162501625116252162531625416255162561625716258162591626016261162621626316264162651626616267162681626916270162711627216273162741627516276162771627816279162801628116282162831628416285162861628716288162891629016291162921629316294162951629616297162981629916300163011630216303163041630516306163071630816309163101631116312163131631416315163161631716318163191632016321163221632316324163251632616327163281632916330163311633216333163341633516336163371633816339163401634116342163431634416345163461634716348163491635016351163521635316354163551635616357163581635916360163611636216363163641636516366163671636816369163701637116372163731637416375163761637716378163791638016381163821638316384163851638616387163881638916390163911639216393163941639516396163971639816399164001640116402164031640416405164061640716408164091641016411164121641316414164151641616417164181641916420164211642216423164241642516426164271642816429164301643116432164331643416435164361643716438164391644016441164421644316444164451644616447164481644916450164511645216453164541645516456164571645816459164601646116462164631646416465164661646716468164691647016471164721647316474164751647616477164781647916480164811648216483164841648516486164871648816489164901649116492164931649416495164961649716498164991650016501165021650316504165051650616507165081650916510165111651216513165141651516516165171651816519165201652116522165231652416525165261652716528165291653016531165321653316534165351653616537165381653916540165411654216543165441654516546165471654816549165501655116552165531655416555165561655716558165591656016561165621656316564165651656616567165681656916570165711657216573165741657516576165771657816579165801658116582165831658416585165861658716588165891659016591165921659316594165951659616597165981659916600166011660216603166041660516606166071660816609166101661116612166131661416615166161661716618166191662016621166221662316624166251662616627166281662916630166311663216633166341663516636166371663816639166401664116642166431664416645166461664716648166491665016651166521665316654166551665616657166581665916660166611666216663166641666516666166671666816669166701667116672166731667416675166761667716678166791668016681166821668316684166851668616687166881668916690166911669216693166941669516696166971669816699167001670116702167031670416705167061670716708167091671016711167121671316714167151671616717167181671916720167211672216723167241672516726167271672816729167301673116732167331673416735167361673716738167391674016741167421674316744167451674616747167481674916750167511675216753167541675516756167571675816759167601676116762167631676416765167661676716768167691677016771167721677316774167751677616777167781677916780167811678216783167841678516786167871678816789167901679116792167931679416795167961679716798167991680016801168021680316804168051680616807168081680916810168111681216813168141681516816168171681816819168201682116822168231682416825168261682716828168291683016831168321683316834168351683616837168381683916840168411684216843168441684516846168471684816849168501685116852168531685416855168561685716858168591686016861168621686316864168651686616867168681686916870168711687216873168741687516876168771687816879168801688116882168831688416885168861688716888168891689016891168921689316894168951689616897168981689916900169011690216903169041690516906169071690816909169101691116912169131691416915169161691716918169191692016921169221692316924169251692616927169281692916930169311693216933169341693516936169371693816939169401694116942169431694416945169461694716948169491695016951169521695316954169551695616957169581695916960169611696216963169641696516966169671696816969169701697116972169731697416975169761697716978169791698016981169821698316984169851698616987169881698916990169911699216993169941699516996169971699816999170001700117002170031700417005170061700717008170091701017011170121701317014170151701617017170181701917020170211702217023170241702517026170271702817029170301703117032170331703417035170361703717038170391704017041170421704317044170451704617047170481704917050170511705217053170541705517056170571705817059170601706117062170631706417065170661706717068170691707017071170721707317074170751707617077170781707917080170811708217083170841708517086170871708817089170901709117092170931709417095170961709717098170991710017101171021710317104171051710617107171081710917110171111711217113171141711517116171171711817119171201712117122171231712417125171261712717128171291713017131171321713317134171351713617137171381713917140171411714217143171441714517146171471714817149171501715117152171531715417155171561715717158171591716017161171621716317164171651716617167171681716917170171711717217173171741717517176171771717817179171801718117182171831718417185171861718717188171891719017191171921719317194171951719617197171981719917200172011720217203172041720517206172071720817209172101721117212172131721417215172161721717218172191722017221172221722317224172251722617227172281722917230172311723217233172341723517236172371723817239172401724117242172431724417245172461724717248172491725017251172521725317254172551725617257172581725917260172611726217263172641726517266172671726817269172701727117272172731727417275172761727717278172791728017281172821728317284172851728617287172881728917290172911729217293172941729517296172971729817299173001730117302173031730417305173061730717308173091731017311173121731317314173151731617317173181731917320173211732217323173241732517326173271732817329173301733117332173331733417335173361733717338173391734017341173421734317344173451734617347173481734917350173511735217353173541735517356173571735817359173601736117362173631736417365173661736717368173691737017371173721737317374173751737617377173781737917380173811738217383173841738517386173871738817389173901739117392173931739417395173961739717398173991740017401174021740317404174051740617407174081740917410174111741217413174141741517416174171741817419174201742117422174231742417425174261742717428174291743017431174321743317434174351743617437174381743917440174411744217443174441744517446174471744817449174501745117452174531745417455174561745717458174591746017461174621746317464174651746617467174681746917470174711747217473174741747517476174771747817479174801748117482174831748417485174861748717488174891749017491174921749317494174951749617497174981749917500175011750217503175041750517506175071750817509175101751117512175131751417515175161751717518175191752017521175221752317524175251752617527175281752917530175311753217533175341753517536175371753817539175401754117542175431754417545175461754717548175491755017551175521755317554175551755617557175581755917560175611756217563175641756517566175671756817569175701757117572175731757417575175761757717578175791758017581175821758317584175851758617587175881758917590175911759217593175941759517596175971759817599176001760117602176031760417605176061760717608176091761017611176121761317614176151761617617176181761917620176211762217623176241762517626176271762817629176301763117632176331763417635176361763717638176391764017641176421764317644176451764617647176481764917650176511765217653176541765517656176571765817659176601766117662176631766417665176661766717668176691767017671176721767317674176751767617677176781767917680176811768217683176841768517686176871768817689176901769117692176931769417695176961769717698176991770017701177021770317704177051770617707177081770917710177111771217713177141771517716177171771817719177201772117722177231772417725177261772717728177291773017731177321773317734177351773617737177381773917740177411774217743177441774517746177471774817749177501775117752177531775417755177561775717758177591776017761177621776317764177651776617767177681776917770177711777217773177741777517776177771777817779177801778117782177831778417785177861778717788177891779017791177921779317794177951779617797177981779917800178011780217803178041780517806178071780817809178101781117812178131781417815178161781717818178191782017821178221782317824178251782617827178281782917830178311783217833178341783517836178371783817839178401784117842178431784417845178461784717848178491785017851178521785317854178551785617857178581785917860178611786217863 |
- --- a/.gitignore
- +++ b/.gitignore
- @@ -5,9 +5,6 @@
- *.so.1
- arch/*/bits/alltypes.h
- config.mak
- -include/bits
- -tools/musl-gcc
- -tools/musl-clang
- -tools/ld.musl-clang
- lib/musl-gcc.specs
- src/internal/version.h
- +/obj/
- --- a/Makefile
- +++ b/Makefile
- @@ -8,6 +8,7 @@
- # Do not make changes here.
- #
-
- +srcdir = .
- exec_prefix = /usr/local
- bindir = $(exec_prefix)/bin
-
- @@ -16,31 +17,42 @@ includedir = $(prefix)/include
- libdir = $(prefix)/lib
- syslibdir = /lib
-
- -SRCS = $(sort $(wildcard src/*/*.c arch/$(ARCH)/src/*.c))
- -OBJS = $(SRCS:.c=.o)
- +BASE_SRCS = $(sort $(wildcard $(srcdir)/src/*/*.c))
- +BASE_OBJS = $(patsubst $(srcdir)/%,%.o,$(basename $(BASE_SRCS)))
- +ARCH_SRCS = $(wildcard $(srcdir)/src/*/$(ARCH)/*.[csS])
- +ARCH_OBJS = $(patsubst $(srcdir)/%,%.o,$(basename $(ARCH_SRCS)))
- +REPLACED_OBJS = $(sort $(subst /$(ARCH)/,/,$(ARCH_OBJS)))
- +LDSO_SRCS = $(sort $(wildcard $(srcdir)/ldso/*.c))
- +LDSO_OBJS = $(patsubst $(srcdir)/%,obj/%.lo,$(basename $(LDSO_SRCS)))
- +OBJS = $(addprefix obj/, $(filter-out $(REPLACED_OBJS), $(sort $(BASE_OBJS) $(ARCH_OBJS))))
- +AOBJS = $(OBJS)
- LOBJS = $(OBJS:.o=.lo)
- -GENH = include/bits/alltypes.h
- -GENH_INT = src/internal/version.h
- -IMPH = src/internal/stdio_impl.h src/internal/pthread_impl.h src/internal/libc.h
- +GENH = obj/include/bits/alltypes.h
- +GENH_INT = obj/src/internal/version.h
- +IMPH = $(addprefix $(srcdir)/, src/internal/stdio_impl.h src/internal/pthread_impl.h src/internal/libc.h)
-
- -LDFLAGS =
- +LDFLAGS =
- +LDFLAGS_AUTO =
- LIBCC = -lgcc
- CPPFLAGS =
- -CFLAGS = -Os -pipe
- +CFLAGS =
- +CFLAGS_AUTO = -Os -pipe
- CFLAGS_C99FSE = -std=c99 -ffreestanding -nostdinc
-
- CFLAGS_ALL = $(CFLAGS_C99FSE)
- -CFLAGS_ALL += -D_XOPEN_SOURCE=700 -I./arch/$(ARCH) -I./src/internal -I./include
- -CFLAGS_ALL += $(CPPFLAGS) $(CFLAGS)
- -CFLAGS_ALL_STATIC = $(CFLAGS_ALL)
- -CFLAGS_ALL_SHARED = $(CFLAGS_ALL) -fPIC -DSHARED
- +CFLAGS_ALL += -D_XOPEN_SOURCE=700 -I$(srcdir)/arch/$(ARCH) -I$(srcdir)/arch/generic -Iobj/src/internal -I$(srcdir)/src/internal -Iobj/include -I$(srcdir)/include
- +CFLAGS_ALL += $(CPPFLAGS) $(CFLAGS_AUTO) $(CFLAGS)
- +
- +LDFLAGS_ALL = $(LDFLAGS_AUTO) $(LDFLAGS)
-
- AR = $(CROSS_COMPILE)ar
- RANLIB = $(CROSS_COMPILE)ranlib
- -INSTALL = ./tools/install.sh
- +INSTALL = $(srcdir)/tools/install.sh
-
- -ARCH_INCLUDES = $(wildcard arch/$(ARCH)/bits/*.h)
- -ALL_INCLUDES = $(sort $(wildcard include/*.h include/*/*.h) $(GENH) $(ARCH_INCLUDES:arch/$(ARCH)/%=include/%))
- +ARCH_INCLUDES = $(wildcard $(srcdir)/arch/$(ARCH)/bits/*.h)
- +GENERIC_INCLUDES = $(wildcard $(srcdir)/arch/generic/bits/*.h)
- +INCLUDES = $(wildcard $(srcdir)/include/*.h $(srcdir)/include/*/*.h)
- +ALL_INCLUDES = $(sort $(INCLUDES:$(srcdir)/%=%) $(GENH:obj/%=%) $(ARCH_INCLUDES:$(srcdir)/arch/$(ARCH)/%=include/%) $(GENERIC_INCLUDES:$(srcdir)/arch/generic/%=include/%))
-
- EMPTY_LIB_NAMES = m rt pthread crypt util xnet resolv dl
- EMPTY_LIBS = $(EMPTY_LIB_NAMES:%=lib/lib%.a)
- @@ -49,7 +61,7 @@ STATIC_LIBS = lib/libc.a
- SHARED_LIBS = lib/libc.so
- TOOL_LIBS = lib/musl-gcc.specs
- ALL_LIBS = $(CRT_LIBS) $(STATIC_LIBS) $(SHARED_LIBS) $(EMPTY_LIBS) $(TOOL_LIBS)
- -ALL_TOOLS = tools/musl-gcc
- +ALL_TOOLS = obj/musl-gcc
-
- WRAPCC_GCC = gcc
- WRAPCC_CLANG = clang
- @@ -58,122 +70,128 @@ LDSO_PATHNAME = $(syslibdir)/ld-musl-$(A
-
- -include config.mak
-
- +ifeq ($(ARCH),)
- +$(error Please set ARCH in config.mak before running make.)
- +endif
- +
- all: $(ALL_LIBS) $(ALL_TOOLS)
-
- +OBJ_DIRS = $(sort $(patsubst %/,%,$(dir $(ALL_LIBS) $(ALL_TOOLS) $(OBJS) $(LDSO_OBJS) $(GENH) $(GENH_INT))) $(addprefix obj/, crt crt/$(ARCH) include))
- +
- +$(ALL_LIBS) $(ALL_TOOLS) $(CRT_LIBS:lib/%=obj/crt/%) $(OBJS) $(LOBJS) $(GENH) $(GENH_INT): | $(OBJ_DIRS)
- +
- +$(OBJ_DIRS):
- + mkdir -p $@
- +
- install: install-libs install-headers install-tools
-
- clean:
- - rm -f crt/*.o
- - rm -f $(OBJS)
- - rm -f $(LOBJS)
- - rm -f $(ALL_LIBS) lib/*.[ao] lib/*.so
- - rm -f $(ALL_TOOLS)
- - rm -f $(GENH) $(GENH_INT)
- - rm -f include/bits
- + rm -rf obj lib
-
- distclean: clean
- rm -f config.mak
-
- -include/bits:
- - @test "$(ARCH)" || { echo "Please set ARCH in config.mak before running make." ; exit 1 ; }
- - ln -sf ../arch/$(ARCH)/bits $@
- +obj/include/bits/alltypes.h: $(srcdir)/arch/$(ARCH)/bits/alltypes.h.in $(srcdir)/include/alltypes.h.in $(srcdir)/tools/mkalltypes.sed
- + sed -f $(srcdir)/tools/mkalltypes.sed $(srcdir)/arch/$(ARCH)/bits/alltypes.h.in $(srcdir)/include/alltypes.h.in > $@
-
- -include/bits/alltypes.h.in: include/bits
- +obj/src/internal/version.h: $(wildcard $(srcdir)/VERSION $(srcdir)/.git)
- + printf '#define VERSION "%s"\n' "$$(cd $(srcdir); sh tools/version.sh)" > $@
-
- -include/bits/alltypes.h: include/bits/alltypes.h.in include/alltypes.h.in tools/mkalltypes.sed
- - sed -f tools/mkalltypes.sed include/bits/alltypes.h.in include/alltypes.h.in > $@
- +obj/src/internal/version.o obj/src/internal/version.lo: obj/src/internal/version.h
-
- -src/internal/version.h: $(wildcard VERSION .git)
- - printf '#define VERSION "%s"\n' "$$(sh tools/version.sh)" > $@
- +obj/crt/rcrt1.o obj/ldso/dlstart.lo obj/ldso/dynlink.lo: $(srcdir)/src/internal/dynlink.h $(srcdir)/arch/$(ARCH)/reloc.h
-
- -src/internal/version.lo: src/internal/version.h
- +obj/crt/crt1.o obj/crt/scrt1.o obj/crt/rcrt1.o obj/ldso/dlstart.lo: $(srcdir)/arch/$(ARCH)/crt_arch.h
-
- -crt/rcrt1.o src/ldso/dlstart.lo src/ldso/dynlink.lo: src/internal/dynlink.h arch/$(ARCH)/reloc.h
- +obj/crt/rcrt1.o: $(srcdir)/ldso/dlstart.c
-
- -crt/crt1.o crt/Scrt1.o crt/rcrt1.o src/ldso/dlstart.lo: $(wildcard arch/$(ARCH)/crt_arch.h)
- +obj/crt/Scrt1.o obj/crt/rcrt1.o: CFLAGS_ALL += -fPIC
-
- -crt/rcrt1.o: src/ldso/dlstart.c
- +obj/crt/$(ARCH)/crti.o: $(srcdir)/crt/$(ARCH)/crti.s
-
- -crt/Scrt1.o crt/rcrt1.o: CFLAGS += -fPIC
- +obj/crt/$(ARCH)/crtn.o: $(srcdir)/crt/$(ARCH)/crtn.s
-
- -OPTIMIZE_SRCS = $(wildcard $(OPTIMIZE_GLOBS:%=src/%))
- -$(OPTIMIZE_SRCS:%.c=%.o) $(OPTIMIZE_SRCS:%.c=%.lo): CFLAGS += -O3
- +OPTIMIZE_SRCS = $(wildcard $(OPTIMIZE_GLOBS:%=$(srcdir)/src/%))
- +$(OPTIMIZE_SRCS:$(srcdir)/%.c=obj/%.o) $(OPTIMIZE_SRCS:$(srcdir)/%.c=obj/%.lo): CFLAGS += -O3
-
- MEMOPS_SRCS = src/string/memcpy.c src/string/memmove.c src/string/memcmp.c src/string/memset.c
- -$(MEMOPS_SRCS:%.c=%.o) $(MEMOPS_SRCS:%.c=%.lo): CFLAGS += $(CFLAGS_MEMOPS)
- +$(MEMOPS_SRCS:%.c=obj/%.o) $(MEMOPS_SRCS:%.c=obj/%.lo): CFLAGS_ALL += $(CFLAGS_MEMOPS)
-
- NOSSP_SRCS = $(wildcard crt/*.c) \
- src/env/__libc_start_main.c src/env/__init_tls.c \
- - src/thread/__set_thread_area.c src/env/__stack_chk_fail.c \
- - src/string/memset.c src/string/memcpy.c \
- - src/ldso/dlstart.c src/ldso/dynlink.c
- -$(NOSSP_SRCS:%.c=%.o) $(NOSSP_SRCS:%.c=%.lo): CFLAGS += $(CFLAGS_NOSSP)
- + src/env/__stack_chk_fail.c \
- + src/thread/__set_thread_area.c src/thread/$(ARCH)/__set_thread_area.c \
- + src/string/memset.c src/string/$(ARCH)/memset.c \
- + src/string/memcpy.c src/string/$(ARCH)/memcpy.c \
- + ldso/dlstart.c ldso/dynlink.c
- +$(NOSSP_SRCS:%.c=obj/%.o) $(NOSSP_SRCS:%.c=obj/%.lo): CFLAGS_ALL += $(CFLAGS_NOSSP)
-
- -$(CRT_LIBS:lib/%=crt/%): CFLAGS += -DCRT
- +$(CRT_LIBS:lib/%=obj/crt/%): CFLAGS_ALL += -DCRT
-
- -# This incantation ensures that changes to any subarch asm files will
- -# force the corresponding object file to be rebuilt, even if the implicit
- -# rule below goes indirectly through a .sub file.
- -define mkasmdep
- -$(dir $(patsubst %/,%,$(dir $(1))))$(notdir $(1:.s=.o)): $(1)
- -endef
- -$(foreach s,$(wildcard src/*/$(ARCH)*/*.s),$(eval $(call mkasmdep,$(s))))
- +$(LOBJS) $(LDSO_OBJS): CFLAGS_ALL += -fPIC
- +
- +CC_CMD = $(CC) $(CFLAGS_ALL) -c -o $@ $<
-
- # Choose invocation of assembler to be used
- -# $(1) is input file, $(2) is output file, $(3) is assembler flags
- ifeq ($(ADD_CFI),yes)
- - AS_CMD = LC_ALL=C awk -f tools/add-cfi.common.awk -f tools/add-cfi.$(ARCH).awk $< | $(CC) -x assembler -c -o $@ -
- + AS_CMD = LC_ALL=C awk -f $(srcdir)/tools/add-cfi.common.awk -f $(srcdir)/tools/add-cfi.$(ARCH).awk $< | $(CC) $(CFLAGS_ALL) -x assembler -c -o $@ -
- else
- - AS_CMD = $(CC) -c -o $@ $<
- + AS_CMD = $(CC_CMD)
- endif
-
- -%.o: $(ARCH)$(ASMSUBARCH)/%.sub
- - $(CC) $(CFLAGS_ALL_STATIC) -c -o $@ $(dir $<)$(shell cat $<)
- +obj/%.o: $(srcdir)/%.s
- + $(AS_CMD)
-
- -%.o: $(ARCH)/%.s
- - $(AS_CMD) $(CFLAGS_ALL_STATIC)
- +obj/%.o: $(srcdir)/%.S
- + $(CC_CMD)
-
- -%.o: %.c $(GENH) $(IMPH)
- - $(CC) $(CFLAGS_ALL_STATIC) -c -o $@ $<
- +obj/%.o: $(srcdir)/%.c $(GENH) $(IMPH)
- + $(CC_CMD)
-
- -%.lo: $(ARCH)$(ASMSUBARCH)/%.sub
- - $(CC) $(CFLAGS_ALL_SHARED) -c -o $@ $(dir $<)$(shell cat $<)
- +obj/%.lo: $(srcdir)/%.s
- + $(AS_CMD)
-
- -%.lo: $(ARCH)/%.s
- - $(AS_CMD) $(CFLAGS_ALL_SHARED)
- +obj/%.lo: $(srcdir)/%.S
- + $(CC_CMD)
-
- -%.lo: %.c $(GENH) $(IMPH)
- - $(CC) $(CFLAGS_ALL_SHARED) -c -o $@ $<
- +obj/%.lo: $(srcdir)/%.c $(GENH) $(IMPH)
- + $(CC_CMD)
-
- -lib/libc.so: $(LOBJS)
- - $(CC) $(CFLAGS_ALL_SHARED) $(LDFLAGS) -nostdlib -shared \
- +lib/libc.so: $(LOBJS) $(LDSO_OBJS)
- + $(CC) $(CFLAGS_ALL) $(LDFLAGS_ALL) -nostdlib -shared \
- -Wl,-e,_dlstart -Wl,-Bsymbolic-functions \
- - -o $@ $(LOBJS) $(LIBCC)
- + -o $@ $(LOBJS) $(LDSO_OBJS) $(LIBCC)
-
- -lib/libc.a: $(OBJS)
- +lib/libc.a: $(AOBJS)
- rm -f $@
- - $(AR) rc $@ $(OBJS)
- + $(AR) rc $@ $(AOBJS)
- $(RANLIB) $@
-
- $(EMPTY_LIBS):
- rm -f $@
- $(AR) rc $@
-
- -lib/%.o: crt/%.o
- +lib/%.o: obj/crt/%.o
- cp $< $@
-
- -lib/musl-gcc.specs: tools/musl-gcc.specs.sh config.mak
- +lib/crti.o: obj/crt/$(ARCH)/crti.o
- + cp $< $@
- +
- +lib/crtn.o: obj/crt/$(ARCH)/crtn.o
- + cp $< $@
- +
- +lib/musl-gcc.specs: $(srcdir)/tools/musl-gcc.specs.sh config.mak
- sh $< "$(includedir)" "$(libdir)" "$(LDSO_PATHNAME)" > $@
-
- -tools/musl-gcc: config.mak
- +obj/musl-gcc: config.mak
- printf '#!/bin/sh\nexec "$${REALGCC:-$(WRAPCC_GCC)}" "$$@" -specs "%s/musl-gcc.specs"\n' "$(libdir)" > $@
- chmod +x $@
-
- -tools/%-clang: tools/%-clang.in config.mak
- +obj/%-clang: $(srcdir)/tools/%-clang.in config.mak
- sed -e 's!@CC@!$(WRAPCC_CLANG)!g' -e 's!@PREFIX@!$(prefix)!g' -e 's!@INCDIR@!$(includedir)!g' -e 's!@LIBDIR@!$(libdir)!g' -e 's!@LDSO@!$(LDSO_PATHNAME)!g' $< > $@
- chmod +x $@
-
- -$(DESTDIR)$(bindir)/%: tools/%
- +$(DESTDIR)$(bindir)/%: obj/%
- $(INSTALL) -D $< $@
-
- $(DESTDIR)$(libdir)/%.so: lib/%.so
- @@ -182,10 +200,16 @@ $(DESTDIR)$(libdir)/%.so: lib/%.so
- $(DESTDIR)$(libdir)/%: lib/%
- $(INSTALL) -D -m 644 $< $@
-
- -$(DESTDIR)$(includedir)/bits/%: arch/$(ARCH)/bits/%
- +$(DESTDIR)$(includedir)/bits/%: $(srcdir)/arch/$(ARCH)/bits/%
- $(INSTALL) -D -m 644 $< $@
-
- -$(DESTDIR)$(includedir)/%: include/%
- +$(DESTDIR)$(includedir)/bits/%: $(srcdir)/arch/generic/bits/%
- + $(INSTALL) -D -m 644 $< $@
- +
- +$(DESTDIR)$(includedir)/bits/%: obj/include/bits/%
- + $(INSTALL) -D -m 644 $< $@
- +
- +$(DESTDIR)$(includedir)/%: $(srcdir)/include/%
- $(INSTALL) -D -m 644 $< $@
-
- $(DESTDIR)$(LDSO_PATHNAME): $(DESTDIR)$(libdir)/libc.so
- @@ -195,12 +219,12 @@ install-libs: $(ALL_LIBS:lib/%=$(DESTDIR
-
- install-headers: $(ALL_INCLUDES:include/%=$(DESTDIR)$(includedir)/%)
-
- -install-tools: $(ALL_TOOLS:tools/%=$(DESTDIR)$(bindir)/%)
- +install-tools: $(ALL_TOOLS:obj/%=$(DESTDIR)$(bindir)/%)
-
- musl-git-%.tar.gz: .git
- - git archive --format=tar.gz --prefix=$(patsubst %.tar.gz,%,$@)/ -o $@ $(patsubst musl-git-%.tar.gz,%,$@)
- + git --git-dir=$(srcdir)/.git archive --format=tar.gz --prefix=$(patsubst %.tar.gz,%,$@)/ -o $@ $(patsubst musl-git-%.tar.gz,%,$@)
-
- musl-%.tar.gz: .git
- - git archive --format=tar.gz --prefix=$(patsubst %.tar.gz,%,$@)/ -o $@ v$(patsubst musl-%.tar.gz,%,$@)
- + git --git-dir=$(srcdir)/.git archive --format=tar.gz --prefix=$(patsubst %.tar.gz,%,$@)/ -o $@ v$(patsubst musl-%.tar.gz,%,$@)
-
- .PHONY: all clean install install-libs install-headers install-tools
- --- a/arch/aarch64/atomic.h
- +++ /dev/null
- @@ -1,206 +0,0 @@
- -#ifndef _INTERNAL_ATOMIC_H
- -#define _INTERNAL_ATOMIC_H
- -
- -#include <stdint.h>
- -
- -static inline int a_ctz_64(uint64_t x)
- -{
- - __asm__(
- - " rbit %0, %1\n"
- - " clz %0, %0\n"
- - : "=r"(x) : "r"(x));
- - return x;
- -}
- -
- -static inline int a_ctz_l(unsigned long x)
- -{
- - return a_ctz_64(x);
- -}
- -
- -static inline void a_barrier()
- -{
- - __asm__ __volatile__("dmb ish");
- -}
- -
- -static inline void *a_cas_p(volatile void *p, void *t, void *s)
- -{
- - void *old;
- - __asm__ __volatile__(
- - " dmb ish\n"
- - "1: ldxr %0,%3\n"
- - " cmp %0,%1\n"
- - " b.ne 1f\n"
- - " stxr %w0,%2,%3\n"
- - " cbnz %w0,1b\n"
- - " mov %0,%1\n"
- - "1: dmb ish\n"
- - : "=&r"(old)
- - : "r"(t), "r"(s), "Q"(*(long*)p)
- - : "memory", "cc");
- - return old;
- -}
- -
- -static inline int a_cas(volatile int *p, int t, int s)
- -{
- - int old;
- - __asm__ __volatile__(
- - " dmb ish\n"
- - "1: ldxr %w0,%3\n"
- - " cmp %w0,%w1\n"
- - " b.ne 1f\n"
- - " stxr %w0,%w2,%3\n"
- - " cbnz %w0,1b\n"
- - " mov %w0,%w1\n"
- - "1: dmb ish\n"
- - : "=&r"(old)
- - : "r"(t), "r"(s), "Q"(*p)
- - : "memory", "cc");
- - return old;
- -}
- -
- -static inline int a_swap(volatile int *x, int v)
- -{
- - int old, tmp;
- - __asm__ __volatile__(
- - " dmb ish\n"
- - "1: ldxr %w0,%3\n"
- - " stxr %w1,%w2,%3\n"
- - " cbnz %w1,1b\n"
- - " dmb ish\n"
- - : "=&r"(old), "=&r"(tmp)
- - : "r"(v), "Q"(*x)
- - : "memory", "cc" );
- - return old;
- -}
- -
- -static inline int a_fetch_add(volatile int *x, int v)
- -{
- - int old, tmp;
- - __asm__ __volatile__(
- - " dmb ish\n"
- - "1: ldxr %w0,%3\n"
- - " add %w0,%w0,%w2\n"
- - " stxr %w1,%w0,%3\n"
- - " cbnz %w1,1b\n"
- - " dmb ish\n"
- - : "=&r"(old), "=&r"(tmp)
- - : "r"(v), "Q"(*x)
- - : "memory", "cc" );
- - return old-v;
- -}
- -
- -static inline void a_inc(volatile int *x)
- -{
- - int tmp, tmp2;
- - __asm__ __volatile__(
- - " dmb ish\n"
- - "1: ldxr %w0,%2\n"
- - " add %w0,%w0,#1\n"
- - " stxr %w1,%w0,%2\n"
- - " cbnz %w1,1b\n"
- - " dmb ish\n"
- - : "=&r"(tmp), "=&r"(tmp2)
- - : "Q"(*x)
- - : "memory", "cc" );
- -}
- -
- -static inline void a_dec(volatile int *x)
- -{
- - int tmp, tmp2;
- - __asm__ __volatile__(
- - " dmb ish\n"
- - "1: ldxr %w0,%2\n"
- - " sub %w0,%w0,#1\n"
- - " stxr %w1,%w0,%2\n"
- - " cbnz %w1,1b\n"
- - " dmb ish\n"
- - : "=&r"(tmp), "=&r"(tmp2)
- - : "Q"(*x)
- - : "memory", "cc" );
- -}
- -
- -static inline void a_and_64(volatile uint64_t *p, uint64_t v)
- -{
- - int tmp, tmp2;
- - __asm__ __volatile__(
- - " dmb ish\n"
- - "1: ldxr %0,%3\n"
- - " and %0,%0,%2\n"
- - " stxr %w1,%0,%3\n"
- - " cbnz %w1,1b\n"
- - " dmb ish\n"
- - : "=&r"(tmp), "=&r"(tmp2)
- - : "r"(v), "Q"(*p)
- - : "memory", "cc" );
- -}
- -
- -static inline void a_and(volatile int *p, int v)
- -{
- - int tmp, tmp2;
- - __asm__ __volatile__(
- - " dmb ish\n"
- - "1: ldxr %w0,%3\n"
- - " and %w0,%w0,%w2\n"
- - " stxr %w1,%w0,%3\n"
- - " cbnz %w1,1b\n"
- - " dmb ish\n"
- - : "=&r"(tmp), "=&r"(tmp2)
- - : "r"(v), "Q"(*p)
- - : "memory", "cc" );
- -}
- -
- -static inline void a_or_64(volatile uint64_t *p, uint64_t v)
- -{
- - int tmp, tmp2;
- - __asm__ __volatile__(
- - " dmb ish\n"
- - "1: ldxr %0,%3\n"
- - " orr %0,%0,%2\n"
- - " stxr %w1,%0,%3\n"
- - " cbnz %w1,1b\n"
- - " dmb ish\n"
- - : "=&r"(tmp), "=&r"(tmp2)
- - : "r"(v), "Q"(*p)
- - : "memory", "cc" );
- -}
- -
- -static inline void a_or_l(volatile void *p, long v)
- -{
- - return a_or_64(p, v);
- -}
- -
- -static inline void a_or(volatile int *p, int v)
- -{
- - int tmp, tmp2;
- - __asm__ __volatile__(
- - " dmb ish\n"
- - "1: ldxr %w0,%3\n"
- - " orr %w0,%w0,%w2\n"
- - " stxr %w1,%w0,%3\n"
- - " cbnz %w1,1b\n"
- - " dmb ish\n"
- - : "=&r"(tmp), "=&r"(tmp2)
- - : "r"(v), "Q"(*p)
- - : "memory", "cc" );
- -}
- -
- -static inline void a_store(volatile int *p, int x)
- -{
- - __asm__ __volatile__(
- - " dmb ish\n"
- - " str %w1,%0\n"
- - " dmb ish\n"
- - : "=m"(*p)
- - : "r"(x)
- - : "memory", "cc" );
- -}
- -
- -#define a_spin a_barrier
- -
- -static inline void a_crash()
- -{
- - *(volatile char *)0=0;
- -}
- -
- -
- -#endif
- --- /dev/null
- +++ b/arch/aarch64/atomic_arch.h
- @@ -0,0 +1,73 @@
- +#define a_ll a_ll
- +static inline int a_ll(volatile int *p)
- +{
- + int v;
- + __asm__ __volatile__ ("ldaxr %w0,%1" : "=r"(v) : "Q"(*p));
- + return v;
- +}
- +
- +#define a_sc a_sc
- +static inline int a_sc(volatile int *p, int v)
- +{
- + int r;
- + __asm__ __volatile__ ("stlxr %w0,%w1,%2" : "=&r"(r) : "r"(v), "Q"(*p) : "memory");
- + return !r;
- +}
- +
- +#define a_barrier a_barrier
- +static inline void a_barrier()
- +{
- + __asm__ __volatile__ ("dmb ish" : : : "memory");
- +}
- +
- +#define a_cas a_cas
- +static inline int a_cas(volatile int *p, int t, int s)
- +{
- + int old;
- + do {
- + old = a_ll(p);
- + if (old != t) {
- + a_barrier();
- + break;
- + }
- + } while (!a_sc(p, s));
- + return old;
- +}
- +
- +static inline void *a_ll_p(volatile void *p)
- +{
- + void *v;
- + __asm__ __volatile__ ("ldaxr %0, %1" : "=r"(v) : "Q"(*(void *volatile *)p));
- + return v;
- +}
- +
- +static inline int a_sc_p(volatile int *p, void *v)
- +{
- + int r;
- + __asm__ __volatile__ ("stlxr %w0,%1,%2" : "=&r"(r) : "r"(v), "Q"(*(void *volatile *)p) : "memory");
- + return !r;
- +}
- +
- +#define a_cas_p a_cas_p
- +static inline void *a_cas_p(volatile void *p, void *t, void *s)
- +{
- + void *old;
- + do {
- + old = a_ll_p(p);
- + if (old != t) {
- + a_barrier();
- + break;
- + }
- + } while (!a_sc_p(p, s));
- + return old;
- +}
- +
- +#define a_ctz_64 a_ctz_64
- +static inline int a_ctz_64(uint64_t x)
- +{
- + __asm__(
- + " rbit %0, %1\n"
- + " clz %0, %0\n"
- + : "=r"(x) : "r"(x));
- + return x;
- +}
- --- a/arch/aarch64/bits/errno.h
- +++ /dev/null
- @@ -1,134 +0,0 @@
- -#define EPERM 1
- -#define ENOENT 2
- -#define ESRCH 3
- -#define EINTR 4
- -#define EIO 5
- -#define ENXIO 6
- -#define E2BIG 7
- -#define ENOEXEC 8
- -#define EBADF 9
- -#define ECHILD 10
- -#define EAGAIN 11
- -#define ENOMEM 12
- -#define EACCES 13
- -#define EFAULT 14
- -#define ENOTBLK 15
- -#define EBUSY 16
- -#define EEXIST 17
- -#define EXDEV 18
- -#define ENODEV 19
- -#define ENOTDIR 20
- -#define EISDIR 21
- -#define EINVAL 22
- -#define ENFILE 23
- -#define EMFILE 24
- -#define ENOTTY 25
- -#define ETXTBSY 26
- -#define EFBIG 27
- -#define ENOSPC 28
- -#define ESPIPE 29
- -#define EROFS 30
- -#define EMLINK 31
- -#define EPIPE 32
- -#define EDOM 33
- -#define ERANGE 34
- -#define EDEADLK 35
- -#define ENAMETOOLONG 36
- -#define ENOLCK 37
- -#define ENOSYS 38
- -#define ENOTEMPTY 39
- -#define ELOOP 40
- -#define EWOULDBLOCK EAGAIN
- -#define ENOMSG 42
- -#define EIDRM 43
- -#define ECHRNG 44
- -#define EL2NSYNC 45
- -#define EL3HLT 46
- -#define EL3RST 47
- -#define ELNRNG 48
- -#define EUNATCH 49
- -#define ENOCSI 50
- -#define EL2HLT 51
- -#define EBADE 52
- -#define EBADR 53
- -#define EXFULL 54
- -#define ENOANO 55
- -#define EBADRQC 56
- -#define EBADSLT 57
- -#define EDEADLOCK EDEADLK
- -#define EBFONT 59
- -#define ENOSTR 60
- -#define ENODATA 61
- -#define ETIME 62
- -#define ENOSR 63
- -#define ENONET 64
- -#define ENOPKG 65
- -#define EREMOTE 66
- -#define ENOLINK 67
- -#define EADV 68
- -#define ESRMNT 69
- -#define ECOMM 70
- -#define EPROTO 71
- -#define EMULTIHOP 72
- -#define EDOTDOT 73
- -#define EBADMSG 74
- -#define EOVERFLOW 75
- -#define ENOTUNIQ 76
- -#define EBADFD 77
- -#define EREMCHG 78
- -#define ELIBACC 79
- -#define ELIBBAD 80
- -#define ELIBSCN 81
- -#define ELIBMAX 82
- -#define ELIBEXEC 83
- -#define EILSEQ 84
- -#define ERESTART 85
- -#define ESTRPIPE 86
- -#define EUSERS 87
- -#define ENOTSOCK 88
- -#define EDESTADDRREQ 89
- -#define EMSGSIZE 90
- -#define EPROTOTYPE 91
- -#define ENOPROTOOPT 92
- -#define EPROTONOSUPPORT 93
- -#define ESOCKTNOSUPPORT 94
- -#define EOPNOTSUPP 95
- -#define ENOTSUP EOPNOTSUPP
- -#define EPFNOSUPPORT 96
- -#define EAFNOSUPPORT 97
- -#define EADDRINUSE 98
- -#define EADDRNOTAVAIL 99
- -#define ENETDOWN 100
- -#define ENETUNREACH 101
- -#define ENETRESET 102
- -#define ECONNABORTED 103
- -#define ECONNRESET 104
- -#define ENOBUFS 105
- -#define EISCONN 106
- -#define ENOTCONN 107
- -#define ESHUTDOWN 108
- -#define ETOOMANYREFS 109
- -#define ETIMEDOUT 110
- -#define ECONNREFUSED 111
- -#define EHOSTDOWN 112
- -#define EHOSTUNREACH 113
- -#define EALREADY 114
- -#define EINPROGRESS 115
- -#define ESTALE 116
- -#define EUCLEAN 117
- -#define ENOTNAM 118
- -#define ENAVAIL 119
- -#define EISNAM 120
- -#define EREMOTEIO 121
- -#define EDQUOT 122
- -#define ENOMEDIUM 123
- -#define EMEDIUMTYPE 124
- -#define ECANCELED 125
- -#define ENOKEY 126
- -#define EKEYEXPIRED 127
- -#define EKEYREVOKED 128
- -#define EKEYREJECTED 129
- -#define EOWNERDEAD 130
- -#define ENOTRECOVERABLE 131
- -#define ERFKILL 132
- -#define EHWPOISON 133
- --- a/arch/aarch64/bits/mman.h
- +++ b/arch/aarch64/bits/mman.h
- @@ -36,6 +36,7 @@
-
- #define MCL_CURRENT 1
- #define MCL_FUTURE 2
- +#define MCL_ONFAULT 4
-
- #if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
- #define MADV_NORMAL 0
- --- a/arch/aarch64/bits/statfs.h
- +++ /dev/null
- @@ -1,7 +0,0 @@
- -struct statfs {
- - unsigned long f_type, f_bsize;
- - fsblkcnt_t f_blocks, f_bfree, f_bavail;
- - fsfilcnt_t f_files, f_ffree;
- - fsid_t f_fsid;
- - unsigned long f_namelen, f_frsize, f_flags, f_spare[4];
- -};
- --- a/arch/aarch64/bits/stdarg.h
- +++ /dev/null
- @@ -1,4 +0,0 @@
- -#define va_start(v,l) __builtin_va_start(v,l)
- -#define va_end(v) __builtin_va_end(v)
- -#define va_arg(v,l) __builtin_va_arg(v,l)
- -#define va_copy(d,s) __builtin_va_copy(d,s)
- --- a/arch/aarch64/bits/syscall.h
- +++ b/arch/aarch64/bits/syscall.h
- @@ -265,6 +265,9 @@
- #define __NR_memfd_create 279
- #define __NR_bpf 280
- #define __NR_execveat 281
- +#define __NR_userfaultfd 282
- +#define __NR_membarrier 283
- +#define __NR_mlock2 284
-
- #define SYS_io_setup __NR_io_setup
- #define SYS_io_destroy __NR_io_destroy
- @@ -533,3 +536,6 @@
- #define SYS_memfd_create __NR_memfd_create
- #define SYS_bpf __NR_bpf
- #define SYS_execveat __NR_execveat
- +#define SYS_userfaultfd __NR_userfaultfd
- +#define SYS_membarrier __NR_membarrier
- +#define SYS_mlock2 __NR_mlock2
- --- a/arch/aarch64/bits/termios.h
- +++ /dev/null
- @@ -1,160 +0,0 @@
- -struct termios
- -{
- - tcflag_t c_iflag;
- - tcflag_t c_oflag;
- - tcflag_t c_cflag;
- - tcflag_t c_lflag;
- - cc_t c_line;
- - cc_t c_cc[NCCS];
- - speed_t __c_ispeed;
- - speed_t __c_ospeed;
- -};
- -
- -#define VINTR 0
- -#define VQUIT 1
- -#define VERASE 2
- -#define VKILL 3
- -#define VEOF 4
- -#define VTIME 5
- -#define VMIN 6
- -#define VSWTC 7
- -#define VSTART 8
- -#define VSTOP 9
- -#define VSUSP 10
- -#define VEOL 11
- -#define VREPRINT 12
- -#define VDISCARD 13
- -#define VWERASE 14
- -#define VLNEXT 15
- -#define VEOL2 16
- -
- -#define IGNBRK 0000001
- -#define BRKINT 0000002
- -#define IGNPAR 0000004
- -#define PARMRK 0000010
- -#define INPCK 0000020
- -#define ISTRIP 0000040
- -#define INLCR 0000100
- -#define IGNCR 0000200
- -#define ICRNL 0000400
- -#define IUCLC 0001000
- -#define IXON 0002000
- -#define IXANY 0004000
- -#define IXOFF 0010000
- -#define IMAXBEL 0020000
- -#define IUTF8 0040000
- -
- -#define OPOST 0000001
- -#define OLCUC 0000002
- -#define ONLCR 0000004
- -#define OCRNL 0000010
- -#define ONOCR 0000020
- -#define ONLRET 0000040
- -#define OFILL 0000100
- -#define OFDEL 0000200
- -#define NLDLY 0000400
- -#define NL0 0000000
- -#define NL1 0000400
- -#define CRDLY 0003000
- -#define CR0 0000000
- -#define CR1 0001000
- -#define CR2 0002000
- -#define CR3 0003000
- -#define TABDLY 0014000
- -#define TAB0 0000000
- -#define TAB1 0004000
- -#define TAB2 0010000
- -#define TAB3 0014000
- -#define BSDLY 0020000
- -#define BS0 0000000
- -#define BS1 0020000
- -#define FFDLY 0100000
- -#define FF0 0000000
- -#define FF1 0100000
- -
- -#define VTDLY 0040000
- -#define VT0 0000000
- -#define VT1 0040000
- -
- -#define B0 0000000
- -#define B50 0000001
- -#define B75 0000002
- -#define B110 0000003
- -#define B134 0000004
- -#define B150 0000005
- -#define B200 0000006
- -#define B300 0000007
- -#define B600 0000010
- -#define B1200 0000011
- -#define B1800 0000012
- -#define B2400 0000013
- -#define B4800 0000014
- -#define B9600 0000015
- -#define B19200 0000016
- -#define B38400 0000017
- -
- -#define B57600 0010001
- -#define B115200 0010002
- -#define B230400 0010003
- -#define B460800 0010004
- -#define B500000 0010005
- -#define B576000 0010006
- -#define B921600 0010007
- -#define B1000000 0010010
- -#define B1152000 0010011
- -#define B1500000 0010012
- -#define B2000000 0010013
- -#define B2500000 0010014
- -#define B3000000 0010015
- -#define B3500000 0010016
- -#define B4000000 0010017
- -
- -#define CBAUD 0010017
- -
- -#define CSIZE 0000060
- -#define CS5 0000000
- -#define CS6 0000020
- -#define CS7 0000040
- -#define CS8 0000060
- -#define CSTOPB 0000100
- -#define CREAD 0000200
- -#define PARENB 0000400
- -#define PARODD 0001000
- -#define HUPCL 0002000
- -#define CLOCAL 0004000
- -
- -#define ISIG 0000001
- -#define ICANON 0000002
- -#define ECHO 0000010
- -#define ECHOE 0000020
- -#define ECHOK 0000040
- -#define ECHONL 0000100
- -#define NOFLSH 0000200
- -#define TOSTOP 0000400
- -#define IEXTEN 0100000
- -
- -#define ECHOCTL 0001000
- -#define ECHOPRT 0002000
- -#define ECHOKE 0004000
- -#define FLUSHO 0010000
- -#define PENDIN 0040000
- -
- -#define TCOOFF 0
- -#define TCOON 1
- -#define TCIOFF 2
- -#define TCION 3
- -
- -#define TCIFLUSH 0
- -#define TCOFLUSH 1
- -#define TCIOFLUSH 2
- -
- -#define TCSANOW 0
- -#define TCSADRAIN 1
- -#define TCSAFLUSH 2
- -
- -#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
- -#define CBAUDEX 0010000
- -#define CRTSCTS 020000000000
- -#define EXTPROC 0200000
- -#define XTABS 0014000
- -#endif
- --- a/arch/aarch64/pthread_arch.h
- +++ b/arch/aarch64/pthread_arch.h
- @@ -8,4 +8,4 @@ static inline struct pthread *__pthread_
- #define TLS_ABOVE_TP
- #define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread) - 16)
-
- -#define CANCEL_REG_IP 33
- +#define MC_PC pc
- --- a/arch/arm/atomic.h
- +++ /dev/null
- @@ -1,261 +0,0 @@
- -#ifndef _INTERNAL_ATOMIC_H
- -#define _INTERNAL_ATOMIC_H
- -
- -#include <stdint.h>
- -
- -static inline int a_ctz_l(unsigned long x)
- -{
- - static const char debruijn32[32] = {
- - 0, 1, 23, 2, 29, 24, 19, 3, 30, 27, 25, 11, 20, 8, 4, 13,
- - 31, 22, 28, 18, 26, 10, 7, 12, 21, 17, 9, 6, 16, 5, 15, 14
- - };
- - return debruijn32[(x&-x)*0x076be629 >> 27];
- -}
- -
- -static inline int a_ctz_64(uint64_t x)
- -{
- - uint32_t y = x;
- - if (!y) {
- - y = x>>32;
- - return 32 + a_ctz_l(y);
- - }
- - return a_ctz_l(y);
- -}
- -
- -#if __ARM_ARCH_7A__ || __ARM_ARCH_7R__ || __ARM_ARCH >= 7
- -
- -static inline void a_barrier()
- -{
- - __asm__ __volatile__("dmb ish");
- -}
- -
- -static inline int a_cas(volatile int *p, int t, int s)
- -{
- - int old;
- - __asm__ __volatile__(
- - " dmb ish\n"
- - "1: ldrex %0,%3\n"
- - " cmp %0,%1\n"
- - " bne 1f\n"
- - " strex %0,%2,%3\n"
- - " cmp %0, #0\n"
- - " bne 1b\n"
- - " mov %0, %1\n"
- - "1: dmb ish\n"
- - : "=&r"(old)
- - : "r"(t), "r"(s), "Q"(*p)
- - : "memory", "cc" );
- - return old;
- -}
- -
- -static inline int a_swap(volatile int *x, int v)
- -{
- - int old, tmp;
- - __asm__ __volatile__(
- - " dmb ish\n"
- - "1: ldrex %0,%3\n"
- - " strex %1,%2,%3\n"
- - " cmp %1, #0\n"
- - " bne 1b\n"
- - " dmb ish\n"
- - : "=&r"(old), "=&r"(tmp)
- - : "r"(v), "Q"(*x)
- - : "memory", "cc" );
- - return old;
- -}
- -
- -static inline int a_fetch_add(volatile int *x, int v)
- -{
- - int old, tmp;
- - __asm__ __volatile__(
- - " dmb ish\n"
- - "1: ldrex %0,%3\n"
- - " add %0,%0,%2\n"
- - " strex %1,%0,%3\n"
- - " cmp %1, #0\n"
- - " bne 1b\n"
- - " dmb ish\n"
- - : "=&r"(old), "=&r"(tmp)
- - : "r"(v), "Q"(*x)
- - : "memory", "cc" );
- - return old-v;
- -}
- -
- -static inline void a_inc(volatile int *x)
- -{
- - int tmp, tmp2;
- - __asm__ __volatile__(
- - " dmb ish\n"
- - "1: ldrex %0,%2\n"
- - " add %0,%0,#1\n"
- - " strex %1,%0,%2\n"
- - " cmp %1, #0\n"
- - " bne 1b\n"
- - " dmb ish\n"
- - : "=&r"(tmp), "=&r"(tmp2)
- - : "Q"(*x)
- - : "memory", "cc" );
- -}
- -
- -static inline void a_dec(volatile int *x)
- -{
- - int tmp, tmp2;
- - __asm__ __volatile__(
- - " dmb ish\n"
- - "1: ldrex %0,%2\n"
- - " sub %0,%0,#1\n"
- - " strex %1,%0,%2\n"
- - " cmp %1, #0\n"
- - " bne 1b\n"
- - " dmb ish\n"
- - : "=&r"(tmp), "=&r"(tmp2)
- - : "Q"(*x)
- - : "memory", "cc" );
- -}
- -
- -static inline void a_and(volatile int *x, int v)
- -{
- - int tmp, tmp2;
- - __asm__ __volatile__(
- - " dmb ish\n"
- - "1: ldrex %0,%3\n"
- - " and %0,%0,%2\n"
- - " strex %1,%0,%3\n"
- - " cmp %1, #0\n"
- - " bne 1b\n"
- - " dmb ish\n"
- - : "=&r"(tmp), "=&r"(tmp2)
- - : "r"(v), "Q"(*x)
- - : "memory", "cc" );
- -}
- -
- -static inline void a_or(volatile int *x, int v)
- -{
- - int tmp, tmp2;
- - __asm__ __volatile__(
- - " dmb ish\n"
- - "1: ldrex %0,%3\n"
- - " orr %0,%0,%2\n"
- - " strex %1,%0,%3\n"
- - " cmp %1, #0\n"
- - " bne 1b\n"
- - " dmb ish\n"
- - : "=&r"(tmp), "=&r"(tmp2)
- - : "r"(v), "Q"(*x)
- - : "memory", "cc" );
- -}
- -
- -static inline void a_store(volatile int *p, int x)
- -{
- - __asm__ __volatile__(
- - " dmb ish\n"
- - " str %1,%0\n"
- - " dmb ish\n"
- - : "=m"(*p)
- - : "r"(x)
- - : "memory", "cc" );
- -}
- -
- -#else
- -
- -int __a_cas(int, int, volatile int *) __attribute__((__visibility__("hidden")));
- -#define __k_cas __a_cas
- -
- -static inline void a_barrier()
- -{
- - __asm__ __volatile__("bl __a_barrier"
- - : : : "memory", "cc", "ip", "lr" );
- -}
- -
- -static inline int a_cas(volatile int *p, int t, int s)
- -{
- - int old;
- - for (;;) {
- - if (!__k_cas(t, s, p))
- - return t;
- - if ((old=*p) != t)
- - return old;
- - }
- -}
- -
- -static inline int a_swap(volatile int *x, int v)
- -{
- - int old;
- - do old = *x;
- - while (__k_cas(old, v, x));
- - return old;
- -}
- -
- -static inline int a_fetch_add(volatile int *x, int v)
- -{
- - int old;
- - do old = *x;
- - while (__k_cas(old, old+v, x));
- - return old;
- -}
- -
- -static inline void a_inc(volatile int *x)
- -{
- - a_fetch_add(x, 1);
- -}
- -
- -static inline void a_dec(volatile int *x)
- -{
- - a_fetch_add(x, -1);
- -}
- -
- -static inline void a_store(volatile int *p, int x)
- -{
- - a_barrier();
- - *p = x;
- - a_barrier();
- -}
- -
- -static inline void a_and(volatile int *p, int v)
- -{
- - int old;
- - do old = *p;
- - while (__k_cas(old, old&v, p));
- -}
- -
- -static inline void a_or(volatile int *p, int v)
- -{
- - int old;
- - do old = *p;
- - while (__k_cas(old, old|v, p));
- -}
- -
- -#endif
- -
- -static inline void *a_cas_p(volatile void *p, void *t, void *s)
- -{
- - return (void *)a_cas(p, (int)t, (int)s);
- -}
- -
- -#define a_spin a_barrier
- -
- -static inline void a_crash()
- -{
- - *(volatile char *)0=0;
- -}
- -
- -static inline void a_or_l(volatile void *p, long v)
- -{
- - a_or(p, v);
- -}
- -
- -static inline void a_and_64(volatile uint64_t *p, uint64_t v)
- -{
- - union { uint64_t v; uint32_t r[2]; } u = { v };
- - a_and((int *)p, u.r[0]);
- - a_and((int *)p+1, u.r[1]);
- -}
- -
- -static inline void a_or_64(volatile uint64_t *p, uint64_t v)
- -{
- - union { uint64_t v; uint32_t r[2]; } u = { v };
- - a_or((int *)p, u.r[0]);
- - a_or((int *)p+1, u.r[1]);
- -}
- -
- -#endif
- --- /dev/null
- +++ b/arch/arm/atomic_arch.h
- @@ -0,0 +1,76 @@
- +__attribute__((__visibility__("hidden")))
- +extern const void *__arm_atomics[3]; /* gettp, cas, barrier */
- +
- +#if ((__ARM_ARCH_6__ || __ARM_ARCH_6K__ || __ARM_ARCH_6ZK__) && !__thumb__) \
- + || __ARM_ARCH_7A__ || __ARM_ARCH_7R__ || __ARM_ARCH >= 7
- +
- +#define a_ll a_ll
- +static inline int a_ll(volatile int *p)
- +{
- + int v;
- + __asm__ __volatile__ ("ldrex %0, %1" : "=r"(v) : "Q"(*p));
- + return v;
- +}
- +
- +#define a_sc a_sc
- +static inline int a_sc(volatile int *p, int v)
- +{
- + int r;
- + __asm__ __volatile__ ("strex %0,%1,%2" : "=&r"(r) : "r"(v), "Q"(*p) : "memory");
- + return !r;
- +}
- +
- +#if __ARM_ARCH_7A__ || __ARM_ARCH_7R__ || __ARM_ARCH >= 7
- +
- +#define a_barrier a_barrier
- +static inline void a_barrier()
- +{
- + __asm__ __volatile__ ("dmb ish" : : : "memory");
- +}
- +
- +#endif
- +
- +#define a_pre_llsc a_barrier
- +#define a_post_llsc a_barrier
- +
- +#else
- +
- +#define a_cas a_cas
- +static inline int a_cas(volatile int *p, int t, int s)
- +{
- + for (;;) {
- + register int r0 __asm__("r0") = t;
- + register int r1 __asm__("r1") = s;
- + register volatile int *r2 __asm__("r2") = p;
- + int old;
- + __asm__ __volatile__ (
- + "bl __a_cas"
- + : "+r"(r0) : "r"(r1), "r"(r2)
- + : "memory", "r3", "lr", "ip", "cc" );
- + if (!r0) return t;
- + if ((old=*p)!=t) return old;
- + }
- +}
- +
- +#endif
- +
- +#ifndef a_barrier
- +#define a_barrier a_barrier
- +static inline void a_barrier()
- +{
- + __asm__ __volatile__("bl __a_barrier"
- + : : : "memory", "cc", "ip", "lr" );
- +}
- +#endif
- +
- +#define a_crash a_crash
- +static inline void a_crash()
- +{
- + __asm__ __volatile__(
- +#ifndef __thumb__
- + ".word 0xe7f000f0"
- +#else
- + ".short 0xdeff"
- +#endif
- + : : : "memory");
- +}
- --- a/arch/arm/bits/errno.h
- +++ /dev/null
- @@ -1,134 +0,0 @@
- -#define EPERM 1
- -#define ENOENT 2
- -#define ESRCH 3
- -#define EINTR 4
- -#define EIO 5
- -#define ENXIO 6
- -#define E2BIG 7
- -#define ENOEXEC 8
- -#define EBADF 9
- -#define ECHILD 10
- -#define EAGAIN 11
- -#define ENOMEM 12
- -#define EACCES 13
- -#define EFAULT 14
- -#define ENOTBLK 15
- -#define EBUSY 16
- -#define EEXIST 17
- -#define EXDEV 18
- -#define ENODEV 19
- -#define ENOTDIR 20
- -#define EISDIR 21
- -#define EINVAL 22
- -#define ENFILE 23
- -#define EMFILE 24
- -#define ENOTTY 25
- -#define ETXTBSY 26
- -#define EFBIG 27
- -#define ENOSPC 28
- -#define ESPIPE 29
- -#define EROFS 30
- -#define EMLINK 31
- -#define EPIPE 32
- -#define EDOM 33
- -#define ERANGE 34
- -#define EDEADLK 35
- -#define ENAMETOOLONG 36
- -#define ENOLCK 37
- -#define ENOSYS 38
- -#define ENOTEMPTY 39
- -#define ELOOP 40
- -#define EWOULDBLOCK EAGAIN
- -#define ENOMSG 42
- -#define EIDRM 43
- -#define ECHRNG 44
- -#define EL2NSYNC 45
- -#define EL3HLT 46
- -#define EL3RST 47
- -#define ELNRNG 48
- -#define EUNATCH 49
- -#define ENOCSI 50
- -#define EL2HLT 51
- -#define EBADE 52
- -#define EBADR 53
- -#define EXFULL 54
- -#define ENOANO 55
- -#define EBADRQC 56
- -#define EBADSLT 57
- -#define EDEADLOCK EDEADLK
- -#define EBFONT 59
- -#define ENOSTR 60
- -#define ENODATA 61
- -#define ETIME 62
- -#define ENOSR 63
- -#define ENONET 64
- -#define ENOPKG 65
- -#define EREMOTE 66
- -#define ENOLINK 67
- -#define EADV 68
- -#define ESRMNT 69
- -#define ECOMM 70
- -#define EPROTO 71
- -#define EMULTIHOP 72
- -#define EDOTDOT 73
- -#define EBADMSG 74
- -#define EOVERFLOW 75
- -#define ENOTUNIQ 76
- -#define EBADFD 77
- -#define EREMCHG 78
- -#define ELIBACC 79
- -#define ELIBBAD 80
- -#define ELIBSCN 81
- -#define ELIBMAX 82
- -#define ELIBEXEC 83
- -#define EILSEQ 84
- -#define ERESTART 85
- -#define ESTRPIPE 86
- -#define EUSERS 87
- -#define ENOTSOCK 88
- -#define EDESTADDRREQ 89
- -#define EMSGSIZE 90
- -#define EPROTOTYPE 91
- -#define ENOPROTOOPT 92
- -#define EPROTONOSUPPORT 93
- -#define ESOCKTNOSUPPORT 94
- -#define EOPNOTSUPP 95
- -#define ENOTSUP EOPNOTSUPP
- -#define EPFNOSUPPORT 96
- -#define EAFNOSUPPORT 97
- -#define EADDRINUSE 98
- -#define EADDRNOTAVAIL 99
- -#define ENETDOWN 100
- -#define ENETUNREACH 101
- -#define ENETRESET 102
- -#define ECONNABORTED 103
- -#define ECONNRESET 104
- -#define ENOBUFS 105
- -#define EISCONN 106
- -#define ENOTCONN 107
- -#define ESHUTDOWN 108
- -#define ETOOMANYREFS 109
- -#define ETIMEDOUT 110
- -#define ECONNREFUSED 111
- -#define EHOSTDOWN 112
- -#define EHOSTUNREACH 113
- -#define EALREADY 114
- -#define EINPROGRESS 115
- -#define ESTALE 116
- -#define EUCLEAN 117
- -#define ENOTNAM 118
- -#define ENAVAIL 119
- -#define EISNAM 120
- -#define EREMOTEIO 121
- -#define EDQUOT 122
- -#define ENOMEDIUM 123
- -#define EMEDIUMTYPE 124
- -#define ECANCELED 125
- -#define ENOKEY 126
- -#define EKEYEXPIRED 127
- -#define EKEYREVOKED 128
- -#define EKEYREJECTED 129
- -#define EOWNERDEAD 130
- -#define ENOTRECOVERABLE 131
- -#define ERFKILL 132
- -#define EHWPOISON 133
- --- a/arch/arm/bits/ioctl.h
- +++ /dev/null
- @@ -1,197 +0,0 @@
- -#define _IOC(a,b,c,d) ( ((a)<<30) | ((b)<<8) | (c) | ((d)<<16) )
- -#define _IOC_NONE 0U
- -#define _IOC_WRITE 1U
- -#define _IOC_READ 2U
- -
- -#define _IO(a,b) _IOC(_IOC_NONE,(a),(b),0)
- -#define _IOW(a,b,c) _IOC(_IOC_WRITE,(a),(b),sizeof(c))
- -#define _IOR(a,b,c) _IOC(_IOC_READ,(a),(b),sizeof(c))
- -#define _IOWR(a,b,c) _IOC(_IOC_READ|_IOC_WRITE,(a),(b),sizeof(c))
- -
- -#define TCGETS 0x5401
- -#define TCSETS 0x5402
- -#define TCSETSW 0x5403
- -#define TCSETSF 0x5404
- -#define TCGETA 0x5405
- -#define TCSETA 0x5406
- -#define TCSETAW 0x5407
- -#define TCSETAF 0x5408
- -#define TCSBRK 0x5409
- -#define TCXONC 0x540A
- -#define TCFLSH 0x540B
- -#define TIOCEXCL 0x540C
- -#define TIOCNXCL 0x540D
- -#define TIOCSCTTY 0x540E
- -#define TIOCGPGRP 0x540F
- -#define TIOCSPGRP 0x5410
- -#define TIOCOUTQ 0x5411
- -#define TIOCSTI 0x5412
- -#define TIOCGWINSZ 0x5413
- -#define TIOCSWINSZ 0x5414
- -#define TIOCMGET 0x5415
- -#define TIOCMBIS 0x5416
- -#define TIOCMBIC 0x5417
- -#define TIOCMSET 0x5418
- -#define TIOCGSOFTCAR 0x5419
- -#define TIOCSSOFTCAR 0x541A
- -#define FIONREAD 0x541B
- -#define TIOCINQ FIONREAD
- -#define TIOCLINUX 0x541C
- -#define TIOCCONS 0x541D
- -#define TIOCGSERIAL 0x541E
- -#define TIOCSSERIAL 0x541F
- -#define TIOCPKT 0x5420
- -#define FIONBIO 0x5421
- -#define TIOCNOTTY 0x5422
- -#define TIOCSETD 0x5423
- -#define TIOCGETD 0x5424
- -#define TCSBRKP 0x5425
- -#define TIOCTTYGSTRUCT 0x5426
- -#define TIOCSBRK 0x5427
- -#define TIOCCBRK 0x5428
- -#define TIOCGSID 0x5429
- -#define TIOCGPTN 0x80045430
- -#define TIOCSPTLCK 0x40045431
- -#define TCGETX 0x5432
- -#define TCSETX 0x5433
- -#define TCSETXF 0x5434
- -#define TCSETXW 0x5435
- -
- -#define FIONCLEX 0x5450
- -#define FIOCLEX 0x5451
- -#define FIOASYNC 0x5452
- -#define TIOCSERCONFIG 0x5453
- -#define TIOCSERGWILD 0x5454
- -#define TIOCSERSWILD 0x5455
- -#define TIOCGLCKTRMIOS 0x5456
- -#define TIOCSLCKTRMIOS 0x5457
- -#define TIOCSERGSTRUCT 0x5458
- -#define TIOCSERGETLSR 0x5459
- -#define TIOCSERGETMULTI 0x545A
- -#define TIOCSERSETMULTI 0x545B
- -
- -#define TIOCMIWAIT 0x545C
- -#define TIOCGICOUNT 0x545D
- -#define TIOCGHAYESESP 0x545E
- -#define TIOCSHAYESESP 0x545F
- -#define FIOQSIZE 0x5460
- -
- -#define TIOCPKT_DATA 0
- -#define TIOCPKT_FLUSHREAD 1
- -#define TIOCPKT_FLUSHWRITE 2
- -#define TIOCPKT_STOP 4
- -#define TIOCPKT_START 8
- -#define TIOCPKT_NOSTOP 16
- -#define TIOCPKT_DOSTOP 32
- -#define TIOCPKT_IOCTL 64
- -
- -#define TIOCSER_TEMT 0x01
- -
- -struct winsize {
- - unsigned short ws_row;
- - unsigned short ws_col;
- - unsigned short ws_xpixel;
- - unsigned short ws_ypixel;
- -};
- -
- -#define TIOCM_LE 0x001
- -#define TIOCM_DTR 0x002
- -#define TIOCM_RTS 0x004
- -#define TIOCM_ST 0x008
- -#define TIOCM_SR 0x010
- -#define TIOCM_CTS 0x020
- -#define TIOCM_CAR 0x040
- -#define TIOCM_RNG 0x080
- -#define TIOCM_DSR 0x100
- -#define TIOCM_CD TIOCM_CAR
- -#define TIOCM_RI TIOCM_RNG
- -#define TIOCM_OUT1 0x2000
- -#define TIOCM_OUT2 0x4000
- -#define TIOCM_LOOP 0x8000
- -#define TIOCM_MODEM_BITS TIOCM_OUT2
- -
- -#define N_TTY 0
- -#define N_SLIP 1
- -#define N_MOUSE 2
- -#define N_PPP 3
- -#define N_STRIP 4
- -#define N_AX25 5
- -#define N_X25 6
- -#define N_6PACK 7
- -#define N_MASC 8
- -#define N_R3964 9
- -#define N_PROFIBUS_FDL 10
- -#define N_IRDA 11
- -#define N_SMSBLOCK 12
- -#define N_HDLC 13
- -#define N_SYNC_PPP 14
- -#define N_HCI 15
- -
- -#define FIOSETOWN 0x8901
- -#define SIOCSPGRP 0x8902
- -#define FIOGETOWN 0x8903
- -#define SIOCGPGRP 0x8904
- -#define SIOCATMARK 0x8905
- -#define SIOCGSTAMP 0x8906
- -
- -#define SIOCADDRT 0x890B
- -#define SIOCDELRT 0x890C
- -#define SIOCRTMSG 0x890D
- -
- -#define SIOCGIFNAME 0x8910
- -#define SIOCSIFLINK 0x8911
- -#define SIOCGIFCONF 0x8912
- -#define SIOCGIFFLAGS 0x8913
- -#define SIOCSIFFLAGS 0x8914
- -#define SIOCGIFADDR 0x8915
- -#define SIOCSIFADDR 0x8916
- -#define SIOCGIFDSTADDR 0x8917
- -#define SIOCSIFDSTADDR 0x8918
- -#define SIOCGIFBRDADDR 0x8919
- -#define SIOCSIFBRDADDR 0x891a
- -#define SIOCGIFNETMASK 0x891b
- -#define SIOCSIFNETMASK 0x891c
- -#define SIOCGIFMETRIC 0x891d
- -#define SIOCSIFMETRIC 0x891e
- -#define SIOCGIFMEM 0x891f
- -#define SIOCSIFMEM 0x8920
- -#define SIOCGIFMTU 0x8921
- -#define SIOCSIFMTU 0x8922
- -#define SIOCSIFHWADDR 0x8924
- -#define SIOCGIFENCAP 0x8925
- -#define SIOCSIFENCAP 0x8926
- -#define SIOCGIFHWADDR 0x8927
- -#define SIOCGIFSLAVE 0x8929
- -#define SIOCSIFSLAVE 0x8930
- -#define SIOCADDMULTI 0x8931
- -#define SIOCDELMULTI 0x8932
- -#define SIOCGIFINDEX 0x8933
- -#define SIOGIFINDEX SIOCGIFINDEX
- -#define SIOCSIFPFLAGS 0x8934
- -#define SIOCGIFPFLAGS 0x8935
- -#define SIOCDIFADDR 0x8936
- -#define SIOCSIFHWBROADCAST 0x8937
- -#define SIOCGIFCOUNT 0x8938
- -
- -#define SIOCGIFBR 0x8940
- -#define SIOCSIFBR 0x8941
- -
- -#define SIOCGIFTXQLEN 0x8942
- -#define SIOCSIFTXQLEN 0x8943
- -
- -#define SIOCDARP 0x8953
- -#define SIOCGARP 0x8954
- -#define SIOCSARP 0x8955
- -
- -#define SIOCDRARP 0x8960
- -#define SIOCGRARP 0x8961
- -#define SIOCSRARP 0x8962
- -
- -#define SIOCGIFMAP 0x8970
- -#define SIOCSIFMAP 0x8971
- -
- -#define SIOCADDDLCI 0x8980
- -#define SIOCDELDLCI 0x8981
- -
- -#define SIOCDEVPRIVATE 0x89F0
- -#define SIOCPROTOPRIVATE 0x89E0
- --- a/arch/arm/bits/ipc.h
- +++ /dev/null
- @@ -1,14 +0,0 @@
- -struct ipc_perm
- -{
- - key_t __ipc_perm_key;
- - uid_t uid;
- - gid_t gid;
- - uid_t cuid;
- - gid_t cgid;
- - mode_t mode;
- - int __ipc_perm_seq;
- - long __pad1;
- - long __pad2;
- -};
- -
- -#define IPC_64 0x100
- --- a/arch/arm/bits/mman.h
- +++ b/arch/arm/bits/mman.h
- @@ -37,6 +37,7 @@
-
- #define MCL_CURRENT 1
- #define MCL_FUTURE 2
- +#define MCL_ONFAULT 4
-
- #if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
- #define MADV_NORMAL 0
- --- a/arch/arm/bits/msg.h
- +++ /dev/null
- @@ -1,16 +0,0 @@
- -struct msqid_ds
- -{
- - struct ipc_perm msg_perm;
- - time_t msg_stime;
- - int __unused1;
- - time_t msg_rtime;
- - int __unused2;
- - time_t msg_ctime;
- - int __unused3;
- - unsigned long msg_cbytes;
- - msgqnum_t msg_qnum;
- - msglen_t msg_qbytes;
- - pid_t msg_lspid;
- - pid_t msg_lrpid;
- - unsigned long __unused[2];
- -};
- --- a/arch/arm/bits/sem.h
- +++ /dev/null
- @@ -1,16 +0,0 @@
- -struct semid_ds {
- - struct ipc_perm sem_perm;
- - time_t sem_otime;
- - time_t __unused1;
- - time_t sem_ctime;
- - time_t __unused2;
- -#if __BYTE_ORDER == __LITTLE_ENDIAN
- - unsigned short sem_nsems;
- - char __sem_nsems_pad[sizeof(time_t)-sizeof(short)];
- -#else
- - char __sem_nsems_pad[sizeof(time_t)-sizeof(short)];
- - unsigned short sem_nsems;
- -#endif
- - time_t __unused3;
- - time_t __unused4;
- -};
- --- a/arch/arm/bits/shm.h
- +++ /dev/null
- @@ -1,29 +0,0 @@
- -#define SHMLBA 4096
- -
- -struct shmid_ds
- -{
- - struct ipc_perm shm_perm;
- - size_t shm_segsz;
- - time_t shm_atime;
- - int __unused1;
- - time_t shm_dtime;
- - int __unused2;
- - time_t shm_ctime;
- - int __unused3;
- - pid_t shm_cpid;
- - pid_t shm_lpid;
- - unsigned long shm_nattch;
- - unsigned long __pad1;
- - unsigned long __pad2;
- -};
- -
- -struct shminfo {
- - unsigned long shmmax, shmmin, shmmni, shmseg, shmall, __unused[4];
- -};
- -
- -struct shm_info {
- - int __used_ids;
- - unsigned long shm_tot, shm_rss, shm_swp;
- - unsigned long __swap_attempts, __swap_successes;
- -};
- -
- --- a/arch/arm/bits/socket.h
- +++ /dev/null
- @@ -1,17 +0,0 @@
- -struct msghdr
- -{
- - void *msg_name;
- - socklen_t msg_namelen;
- - struct iovec *msg_iov;
- - int msg_iovlen;
- - void *msg_control;
- - socklen_t msg_controllen;
- - int msg_flags;
- -};
- -
- -struct cmsghdr
- -{
- - socklen_t cmsg_len;
- - int cmsg_level;
- - int cmsg_type;
- -};
- --- a/arch/arm/bits/statfs.h
- +++ /dev/null
- @@ -1,7 +0,0 @@
- -struct statfs {
- - unsigned long f_type, f_bsize;
- - fsblkcnt_t f_blocks, f_bfree, f_bavail;
- - fsfilcnt_t f_files, f_ffree;
- - fsid_t f_fsid;
- - unsigned long f_namelen, f_frsize, f_flags, f_spare[4];
- -};
- --- a/arch/arm/bits/stdarg.h
- +++ /dev/null
- @@ -1,4 +0,0 @@
- -#define va_start(v,l) __builtin_va_start(v,l)
- -#define va_end(v) __builtin_va_end(v)
- -#define va_arg(v,l) __builtin_va_arg(v,l)
- -#define va_copy(d,s) __builtin_va_copy(d,s)
- --- a/arch/arm/bits/syscall.h
- +++ b/arch/arm/bits/syscall.h
- @@ -341,6 +341,9 @@
- #define __NR_memfd_create 385
- #define __NR_bpf 386
- #define __NR_execveat 387
- +#define __NR_userfaultfd 388
- +#define __NR_membarrier 389
- +#define __NR_mlock2 390
-
- #define __ARM_NR_breakpoint 0x0f0001
- #define __ARM_NR_cacheflush 0x0f0002
- @@ -693,3 +696,6 @@
- #define SYS_memfd_create 385
- #define SYS_bpf 386
- #define SYS_execveat 387
- +#define SYS_userfaultfd 388
- +#define SYS_membarrier 389
- +#define SYS_mlock2 390
- --- a/arch/arm/bits/termios.h
- +++ /dev/null
- @@ -1,160 +0,0 @@
- -struct termios
- -{
- - tcflag_t c_iflag;
- - tcflag_t c_oflag;
- - tcflag_t c_cflag;
- - tcflag_t c_lflag;
- - cc_t c_line;
- - cc_t c_cc[NCCS];
- - speed_t __c_ispeed;
- - speed_t __c_ospeed;
- -};
- -
- -#define VINTR 0
- -#define VQUIT 1
- -#define VERASE 2
- -#define VKILL 3
- -#define VEOF 4
- -#define VTIME 5
- -#define VMIN 6
- -#define VSWTC 7
- -#define VSTART 8
- -#define VSTOP 9
- -#define VSUSP 10
- -#define VEOL 11
- -#define VREPRINT 12
- -#define VDISCARD 13
- -#define VWERASE 14
- -#define VLNEXT 15
- -#define VEOL2 16
- -
- -#define IGNBRK 0000001
- -#define BRKINT 0000002
- -#define IGNPAR 0000004
- -#define PARMRK 0000010
- -#define INPCK 0000020
- -#define ISTRIP 0000040
- -#define INLCR 0000100
- -#define IGNCR 0000200
- -#define ICRNL 0000400
- -#define IUCLC 0001000
- -#define IXON 0002000
- -#define IXANY 0004000
- -#define IXOFF 0010000
- -#define IMAXBEL 0020000
- -#define IUTF8 0040000
- -
- -#define OPOST 0000001
- -#define OLCUC 0000002
- -#define ONLCR 0000004
- -#define OCRNL 0000010
- -#define ONOCR 0000020
- -#define ONLRET 0000040
- -#define OFILL 0000100
- -#define OFDEL 0000200
- -#define NLDLY 0000400
- -#define NL0 0000000
- -#define NL1 0000400
- -#define CRDLY 0003000
- -#define CR0 0000000
- -#define CR1 0001000
- -#define CR2 0002000
- -#define CR3 0003000
- -#define TABDLY 0014000
- -#define TAB0 0000000
- -#define TAB1 0004000
- -#define TAB2 0010000
- -#define TAB3 0014000
- -#define BSDLY 0020000
- -#define BS0 0000000
- -#define BS1 0020000
- -#define FFDLY 0100000
- -#define FF0 0000000
- -#define FF1 0100000
- -
- -#define VTDLY 0040000
- -#define VT0 0000000
- -#define VT1 0040000
- -
- -#define B0 0000000
- -#define B50 0000001
- -#define B75 0000002
- -#define B110 0000003
- -#define B134 0000004
- -#define B150 0000005
- -#define B200 0000006
- -#define B300 0000007
- -#define B600 0000010
- -#define B1200 0000011
- -#define B1800 0000012
- -#define B2400 0000013
- -#define B4800 0000014
- -#define B9600 0000015
- -#define B19200 0000016
- -#define B38400 0000017
- -
- -#define B57600 0010001
- -#define B115200 0010002
- -#define B230400 0010003
- -#define B460800 0010004
- -#define B500000 0010005
- -#define B576000 0010006
- -#define B921600 0010007
- -#define B1000000 0010010
- -#define B1152000 0010011
- -#define B1500000 0010012
- -#define B2000000 0010013
- -#define B2500000 0010014
- -#define B3000000 0010015
- -#define B3500000 0010016
- -#define B4000000 0010017
- -
- -#define CBAUD 0010017
- -
- -#define CSIZE 0000060
- -#define CS5 0000000
- -#define CS6 0000020
- -#define CS7 0000040
- -#define CS8 0000060
- -#define CSTOPB 0000100
- -#define CREAD 0000200
- -#define PARENB 0000400
- -#define PARODD 0001000
- -#define HUPCL 0002000
- -#define CLOCAL 0004000
- -
- -#define ISIG 0000001
- -#define ICANON 0000002
- -#define ECHO 0000010
- -#define ECHOE 0000020
- -#define ECHOK 0000040
- -#define ECHONL 0000100
- -#define NOFLSH 0000200
- -#define TOSTOP 0000400
- -#define IEXTEN 0100000
- -
- -#define ECHOCTL 0001000
- -#define ECHOPRT 0002000
- -#define ECHOKE 0004000
- -#define FLUSHO 0010000
- -#define PENDIN 0040000
- -
- -#define TCOOFF 0
- -#define TCOON 1
- -#define TCIOFF 2
- -#define TCION 3
- -
- -#define TCIFLUSH 0
- -#define TCOFLUSH 1
- -#define TCIOFLUSH 2
- -
- -#define TCSANOW 0
- -#define TCSADRAIN 1
- -#define TCSAFLUSH 2
- -
- -#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
- -#define CBAUDEX 0010000
- -#define CRTSCTS 020000000000
- -#define EXTPROC 0200000
- -#define XTABS 0014000
- -#endif
- --- a/arch/arm/pthread_arch.h
- +++ b/arch/arm/pthread_arch.h
- @@ -27,4 +27,4 @@ static inline pthread_t __pthread_self()
- #define TLS_ABOVE_TP
- #define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread) - 8)
-
- -#define CANCEL_REG_IP 18
- +#define MC_PC arm_pc
- --- a/arch/arm/reloc.h
- +++ b/arch/arm/reloc.h
- @@ -6,10 +6,10 @@
- #define ENDIAN_SUFFIX ""
- #endif
-
- -#if __SOFTFP__
- -#define FP_SUFFIX ""
- -#else
- +#if __ARM_PCS_VFP
- #define FP_SUFFIX "hf"
- +#else
- +#define FP_SUFFIX ""
- #endif
-
- #define LDSO_ARCH "arm" ENDIAN_SUFFIX FP_SUFFIX
- @@ -28,10 +28,5 @@
- #define REL_TPOFF R_ARM_TLS_TPOFF32
- //#define REL_TLSDESC R_ARM_TLS_DESC
-
- -#ifdef __thumb__
- #define CRTJMP(pc,sp) __asm__ __volatile__( \
- "mov sp,%1 ; bx %0" : : "r"(pc), "r"(sp) : "memory" )
- -#else
- -#define CRTJMP(pc,sp) __asm__ __volatile__( \
- - "mov sp,%1 ; tst %0,#1 ; moveq pc,%0 ; bx %0" : : "r"(pc), "r"(sp) : "memory" )
- -#endif
- --- a/arch/arm/src/__aeabi_atexit.c
- +++ /dev/null
- @@ -1,6 +0,0 @@
- -int __cxa_atexit(void (*func)(void *), void *arg, void *dso);
- -
- -int __aeabi_atexit (void *obj, void (*func) (void *), void *d)
- -{
- - return __cxa_atexit (func, obj, d);
- -}
- --- a/arch/arm/src/__aeabi_memclr.c
- +++ /dev/null
- @@ -1,9 +0,0 @@
- -#include <string.h>
- -#include "libc.h"
- -
- -void __aeabi_memclr(void *dest, size_t n)
- -{
- - memset(dest, 0, n);
- -}
- -weak_alias(__aeabi_memclr, __aeabi_memclr4);
- -weak_alias(__aeabi_memclr, __aeabi_memclr8);
- --- a/arch/arm/src/__aeabi_memcpy.c
- +++ /dev/null
- @@ -1,9 +0,0 @@
- -#include <string.h>
- -#include "libc.h"
- -
- -void __aeabi_memcpy(void *restrict dest, const void *restrict src, size_t n)
- -{
- - memcpy(dest, src, n);
- -}
- -weak_alias(__aeabi_memcpy, __aeabi_memcpy4);
- -weak_alias(__aeabi_memcpy, __aeabi_memcpy8);
- --- a/arch/arm/src/__aeabi_memmove.c
- +++ /dev/null
- @@ -1,9 +0,0 @@
- -#include <string.h>
- -#include "libc.h"
- -
- -void __aeabi_memmove(void *dest, const void *src, size_t n)
- -{
- - memmove(dest, src, n);
- -}
- -weak_alias(__aeabi_memmove, __aeabi_memmove4);
- -weak_alias(__aeabi_memmove, __aeabi_memmove8);
- --- a/arch/arm/src/__aeabi_memset.c
- +++ /dev/null
- @@ -1,9 +0,0 @@
- -#include <string.h>
- -#include "libc.h"
- -
- -void __aeabi_memset(void *dest, size_t n, int c)
- -{
- - memset(dest, c, n);
- -}
- -weak_alias(__aeabi_memset, __aeabi_memset4);
- -weak_alias(__aeabi_memset, __aeabi_memset8);
- --- a/arch/arm/src/__set_thread_area.c
- +++ /dev/null
- @@ -1,49 +0,0 @@
- -#include <stdint.h>
- -#include <elf.h>
- -#include "pthread_impl.h"
- -#include "libc.h"
- -
- -#define HWCAP_TLS (1 << 15)
- -
- -extern const unsigned char __attribute__((__visibility__("hidden")))
- - __a_barrier_dummy[], __a_barrier_oldkuser[],
- - __a_barrier_v6[], __a_barrier_v7[],
- - __a_cas_dummy[], __a_cas_v6[], __a_cas_v7[],
- - __a_gettp_dummy[];
- -
- -#define __a_barrier_kuser 0xffff0fa0
- -#define __a_cas_kuser 0xffff0fc0
- -#define __a_gettp_kuser 0xffff0fe0
- -
- -extern uintptr_t __attribute__((__visibility__("hidden")))
- - __a_barrier_ptr, __a_cas_ptr, __a_gettp_ptr;
- -
- -#define SET(op,ver) (__a_##op##_ptr = \
- - (uintptr_t)__a_##op##_##ver - (uintptr_t)__a_##op##_dummy)
- -
- -int __set_thread_area(void *p)
- -{
- -#if !__ARM_ARCH_7A__ && !__ARM_ARCH_7R__ && __ARM_ARCH < 7
- - if (__hwcap & HWCAP_TLS) {
- - size_t *aux;
- - SET(cas, v7);
- - SET(barrier, v7);
- - for (aux=libc.auxv; *aux; aux+=2) {
- - if (*aux != AT_PLATFORM) continue;
- - const char *s = (void *)aux[1];
- - if (s[0]!='v' || s[1]!='6' || s[2]-'0'<10u) break;
- - SET(cas, v6);
- - SET(barrier, v6);
- - break;
- - }
- - } else {
- - int ver = *(int *)0xffff0ffc;
- - SET(gettp, kuser);
- - SET(cas, kuser);
- - SET(barrier, kuser);
- - if (ver < 2) a_crash();
- - if (ver < 3) SET(barrier, oldkuser);
- - }
- -#endif
- - return __syscall(0xf0005, p);
- -}
- --- a/arch/arm/src/arm/atomics.s
- +++ /dev/null
- @@ -1,116 +0,0 @@
- -.text
- -
- -.global __a_barrier
- -.hidden __a_barrier
- -.type __a_barrier,%function
- -__a_barrier:
- - ldr ip,1f
- - ldr ip,[pc,ip]
- - add pc,pc,ip
- -1: .word __a_barrier_ptr-1b
- -.global __a_barrier_dummy
- -.hidden __a_barrier_dummy
- -__a_barrier_dummy:
- - tst lr,#1
- - moveq pc,lr
- - bx lr
- -.global __a_barrier_oldkuser
- -.hidden __a_barrier_oldkuser
- -__a_barrier_oldkuser:
- - push {r0,r1,r2,r3,ip,lr}
- - mov r1,r0
- - mov r2,sp
- - ldr ip,=0xffff0fc0
- - mov lr,pc
- - mov pc,ip
- - pop {r0,r1,r2,r3,ip,lr}
- - tst lr,#1
- - moveq pc,lr
- - bx lr
- -.global __a_barrier_v6
- -.hidden __a_barrier_v6
- -__a_barrier_v6:
- - mcr p15,0,r0,c7,c10,5
- - bx lr
- -.global __a_barrier_v7
- -.hidden __a_barrier_v7
- -__a_barrier_v7:
- - .word 0xf57ff05b /* dmb ish */
- - bx lr
- -
- -.global __a_cas
- -.hidden __a_cas
- -.type __a_cas,%function
- -__a_cas:
- - ldr ip,1f
- - ldr ip,[pc,ip]
- - add pc,pc,ip
- -1: .word __a_cas_ptr-1b
- -.global __a_cas_dummy
- -.hidden __a_cas_dummy
- -__a_cas_dummy:
- - mov r3,r0
- - ldr r0,[r2]
- - subs r0,r3,r0
- - streq r1,[r2]
- - tst lr,#1
- - moveq pc,lr
- - bx lr
- -.global __a_cas_v6
- -.hidden __a_cas_v6
- -__a_cas_v6:
- - mov r3,r0
- - mcr p15,0,r0,c7,c10,5
- -1: .word 0xe1920f9f /* ldrex r0,[r2] */
- - subs r0,r3,r0
- - .word 0x01820f91 /* strexeq r0,r1,[r2] */
- - teqeq r0,#1
- - beq 1b
- - mcr p15,0,r0,c7,c10,5
- - bx lr
- -.global __a_cas_v7
- -.hidden __a_cas_v7
- -__a_cas_v7:
- - mov r3,r0
- - .word 0xf57ff05b /* dmb ish */
- -1: .word 0xe1920f9f /* ldrex r0,[r2] */
- - subs r0,r3,r0
- - .word 0x01820f91 /* strexeq r0,r1,[r2] */
- - teqeq r0,#1
- - beq 1b
- - .word 0xf57ff05b /* dmb ish */
- - bx lr
- -
- -.global __aeabi_read_tp
- -.type __aeabi_read_tp,%function
- -__aeabi_read_tp:
- -
- -.global __a_gettp
- -.hidden __a_gettp
- -.type __a_gettp,%function
- -__a_gettp:
- - ldr r0,1f
- - ldr r0,[pc,r0]
- - add pc,pc,r0
- -1: .word __a_gettp_ptr-1b
- -.global __a_gettp_dummy
- -.hidden __a_gettp_dummy
- -__a_gettp_dummy:
- - mrc p15,0,r0,c13,c0,3
- - bx lr
- -
- -.data
- -.global __a_barrier_ptr
- -.hidden __a_barrier_ptr
- -__a_barrier_ptr:
- - .word 0
- -
- -.global __a_cas_ptr
- -.hidden __a_cas_ptr
- -__a_cas_ptr:
- - .word 0
- -
- -.global __a_gettp_ptr
- -.hidden __a_gettp_ptr
- -__a_gettp_ptr:
- - .word 0
- --- a/arch/arm/src/find_exidx.c
- +++ /dev/null
- @@ -1,42 +0,0 @@
- -#define _GNU_SOURCE
- -#include <link.h>
- -#include <stdint.h>
- -
- -struct find_exidx_data {
- - uintptr_t pc, exidx_start;
- - int exidx_len;
- -};
- -
- -static int find_exidx(struct dl_phdr_info *info, size_t size, void *ptr)
- -{
- - struct find_exidx_data *data = ptr;
- - const ElfW(Phdr) *phdr = info->dlpi_phdr;
- - uintptr_t addr, exidx_start = 0;
- - int i, match = 0, exidx_len = 0;
- -
- - for (i = info->dlpi_phnum; i > 0; i--, phdr++) {
- - addr = info->dlpi_addr + phdr->p_vaddr;
- - switch (phdr->p_type) {
- - case PT_LOAD:
- - match |= data->pc >= addr && data->pc < addr + phdr->p_memsz;
- - break;
- - case PT_ARM_EXIDX:
- - exidx_start = addr;
- - exidx_len = phdr->p_memsz;
- - break;
- - }
- - }
- - data->exidx_start = exidx_start;
- - data->exidx_len = exidx_len;
- - return match;
- -}
- -
- -uintptr_t __gnu_Unwind_Find_exidx(uintptr_t pc, int *pcount)
- -{
- - struct find_exidx_data data;
- - data.pc = pc;
- - if (dl_iterate_phdr(find_exidx, &data) <= 0)
- - return 0;
- - *pcount = data.exidx_len / 8;
- - return data.exidx_start;
- -}
- --- /dev/null
- +++ b/arch/generic/bits/errno.h
- @@ -0,0 +1,134 @@
- +#define EPERM 1
- +#define ENOENT 2
- +#define ESRCH 3
- +#define EINTR 4
- +#define EIO 5
- +#define ENXIO 6
- +#define E2BIG 7
- +#define ENOEXEC 8
- +#define EBADF 9
- +#define ECHILD 10
- +#define EAGAIN 11
- +#define ENOMEM 12
- +#define EACCES 13
- +#define EFAULT 14
- +#define ENOTBLK 15
- +#define EBUSY 16
- +#define EEXIST 17
- +#define EXDEV 18
- +#define ENODEV 19
- +#define ENOTDIR 20
- +#define EISDIR 21
- +#define EINVAL 22
- +#define ENFILE 23
- +#define EMFILE 24
- +#define ENOTTY 25
- +#define ETXTBSY 26
- +#define EFBIG 27
- +#define ENOSPC 28
- +#define ESPIPE 29
- +#define EROFS 30
- +#define EMLINK 31
- +#define EPIPE 32
- +#define EDOM 33
- +#define ERANGE 34
- +#define EDEADLK 35
- +#define ENAMETOOLONG 36
- +#define ENOLCK 37
- +#define ENOSYS 38
- +#define ENOTEMPTY 39
- +#define ELOOP 40
- +#define EWOULDBLOCK EAGAIN
- +#define ENOMSG 42
- +#define EIDRM 43
- +#define ECHRNG 44
- +#define EL2NSYNC 45
- +#define EL3HLT 46
- +#define EL3RST 47
- +#define ELNRNG 48
- +#define EUNATCH 49
- +#define ENOCSI 50
- +#define EL2HLT 51
- +#define EBADE 52
- +#define EBADR 53
- +#define EXFULL 54
- +#define ENOANO 55
- +#define EBADRQC 56
- +#define EBADSLT 57
- +#define EDEADLOCK EDEADLK
- +#define EBFONT 59
- +#define ENOSTR 60
- +#define ENODATA 61
- +#define ETIME 62
- +#define ENOSR 63
- +#define ENONET 64
- +#define ENOPKG 65
- +#define EREMOTE 66
- +#define ENOLINK 67
- +#define EADV 68
- +#define ESRMNT 69
- +#define ECOMM 70
- +#define EPROTO 71
- +#define EMULTIHOP 72
- +#define EDOTDOT 73
- +#define EBADMSG 74
- +#define EOVERFLOW 75
- +#define ENOTUNIQ 76
- +#define EBADFD 77
- +#define EREMCHG 78
- +#define ELIBACC 79
- +#define ELIBBAD 80
- +#define ELIBSCN 81
- +#define ELIBMAX 82
- +#define ELIBEXEC 83
- +#define EILSEQ 84
- +#define ERESTART 85
- +#define ESTRPIPE 86
- +#define EUSERS 87
- +#define ENOTSOCK 88
- +#define EDESTADDRREQ 89
- +#define EMSGSIZE 90
- +#define EPROTOTYPE 91
- +#define ENOPROTOOPT 92
- +#define EPROTONOSUPPORT 93
- +#define ESOCKTNOSUPPORT 94
- +#define EOPNOTSUPP 95
- +#define ENOTSUP EOPNOTSUPP
- +#define EPFNOSUPPORT 96
- +#define EAFNOSUPPORT 97
- +#define EADDRINUSE 98
- +#define EADDRNOTAVAIL 99
- +#define ENETDOWN 100
- +#define ENETUNREACH 101
- +#define ENETRESET 102
- +#define ECONNABORTED 103
- +#define ECONNRESET 104
- +#define ENOBUFS 105
- +#define EISCONN 106
- +#define ENOTCONN 107
- +#define ESHUTDOWN 108
- +#define ETOOMANYREFS 109
- +#define ETIMEDOUT 110
- +#define ECONNREFUSED 111
- +#define EHOSTDOWN 112
- +#define EHOSTUNREACH 113
- +#define EALREADY 114
- +#define EINPROGRESS 115
- +#define ESTALE 116
- +#define EUCLEAN 117
- +#define ENOTNAM 118
- +#define ENAVAIL 119
- +#define EISNAM 120
- +#define EREMOTEIO 121
- +#define EDQUOT 122
- +#define ENOMEDIUM 123
- +#define EMEDIUMTYPE 124
- +#define ECANCELED 125
- +#define ENOKEY 126
- +#define EKEYEXPIRED 127
- +#define EKEYREVOKED 128
- +#define EKEYREJECTED 129
- +#define EOWNERDEAD 130
- +#define ENOTRECOVERABLE 131
- +#define ERFKILL 132
- +#define EHWPOISON 133
- --- /dev/null
- +++ b/arch/generic/bits/fcntl.h
- @@ -0,0 +1,40 @@
- +#define O_CREAT 0100
- +#define O_EXCL 0200
- +#define O_NOCTTY 0400
- +#define O_TRUNC 01000
- +#define O_APPEND 02000
- +#define O_NONBLOCK 04000
- +#define O_DSYNC 010000
- +#define O_SYNC 04010000
- +#define O_RSYNC 04010000
- +#define O_DIRECTORY 0200000
- +#define O_NOFOLLOW 0400000
- +#define O_CLOEXEC 02000000
- +
- +#define O_ASYNC 020000
- +#define O_DIRECT 040000
- +#define O_LARGEFILE 0100000
- +#define O_NOATIME 01000000
- +#define O_PATH 010000000
- +#define O_TMPFILE 020200000
- +#define O_NDELAY O_NONBLOCK
- +
- +#define F_DUPFD 0
- +#define F_GETFD 1
- +#define F_SETFD 2
- +#define F_GETFL 3
- +#define F_SETFL 4
- +
- +#define F_SETOWN 8
- +#define F_GETOWN 9
- +#define F_SETSIG 10
- +#define F_GETSIG 11
- +
- +#define F_GETLK 12
- +#define F_SETLK 13
- +#define F_SETLKW 14
- +
- +#define F_SETOWN_EX 15
- +#define F_GETOWN_EX 16
- +
- +#define F_GETOWNER_UIDS 17
- --- /dev/null
- +++ b/arch/generic/bits/fenv.h
- @@ -0,0 +1,10 @@
- +#define FE_ALL_EXCEPT 0
- +#define FE_TONEAREST 0
- +
- +typedef unsigned long fexcept_t;
- +
- +typedef struct {
- + unsigned long __cw;
- +} fenv_t;
- +
- +#define FE_DFL_ENV ((const fenv_t *) -1)
- --- /dev/null
- +++ b/arch/generic/bits/ioctl.h
- @@ -0,0 +1,197 @@
- +#define _IOC(a,b,c,d) ( ((a)<<30) | ((b)<<8) | (c) | ((d)<<16) )
- +#define _IOC_NONE 0U
- +#define _IOC_WRITE 1U
- +#define _IOC_READ 2U
- +
- +#define _IO(a,b) _IOC(_IOC_NONE,(a),(b),0)
- +#define _IOW(a,b,c) _IOC(_IOC_WRITE,(a),(b),sizeof(c))
- +#define _IOR(a,b,c) _IOC(_IOC_READ,(a),(b),sizeof(c))
- +#define _IOWR(a,b,c) _IOC(_IOC_READ|_IOC_WRITE,(a),(b),sizeof(c))
- +
- +#define TCGETS 0x5401
- +#define TCSETS 0x5402
- +#define TCSETSW 0x5403
- +#define TCSETSF 0x5404
- +#define TCGETA 0x5405
- +#define TCSETA 0x5406
- +#define TCSETAW 0x5407
- +#define TCSETAF 0x5408
- +#define TCSBRK 0x5409
- +#define TCXONC 0x540A
- +#define TCFLSH 0x540B
- +#define TIOCEXCL 0x540C
- +#define TIOCNXCL 0x540D
- +#define TIOCSCTTY 0x540E
- +#define TIOCGPGRP 0x540F
- +#define TIOCSPGRP 0x5410
- +#define TIOCOUTQ 0x5411
- +#define TIOCSTI 0x5412
- +#define TIOCGWINSZ 0x5413
- +#define TIOCSWINSZ 0x5414
- +#define TIOCMGET 0x5415
- +#define TIOCMBIS 0x5416
- +#define TIOCMBIC 0x5417
- +#define TIOCMSET 0x5418
- +#define TIOCGSOFTCAR 0x5419
- +#define TIOCSSOFTCAR 0x541A
- +#define FIONREAD 0x541B
- +#define TIOCINQ FIONREAD
- +#define TIOCLINUX 0x541C
- +#define TIOCCONS 0x541D
- +#define TIOCGSERIAL 0x541E
- +#define TIOCSSERIAL 0x541F
- +#define TIOCPKT 0x5420
- +#define FIONBIO 0x5421
- +#define TIOCNOTTY 0x5422
- +#define TIOCSETD 0x5423
- +#define TIOCGETD 0x5424
- +#define TCSBRKP 0x5425
- +#define TIOCTTYGSTRUCT 0x5426
- +#define TIOCSBRK 0x5427
- +#define TIOCCBRK 0x5428
- +#define TIOCGSID 0x5429
- +#define TIOCGPTN 0x80045430
- +#define TIOCSPTLCK 0x40045431
- +#define TCGETX 0x5432
- +#define TCSETX 0x5433
- +#define TCSETXF 0x5434
- +#define TCSETXW 0x5435
- +
- +#define FIONCLEX 0x5450
- +#define FIOCLEX 0x5451
- +#define FIOASYNC 0x5452
- +#define TIOCSERCONFIG 0x5453
- +#define TIOCSERGWILD 0x5454
- +#define TIOCSERSWILD 0x5455
- +#define TIOCGLCKTRMIOS 0x5456
- +#define TIOCSLCKTRMIOS 0x5457
- +#define TIOCSERGSTRUCT 0x5458
- +#define TIOCSERGETLSR 0x5459
- +#define TIOCSERGETMULTI 0x545A
- +#define TIOCSERSETMULTI 0x545B
- +
- +#define TIOCMIWAIT 0x545C
- +#define TIOCGICOUNT 0x545D
- +#define TIOCGHAYESESP 0x545E
- +#define TIOCSHAYESESP 0x545F
- +#define FIOQSIZE 0x5460
- +
- +#define TIOCPKT_DATA 0
- +#define TIOCPKT_FLUSHREAD 1
- +#define TIOCPKT_FLUSHWRITE 2
- +#define TIOCPKT_STOP 4
- +#define TIOCPKT_START 8
- +#define TIOCPKT_NOSTOP 16
- +#define TIOCPKT_DOSTOP 32
- +#define TIOCPKT_IOCTL 64
- +
- +#define TIOCSER_TEMT 0x01
- +
- +struct winsize {
- + unsigned short ws_row;
- + unsigned short ws_col;
- + unsigned short ws_xpixel;
- + unsigned short ws_ypixel;
- +};
- +
- +#define TIOCM_LE 0x001
- +#define TIOCM_DTR 0x002
- +#define TIOCM_RTS 0x004
- +#define TIOCM_ST 0x008
- +#define TIOCM_SR 0x010
- +#define TIOCM_CTS 0x020
- +#define TIOCM_CAR 0x040
- +#define TIOCM_RNG 0x080
- +#define TIOCM_DSR 0x100
- +#define TIOCM_CD TIOCM_CAR
- +#define TIOCM_RI TIOCM_RNG
- +#define TIOCM_OUT1 0x2000
- +#define TIOCM_OUT2 0x4000
- +#define TIOCM_LOOP 0x8000
- +#define TIOCM_MODEM_BITS TIOCM_OUT2
- +
- +#define N_TTY 0
- +#define N_SLIP 1
- +#define N_MOUSE 2
- +#define N_PPP 3
- +#define N_STRIP 4
- +#define N_AX25 5
- +#define N_X25 6
- +#define N_6PACK 7
- +#define N_MASC 8
- +#define N_R3964 9
- +#define N_PROFIBUS_FDL 10
- +#define N_IRDA 11
- +#define N_SMSBLOCK 12
- +#define N_HDLC 13
- +#define N_SYNC_PPP 14
- +#define N_HCI 15
- +
- +#define FIOSETOWN 0x8901
- +#define SIOCSPGRP 0x8902
- +#define FIOGETOWN 0x8903
- +#define SIOCGPGRP 0x8904
- +#define SIOCATMARK 0x8905
- +#define SIOCGSTAMP 0x8906
- +
- +#define SIOCADDRT 0x890B
- +#define SIOCDELRT 0x890C
- +#define SIOCRTMSG 0x890D
- +
- +#define SIOCGIFNAME 0x8910
- +#define SIOCSIFLINK 0x8911
- +#define SIOCGIFCONF 0x8912
- +#define SIOCGIFFLAGS 0x8913
- +#define SIOCSIFFLAGS 0x8914
- +#define SIOCGIFADDR 0x8915
- +#define SIOCSIFADDR 0x8916
- +#define SIOCGIFDSTADDR 0x8917
- +#define SIOCSIFDSTADDR 0x8918
- +#define SIOCGIFBRDADDR 0x8919
- +#define SIOCSIFBRDADDR 0x891a
- +#define SIOCGIFNETMASK 0x891b
- +#define SIOCSIFNETMASK 0x891c
- +#define SIOCGIFMETRIC 0x891d
- +#define SIOCSIFMETRIC 0x891e
- +#define SIOCGIFMEM 0x891f
- +#define SIOCSIFMEM 0x8920
- +#define SIOCGIFMTU 0x8921
- +#define SIOCSIFMTU 0x8922
- +#define SIOCSIFHWADDR 0x8924
- +#define SIOCGIFENCAP 0x8925
- +#define SIOCSIFENCAP 0x8926
- +#define SIOCGIFHWADDR 0x8927
- +#define SIOCGIFSLAVE 0x8929
- +#define SIOCSIFSLAVE 0x8930
- +#define SIOCADDMULTI 0x8931
- +#define SIOCDELMULTI 0x8932
- +#define SIOCGIFINDEX 0x8933
- +#define SIOGIFINDEX SIOCGIFINDEX
- +#define SIOCSIFPFLAGS 0x8934
- +#define SIOCGIFPFLAGS 0x8935
- +#define SIOCDIFADDR 0x8936
- +#define SIOCSIFHWBROADCAST 0x8937
- +#define SIOCGIFCOUNT 0x8938
- +
- +#define SIOCGIFBR 0x8940
- +#define SIOCSIFBR 0x8941
- +
- +#define SIOCGIFTXQLEN 0x8942
- +#define SIOCSIFTXQLEN 0x8943
- +
- +#define SIOCDARP 0x8953
- +#define SIOCGARP 0x8954
- +#define SIOCSARP 0x8955
- +
- +#define SIOCDRARP 0x8960
- +#define SIOCGRARP 0x8961
- +#define SIOCSRARP 0x8962
- +
- +#define SIOCGIFMAP 0x8970
- +#define SIOCSIFMAP 0x8971
- +
- +#define SIOCADDDLCI 0x8980
- +#define SIOCDELDLCI 0x8981
- +
- +#define SIOCDEVPRIVATE 0x89F0
- +#define SIOCPROTOPRIVATE 0x89E0
- --- /dev/null
- +++ b/arch/generic/bits/ipc.h
- @@ -0,0 +1,14 @@
- +struct ipc_perm
- +{
- + key_t __ipc_perm_key;
- + uid_t uid;
- + gid_t gid;
- + uid_t cuid;
- + gid_t cgid;
- + mode_t mode;
- + int __ipc_perm_seq;
- + long __pad1;
- + long __pad2;
- +};
- +
- +#define IPC_64 0x100
- --- /dev/null
- +++ b/arch/generic/bits/msg.h
- @@ -0,0 +1,16 @@
- +struct msqid_ds
- +{
- + struct ipc_perm msg_perm;
- + time_t msg_stime;
- + int __unused1;
- + time_t msg_rtime;
- + int __unused2;
- + time_t msg_ctime;
- + int __unused3;
- + unsigned long msg_cbytes;
- + msgqnum_t msg_qnum;
- + msglen_t msg_qbytes;
- + pid_t msg_lspid;
- + pid_t msg_lrpid;
- + unsigned long __unused[2];
- +};
- --- /dev/null
- +++ b/arch/generic/bits/sem.h
- @@ -0,0 +1,16 @@
- +struct semid_ds {
- + struct ipc_perm sem_perm;
- + time_t sem_otime;
- + time_t __unused1;
- + time_t sem_ctime;
- + time_t __unused2;
- +#if __BYTE_ORDER == __LITTLE_ENDIAN
- + unsigned short sem_nsems;
- + char __sem_nsems_pad[sizeof(time_t)-sizeof(short)];
- +#else
- + char __sem_nsems_pad[sizeof(time_t)-sizeof(short)];
- + unsigned short sem_nsems;
- +#endif
- + time_t __unused3;
- + time_t __unused4;
- +};
- --- /dev/null
- +++ b/arch/generic/bits/shm.h
- @@ -0,0 +1,29 @@
- +#define SHMLBA 4096
- +
- +struct shmid_ds
- +{
- + struct ipc_perm shm_perm;
- + size_t shm_segsz;
- + time_t shm_atime;
- + int __unused1;
- + time_t shm_dtime;
- + int __unused2;
- + time_t shm_ctime;
- + int __unused3;
- + pid_t shm_cpid;
- + pid_t shm_lpid;
- + unsigned long shm_nattch;
- + unsigned long __pad1;
- + unsigned long __pad2;
- +};
- +
- +struct shminfo {
- + unsigned long shmmax, shmmin, shmmni, shmseg, shmall, __unused[4];
- +};
- +
- +struct shm_info {
- + int __used_ids;
- + unsigned long shm_tot, shm_rss, shm_swp;
- + unsigned long __swap_attempts, __swap_successes;
- +};
- +
- --- /dev/null
- +++ b/arch/generic/bits/socket.h
- @@ -0,0 +1,17 @@
- +struct msghdr
- +{
- + void *msg_name;
- + socklen_t msg_namelen;
- + struct iovec *msg_iov;
- + int msg_iovlen;
- + void *msg_control;
- + socklen_t msg_controllen;
- + int msg_flags;
- +};
- +
- +struct cmsghdr
- +{
- + socklen_t cmsg_len;
- + int cmsg_level;
- + int cmsg_type;
- +};
- --- /dev/null
- +++ b/arch/generic/bits/statfs.h
- @@ -0,0 +1,7 @@
- +struct statfs {
- + unsigned long f_type, f_bsize;
- + fsblkcnt_t f_blocks, f_bfree, f_bavail;
- + fsfilcnt_t f_files, f_ffree;
- + fsid_t f_fsid;
- + unsigned long f_namelen, f_frsize, f_flags, f_spare[4];
- +};
- --- /dev/null
- +++ b/arch/generic/bits/stdarg.h
- @@ -0,0 +1,4 @@
- +#define va_start(v,l) __builtin_va_start(v,l)
- +#define va_end(v) __builtin_va_end(v)
- +#define va_arg(v,l) __builtin_va_arg(v,l)
- +#define va_copy(d,s) __builtin_va_copy(d,s)
- --- /dev/null
- +++ b/arch/generic/bits/termios.h
- @@ -0,0 +1,160 @@
- +struct termios
- +{
- + tcflag_t c_iflag;
- + tcflag_t c_oflag;
- + tcflag_t c_cflag;
- + tcflag_t c_lflag;
- + cc_t c_line;
- + cc_t c_cc[NCCS];
- + speed_t __c_ispeed;
- + speed_t __c_ospeed;
- +};
- +
- +#define VINTR 0
- +#define VQUIT 1
- +#define VERASE 2
- +#define VKILL 3
- +#define VEOF 4
- +#define VTIME 5
- +#define VMIN 6
- +#define VSWTC 7
- +#define VSTART 8
- +#define VSTOP 9
- +#define VSUSP 10
- +#define VEOL 11
- +#define VREPRINT 12
- +#define VDISCARD 13
- +#define VWERASE 14
- +#define VLNEXT 15
- +#define VEOL2 16
- +
- +#define IGNBRK 0000001
- +#define BRKINT 0000002
- +#define IGNPAR 0000004
- +#define PARMRK 0000010
- +#define INPCK 0000020
- +#define ISTRIP 0000040
- +#define INLCR 0000100
- +#define IGNCR 0000200
- +#define ICRNL 0000400
- +#define IUCLC 0001000
- +#define IXON 0002000
- +#define IXANY 0004000
- +#define IXOFF 0010000
- +#define IMAXBEL 0020000
- +#define IUTF8 0040000
- +
- +#define OPOST 0000001
- +#define OLCUC 0000002
- +#define ONLCR 0000004
- +#define OCRNL 0000010
- +#define ONOCR 0000020
- +#define ONLRET 0000040
- +#define OFILL 0000100
- +#define OFDEL 0000200
- +#define NLDLY 0000400
- +#define NL0 0000000
- +#define NL1 0000400
- +#define CRDLY 0003000
- +#define CR0 0000000
- +#define CR1 0001000
- +#define CR2 0002000
- +#define CR3 0003000
- +#define TABDLY 0014000
- +#define TAB0 0000000
- +#define TAB1 0004000
- +#define TAB2 0010000
- +#define TAB3 0014000
- +#define BSDLY 0020000
- +#define BS0 0000000
- +#define BS1 0020000
- +#define FFDLY 0100000
- +#define FF0 0000000
- +#define FF1 0100000
- +
- +#define VTDLY 0040000
- +#define VT0 0000000
- +#define VT1 0040000
- +
- +#define B0 0000000
- +#define B50 0000001
- +#define B75 0000002
- +#define B110 0000003
- +#define B134 0000004
- +#define B150 0000005
- +#define B200 0000006
- +#define B300 0000007
- +#define B600 0000010
- +#define B1200 0000011
- +#define B1800 0000012
- +#define B2400 0000013
- +#define B4800 0000014
- +#define B9600 0000015
- +#define B19200 0000016
- +#define B38400 0000017
- +
- +#define B57600 0010001
- +#define B115200 0010002
- +#define B230400 0010003
- +#define B460800 0010004
- +#define B500000 0010005
- +#define B576000 0010006
- +#define B921600 0010007
- +#define B1000000 0010010
- +#define B1152000 0010011
- +#define B1500000 0010012
- +#define B2000000 0010013
- +#define B2500000 0010014
- +#define B3000000 0010015
- +#define B3500000 0010016
- +#define B4000000 0010017
- +
- +#define CBAUD 0010017
- +
- +#define CSIZE 0000060
- +#define CS5 0000000
- +#define CS6 0000020
- +#define CS7 0000040
- +#define CS8 0000060
- +#define CSTOPB 0000100
- +#define CREAD 0000200
- +#define PARENB 0000400
- +#define PARODD 0001000
- +#define HUPCL 0002000
- +#define CLOCAL 0004000
- +
- +#define ISIG 0000001
- +#define ICANON 0000002
- +#define ECHO 0000010
- +#define ECHOE 0000020
- +#define ECHOK 0000040
- +#define ECHONL 0000100
- +#define NOFLSH 0000200
- +#define TOSTOP 0000400
- +#define IEXTEN 0100000
- +
- +#define ECHOCTL 0001000
- +#define ECHOPRT 0002000
- +#define ECHOKE 0004000
- +#define FLUSHO 0010000
- +#define PENDIN 0040000
- +
- +#define TCOOFF 0
- +#define TCOON 1
- +#define TCIOFF 2
- +#define TCION 3
- +
- +#define TCIFLUSH 0
- +#define TCOFLUSH 1
- +#define TCIOFLUSH 2
- +
- +#define TCSANOW 0
- +#define TCSADRAIN 1
- +#define TCSAFLUSH 2
- +
- +#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
- +#define CBAUDEX 0010000
- +#define CRTSCTS 020000000000
- +#define EXTPROC 0200000
- +#define XTABS 0014000
- +#endif
- --- a/arch/i386/atomic.h
- +++ /dev/null
- @@ -1,110 +0,0 @@
- -#ifndef _INTERNAL_ATOMIC_H
- -#define _INTERNAL_ATOMIC_H
- -
- -#include <stdint.h>
- -
- -static inline int a_ctz_64(uint64_t x)
- -{
- - int r;
- - __asm__( "bsf %1,%0 ; jnz 1f ; bsf %2,%0 ; addl $32,%0\n1:"
- - : "=&r"(r) : "r"((unsigned)x), "r"((unsigned)(x>>32)) );
- - return r;
- -}
- -
- -static inline int a_ctz_l(unsigned long x)
- -{
- - long r;
- - __asm__( "bsf %1,%0" : "=r"(r) : "r"(x) );
- - return r;
- -}
- -
- -static inline void a_and_64(volatile uint64_t *p, uint64_t v)
- -{
- - __asm__( "lock ; andl %1, (%0) ; lock ; andl %2, 4(%0)"
- - : : "r"((long *)p), "r"((unsigned)v), "r"((unsigned)(v>>32)) : "memory" );
- -}
- -
- -static inline void a_or_64(volatile uint64_t *p, uint64_t v)
- -{
- - __asm__( "lock ; orl %1, (%0) ; lock ; orl %2, 4(%0)"
- - : : "r"((long *)p), "r"((unsigned)v), "r"((unsigned)(v>>32)) : "memory" );
- -}
- -
- -static inline void a_or_l(volatile void *p, long v)
- -{
- - __asm__( "lock ; orl %1, %0"
- - : "=m"(*(long *)p) : "r"(v) : "memory" );
- -}
- -
- -static inline void *a_cas_p(volatile void *p, void *t, void *s)
- -{
- - __asm__( "lock ; cmpxchg %3, %1"
- - : "=a"(t), "=m"(*(long *)p) : "a"(t), "r"(s) : "memory" );
- - return t;
- -}
- -
- -static inline int a_cas(volatile int *p, int t, int s)
- -{
- - __asm__( "lock ; cmpxchg %3, %1"
- - : "=a"(t), "=m"(*p) : "a"(t), "r"(s) : "memory" );
- - return t;
- -}
- -
- -static inline void a_or(volatile int *p, int v)
- -{
- - __asm__( "lock ; orl %1, %0"
- - : "=m"(*p) : "r"(v) : "memory" );
- -}
- -
- -static inline void a_and(volatile int *p, int v)
- -{
- - __asm__( "lock ; andl %1, %0"
- - : "=m"(*p) : "r"(v) : "memory" );
- -}
- -
- -static inline int a_swap(volatile int *x, int v)
- -{
- - __asm__( "xchg %0, %1" : "=r"(v), "=m"(*x) : "0"(v) : "memory" );
- - return v;
- -}
- -
- -#define a_xchg a_swap
- -
- -static inline int a_fetch_add(volatile int *x, int v)
- -{
- - __asm__( "lock ; xadd %0, %1" : "=r"(v), "=m"(*x) : "0"(v) : "memory" );
- - return v;
- -}
- -
- -static inline void a_inc(volatile int *x)
- -{
- - __asm__( "lock ; incl %0" : "=m"(*x) : "m"(*x) : "memory" );
- -}
- -
- -static inline void a_dec(volatile int *x)
- -{
- - __asm__( "lock ; decl %0" : "=m"(*x) : "m"(*x) : "memory" );
- -}
- -
- -static inline void a_store(volatile int *p, int x)
- -{
- - __asm__( "movl %1, %0 ; lock ; orl $0,(%%esp)" : "=m"(*p) : "r"(x) : "memory" );
- -}
- -
- -static inline void a_spin()
- -{
- - __asm__ __volatile__( "pause" : : : "memory" );
- -}
- -
- -static inline void a_barrier()
- -{
- - __asm__ __volatile__( "" : : : "memory" );
- -}
- -
- -static inline void a_crash()
- -{
- - __asm__ __volatile__( "hlt" : : : "memory" );
- -}
- -
- -
- -#endif
- --- /dev/null
- +++ b/arch/i386/atomic_arch.h
- @@ -0,0 +1,101 @@
- +#define a_cas a_cas
- +static inline int a_cas(volatile int *p, int t, int s)
- +{
- + __asm__ __volatile__ (
- + "lock ; cmpxchg %3, %1"
- + : "=a"(t), "=m"(*p) : "a"(t), "r"(s) : "memory" );
- + return t;
- +}
- +
- +#define a_swap a_swap
- +static inline int a_swap(volatile int *p, int v)
- +{
- + __asm__ __volatile__(
- + "xchg %0, %1"
- + : "=r"(v), "=m"(*p) : "0"(v) : "memory" );
- + return v;
- +}
- +
- +#define a_fetch_add a_fetch_add
- +static inline int a_fetch_add(volatile int *p, int v)
- +{
- + __asm__ __volatile__(
- + "lock ; xadd %0, %1"
- + : "=r"(v), "=m"(*p) : "0"(v) : "memory" );
- + return v;
- +}
- +
- +#define a_and a_and
- +static inline void a_and(volatile int *p, int v)
- +{
- + __asm__ __volatile__(
- + "lock ; and %1, %0"
- + : "=m"(*p) : "r"(v) : "memory" );
- +}
- +
- +#define a_or a_or
- +static inline void a_or(volatile int *p, int v)
- +{
- + __asm__ __volatile__(
- + "lock ; or %1, %0"
- + : "=m"(*p) : "r"(v) : "memory" );
- +}
- +
- +#define a_inc a_inc
- +static inline void a_inc(volatile int *p)
- +{
- + __asm__ __volatile__(
- + "lock ; incl %0"
- + : "=m"(*p) : "m"(*p) : "memory" );
- +}
- +
- +#define a_dec a_dec
- +static inline void a_dec(volatile int *p)
- +{
- + __asm__ __volatile__(
- + "lock ; decl %0"
- + : "=m"(*p) : "m"(*p) : "memory" );
- +}
- +
- +#define a_store a_store
- +static inline void a_store(volatile int *p, int x)
- +{
- + __asm__ __volatile__(
- + "mov %1, %0 ; lock ; orl $0,(%%esp)"
- + : "=m"(*p) : "r"(x) : "memory" );
- +}
- +
- +#define a_barrier a_barrier
- +static inline void a_barrier()
- +{
- + __asm__ __volatile__( "" : : : "memory" );
- +}
- +
- +#define a_pause a_pause
- +static inline void a_spin()
- +{
- + __asm__ __volatile__( "pause" : : : "memory" );
- +}
- +
- +#define a_crash a_crash
- +static inline void a_crash()
- +{
- + __asm__ __volatile__( "hlt" : : : "memory" );
- +}
- +
- +#define a_ctz_64 a_ctz_64
- +static inline int a_ctz_64(uint64_t x)
- +{
- + int r;
- + __asm__( "bsf %1,%0 ; jnz 1f ; bsf %2,%0 ; add $32,%0\n1:"
- + : "=&r"(r) : "r"((unsigned)x), "r"((unsigned)(x>>32)) );
- + return r;
- +}
- +
- +#define a_ctz_l a_ctz_l
- +static inline int a_ctz_l(unsigned long x)
- +{
- + long r;
- + __asm__( "bsf %1,%0" : "=r"(r) : "r"(x) );
- + return r;
- +}
- --- a/arch/i386/bits/alltypes.h.in
- +++ b/arch/i386/bits/alltypes.h.in
- @@ -26,10 +26,12 @@ TYPEDEF long double float_t;
- TYPEDEF long double double_t;
- #endif
-
- -#ifdef __cplusplus
- -TYPEDEF struct { alignas(8) long long __ll; long double __ld; } max_align_t;
- -#else
- +#if !defined(__cplusplus)
- TYPEDEF struct { _Alignas(8) long long __ll; long double __ld; } max_align_t;
- +#elif defined(__GNUC__)
- +TYPEDEF struct { __attribute__((__aligned__(8))) long long __ll; long double __ld; } max_align_t;
- +#else
- +TYPEDEF struct { alignas(8) long long __ll; long double __ld; } max_align_t;
- #endif
-
- TYPEDEF long time_t;
- --- a/arch/i386/bits/errno.h
- +++ /dev/null
- @@ -1,134 +0,0 @@
- -#define EPERM 1
- -#define ENOENT 2
- -#define ESRCH 3
- -#define EINTR 4
- -#define EIO 5
- -#define ENXIO 6
- -#define E2BIG 7
- -#define ENOEXEC 8
- -#define EBADF 9
- -#define ECHILD 10
- -#define EAGAIN 11
- -#define ENOMEM 12
- -#define EACCES 13
- -#define EFAULT 14
- -#define ENOTBLK 15
- -#define EBUSY 16
- -#define EEXIST 17
- -#define EXDEV 18
- -#define ENODEV 19
- -#define ENOTDIR 20
- -#define EISDIR 21
- -#define EINVAL 22
- -#define ENFILE 23
- -#define EMFILE 24
- -#define ENOTTY 25
- -#define ETXTBSY 26
- -#define EFBIG 27
- -#define ENOSPC 28
- -#define ESPIPE 29
- -#define EROFS 30
- -#define EMLINK 31
- -#define EPIPE 32
- -#define EDOM 33
- -#define ERANGE 34
- -#define EDEADLK 35
- -#define ENAMETOOLONG 36
- -#define ENOLCK 37
- -#define ENOSYS 38
- -#define ENOTEMPTY 39
- -#define ELOOP 40
- -#define EWOULDBLOCK EAGAIN
- -#define ENOMSG 42
- -#define EIDRM 43
- -#define ECHRNG 44
- -#define EL2NSYNC 45
- -#define EL3HLT 46
- -#define EL3RST 47
- -#define ELNRNG 48
- -#define EUNATCH 49
- -#define ENOCSI 50
- -#define EL2HLT 51
- -#define EBADE 52
- -#define EBADR 53
- -#define EXFULL 54
- -#define ENOANO 55
- -#define EBADRQC 56
- -#define EBADSLT 57
- -#define EDEADLOCK EDEADLK
- -#define EBFONT 59
- -#define ENOSTR 60
- -#define ENODATA 61
- -#define ETIME 62
- -#define ENOSR 63
- -#define ENONET 64
- -#define ENOPKG 65
- -#define EREMOTE 66
- -#define ENOLINK 67
- -#define EADV 68
- -#define ESRMNT 69
- -#define ECOMM 70
- -#define EPROTO 71
- -#define EMULTIHOP 72
- -#define EDOTDOT 73
- -#define EBADMSG 74
- -#define EOVERFLOW 75
- -#define ENOTUNIQ 76
- -#define EBADFD 77
- -#define EREMCHG 78
- -#define ELIBACC 79
- -#define ELIBBAD 80
- -#define ELIBSCN 81
- -#define ELIBMAX 82
- -#define ELIBEXEC 83
- -#define EILSEQ 84
- -#define ERESTART 85
- -#define ESTRPIPE 86
- -#define EUSERS 87
- -#define ENOTSOCK 88
- -#define EDESTADDRREQ 89
- -#define EMSGSIZE 90
- -#define EPROTOTYPE 91
- -#define ENOPROTOOPT 92
- -#define EPROTONOSUPPORT 93
- -#define ESOCKTNOSUPPORT 94
- -#define EOPNOTSUPP 95
- -#define ENOTSUP EOPNOTSUPP
- -#define EPFNOSUPPORT 96
- -#define EAFNOSUPPORT 97
- -#define EADDRINUSE 98
- -#define EADDRNOTAVAIL 99
- -#define ENETDOWN 100
- -#define ENETUNREACH 101
- -#define ENETRESET 102
- -#define ECONNABORTED 103
- -#define ECONNRESET 104
- -#define ENOBUFS 105
- -#define EISCONN 106
- -#define ENOTCONN 107
- -#define ESHUTDOWN 108
- -#define ETOOMANYREFS 109
- -#define ETIMEDOUT 110
- -#define ECONNREFUSED 111
- -#define EHOSTDOWN 112
- -#define EHOSTUNREACH 113
- -#define EALREADY 114
- -#define EINPROGRESS 115
- -#define ESTALE 116
- -#define EUCLEAN 117
- -#define ENOTNAM 118
- -#define ENAVAIL 119
- -#define EISNAM 120
- -#define EREMOTEIO 121
- -#define EDQUOT 122
- -#define ENOMEDIUM 123
- -#define EMEDIUMTYPE 124
- -#define ECANCELED 125
- -#define ENOKEY 126
- -#define EKEYEXPIRED 127
- -#define EKEYREVOKED 128
- -#define EKEYREJECTED 129
- -#define EOWNERDEAD 130
- -#define ENOTRECOVERABLE 131
- -#define ERFKILL 132
- -#define EHWPOISON 133
- --- a/arch/i386/bits/fcntl.h
- +++ /dev/null
- @@ -1,40 +0,0 @@
- -#define O_CREAT 0100
- -#define O_EXCL 0200
- -#define O_NOCTTY 0400
- -#define O_TRUNC 01000
- -#define O_APPEND 02000
- -#define O_NONBLOCK 04000
- -#define O_DSYNC 010000
- -#define O_SYNC 04010000
- -#define O_RSYNC 04010000
- -#define O_DIRECTORY 0200000
- -#define O_NOFOLLOW 0400000
- -#define O_CLOEXEC 02000000
- -
- -#define O_ASYNC 020000
- -#define O_DIRECT 040000
- -#define O_LARGEFILE 0100000
- -#define O_NOATIME 01000000
- -#define O_PATH 010000000
- -#define O_TMPFILE 020200000
- -#define O_NDELAY O_NONBLOCK
- -
- -#define F_DUPFD 0
- -#define F_GETFD 1
- -#define F_SETFD 2
- -#define F_GETFL 3
- -#define F_SETFL 4
- -
- -#define F_SETOWN 8
- -#define F_GETOWN 9
- -#define F_SETSIG 10
- -#define F_GETSIG 11
- -
- -#define F_GETLK 12
- -#define F_SETLK 13
- -#define F_SETLKW 14
- -
- -#define F_SETOWN_EX 15
- -#define F_GETOWN_EX 16
- -
- -#define F_GETOWNER_UIDS 17
- --- a/arch/i386/bits/ioctl.h
- +++ /dev/null
- @@ -1,197 +0,0 @@
- -#define _IOC(a,b,c,d) ( ((a)<<30) | ((b)<<8) | (c) | ((d)<<16) )
- -#define _IOC_NONE 0U
- -#define _IOC_WRITE 1U
- -#define _IOC_READ 2U
- -
- -#define _IO(a,b) _IOC(_IOC_NONE,(a),(b),0)
- -#define _IOW(a,b,c) _IOC(_IOC_WRITE,(a),(b),sizeof(c))
- -#define _IOR(a,b,c) _IOC(_IOC_READ,(a),(b),sizeof(c))
- -#define _IOWR(a,b,c) _IOC(_IOC_READ|_IOC_WRITE,(a),(b),sizeof(c))
- -
- -#define TCGETS 0x5401
- -#define TCSETS 0x5402
- -#define TCSETSW 0x5403
- -#define TCSETSF 0x5404
- -#define TCGETA 0x5405
- -#define TCSETA 0x5406
- -#define TCSETAW 0x5407
- -#define TCSETAF 0x5408
- -#define TCSBRK 0x5409
- -#define TCXONC 0x540A
- -#define TCFLSH 0x540B
- -#define TIOCEXCL 0x540C
- -#define TIOCNXCL 0x540D
- -#define TIOCSCTTY 0x540E
- -#define TIOCGPGRP 0x540F
- -#define TIOCSPGRP 0x5410
- -#define TIOCOUTQ 0x5411
- -#define TIOCSTI 0x5412
- -#define TIOCGWINSZ 0x5413
- -#define TIOCSWINSZ 0x5414
- -#define TIOCMGET 0x5415
- -#define TIOCMBIS 0x5416
- -#define TIOCMBIC 0x5417
- -#define TIOCMSET 0x5418
- -#define TIOCGSOFTCAR 0x5419
- -#define TIOCSSOFTCAR 0x541A
- -#define FIONREAD 0x541B
- -#define TIOCINQ FIONREAD
- -#define TIOCLINUX 0x541C
- -#define TIOCCONS 0x541D
- -#define TIOCGSERIAL 0x541E
- -#define TIOCSSERIAL 0x541F
- -#define TIOCPKT 0x5420
- -#define FIONBIO 0x5421
- -#define TIOCNOTTY 0x5422
- -#define TIOCSETD 0x5423
- -#define TIOCGETD 0x5424
- -#define TCSBRKP 0x5425
- -#define TIOCTTYGSTRUCT 0x5426
- -#define TIOCSBRK 0x5427
- -#define TIOCCBRK 0x5428
- -#define TIOCGSID 0x5429
- -#define TIOCGPTN 0x80045430
- -#define TIOCSPTLCK 0x40045431
- -#define TCGETX 0x5432
- -#define TCSETX 0x5433
- -#define TCSETXF 0x5434
- -#define TCSETXW 0x5435
- -
- -#define FIONCLEX 0x5450
- -#define FIOCLEX 0x5451
- -#define FIOASYNC 0x5452
- -#define TIOCSERCONFIG 0x5453
- -#define TIOCSERGWILD 0x5454
- -#define TIOCSERSWILD 0x5455
- -#define TIOCGLCKTRMIOS 0x5456
- -#define TIOCSLCKTRMIOS 0x5457
- -#define TIOCSERGSTRUCT 0x5458
- -#define TIOCSERGETLSR 0x5459
- -#define TIOCSERGETMULTI 0x545A
- -#define TIOCSERSETMULTI 0x545B
- -
- -#define TIOCMIWAIT 0x545C
- -#define TIOCGICOUNT 0x545D
- -#define TIOCGHAYESESP 0x545E
- -#define TIOCSHAYESESP 0x545F
- -#define FIOQSIZE 0x5460
- -
- -#define TIOCPKT_DATA 0
- -#define TIOCPKT_FLUSHREAD 1
- -#define TIOCPKT_FLUSHWRITE 2
- -#define TIOCPKT_STOP 4
- -#define TIOCPKT_START 8
- -#define TIOCPKT_NOSTOP 16
- -#define TIOCPKT_DOSTOP 32
- -#define TIOCPKT_IOCTL 64
- -
- -#define TIOCSER_TEMT 0x01
- -
- -struct winsize {
- - unsigned short ws_row;
- - unsigned short ws_col;
- - unsigned short ws_xpixel;
- - unsigned short ws_ypixel;
- -};
- -
- -#define TIOCM_LE 0x001
- -#define TIOCM_DTR 0x002
- -#define TIOCM_RTS 0x004
- -#define TIOCM_ST 0x008
- -#define TIOCM_SR 0x010
- -#define TIOCM_CTS 0x020
- -#define TIOCM_CAR 0x040
- -#define TIOCM_RNG 0x080
- -#define TIOCM_DSR 0x100
- -#define TIOCM_CD TIOCM_CAR
- -#define TIOCM_RI TIOCM_RNG
- -#define TIOCM_OUT1 0x2000
- -#define TIOCM_OUT2 0x4000
- -#define TIOCM_LOOP 0x8000
- -#define TIOCM_MODEM_BITS TIOCM_OUT2
- -
- -#define N_TTY 0
- -#define N_SLIP 1
- -#define N_MOUSE 2
- -#define N_PPP 3
- -#define N_STRIP 4
- -#define N_AX25 5
- -#define N_X25 6
- -#define N_6PACK 7
- -#define N_MASC 8
- -#define N_R3964 9
- -#define N_PROFIBUS_FDL 10
- -#define N_IRDA 11
- -#define N_SMSBLOCK 12
- -#define N_HDLC 13
- -#define N_SYNC_PPP 14
- -#define N_HCI 15
- -
- -#define FIOSETOWN 0x8901
- -#define SIOCSPGRP 0x8902
- -#define FIOGETOWN 0x8903
- -#define SIOCGPGRP 0x8904
- -#define SIOCATMARK 0x8905
- -#define SIOCGSTAMP 0x8906
- -
- -#define SIOCADDRT 0x890B
- -#define SIOCDELRT 0x890C
- -#define SIOCRTMSG 0x890D
- -
- -#define SIOCGIFNAME 0x8910
- -#define SIOCSIFLINK 0x8911
- -#define SIOCGIFCONF 0x8912
- -#define SIOCGIFFLAGS 0x8913
- -#define SIOCSIFFLAGS 0x8914
- -#define SIOCGIFADDR 0x8915
- -#define SIOCSIFADDR 0x8916
- -#define SIOCGIFDSTADDR 0x8917
- -#define SIOCSIFDSTADDR 0x8918
- -#define SIOCGIFBRDADDR 0x8919
- -#define SIOCSIFBRDADDR 0x891a
- -#define SIOCGIFNETMASK 0x891b
- -#define SIOCSIFNETMASK 0x891c
- -#define SIOCGIFMETRIC 0x891d
- -#define SIOCSIFMETRIC 0x891e
- -#define SIOCGIFMEM 0x891f
- -#define SIOCSIFMEM 0x8920
- -#define SIOCGIFMTU 0x8921
- -#define SIOCSIFMTU 0x8922
- -#define SIOCSIFHWADDR 0x8924
- -#define SIOCGIFENCAP 0x8925
- -#define SIOCSIFENCAP 0x8926
- -#define SIOCGIFHWADDR 0x8927
- -#define SIOCGIFSLAVE 0x8929
- -#define SIOCSIFSLAVE 0x8930
- -#define SIOCADDMULTI 0x8931
- -#define SIOCDELMULTI 0x8932
- -#define SIOCGIFINDEX 0x8933
- -#define SIOGIFINDEX SIOCGIFINDEX
- -#define SIOCSIFPFLAGS 0x8934
- -#define SIOCGIFPFLAGS 0x8935
- -#define SIOCDIFADDR 0x8936
- -#define SIOCSIFHWBROADCAST 0x8937
- -#define SIOCGIFCOUNT 0x8938
- -
- -#define SIOCGIFBR 0x8940
- -#define SIOCSIFBR 0x8941
- -
- -#define SIOCGIFTXQLEN 0x8942
- -#define SIOCSIFTXQLEN 0x8943
- -
- -#define SIOCDARP 0x8953
- -#define SIOCGARP 0x8954
- -#define SIOCSARP 0x8955
- -
- -#define SIOCDRARP 0x8960
- -#define SIOCGRARP 0x8961
- -#define SIOCSRARP 0x8962
- -
- -#define SIOCGIFMAP 0x8970
- -#define SIOCSIFMAP 0x8971
- -
- -#define SIOCADDDLCI 0x8980
- -#define SIOCDELDLCI 0x8981
- -
- -#define SIOCDEVPRIVATE 0x89F0
- -#define SIOCPROTOPRIVATE 0x89E0
- --- a/arch/i386/bits/ipc.h
- +++ /dev/null
- @@ -1,14 +0,0 @@
- -struct ipc_perm
- -{
- - key_t __ipc_perm_key;
- - uid_t uid;
- - gid_t gid;
- - uid_t cuid;
- - gid_t cgid;
- - mode_t mode;
- - int __ipc_perm_seq;
- - long __pad1;
- - long __pad2;
- -};
- -
- -#define IPC_64 0x100
- --- a/arch/i386/bits/mman.h
- +++ b/arch/i386/bits/mman.h
- @@ -38,6 +38,7 @@
-
- #define MCL_CURRENT 1
- #define MCL_FUTURE 2
- +#define MCL_ONFAULT 4
-
- #if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
- #define MADV_NORMAL 0
- --- a/arch/i386/bits/msg.h
- +++ /dev/null
- @@ -1,16 +0,0 @@
- -struct msqid_ds
- -{
- - struct ipc_perm msg_perm;
- - time_t msg_stime;
- - int __unused1;
- - time_t msg_rtime;
- - int __unused2;
- - time_t msg_ctime;
- - int __unused3;
- - unsigned long msg_cbytes;
- - msgqnum_t msg_qnum;
- - msglen_t msg_qbytes;
- - pid_t msg_lspid;
- - pid_t msg_lrpid;
- - unsigned long __unused[2];
- -};
- --- a/arch/i386/bits/sem.h
- +++ /dev/null
- @@ -1,16 +0,0 @@
- -struct semid_ds {
- - struct ipc_perm sem_perm;
- - time_t sem_otime;
- - time_t __unused1;
- - time_t sem_ctime;
- - time_t __unused2;
- -#if __BYTE_ORDER == __LITTLE_ENDIAN
- - unsigned short sem_nsems;
- - char __sem_nsems_pad[sizeof(time_t)-sizeof(short)];
- -#else
- - char __sem_nsems_pad[sizeof(time_t)-sizeof(short)];
- - unsigned short sem_nsems;
- -#endif
- - time_t __unused3;
- - time_t __unused4;
- -};
- --- a/arch/i386/bits/shm.h
- +++ /dev/null
- @@ -1,29 +0,0 @@
- -#define SHMLBA 4096
- -
- -struct shmid_ds
- -{
- - struct ipc_perm shm_perm;
- - size_t shm_segsz;
- - time_t shm_atime;
- - int __unused1;
- - time_t shm_dtime;
- - int __unused2;
- - time_t shm_ctime;
- - int __unused3;
- - pid_t shm_cpid;
- - pid_t shm_lpid;
- - unsigned long shm_nattch;
- - unsigned long __pad1;
- - unsigned long __pad2;
- -};
- -
- -struct shminfo {
- - unsigned long shmmax, shmmin, shmmni, shmseg, shmall, __unused[4];
- -};
- -
- -struct shm_info {
- - int __used_ids;
- - unsigned long shm_tot, shm_rss, shm_swp;
- - unsigned long __swap_attempts, __swap_successes;
- -};
- -
- --- a/arch/i386/bits/socket.h
- +++ /dev/null
- @@ -1,17 +0,0 @@
- -struct msghdr
- -{
- - void *msg_name;
- - socklen_t msg_namelen;
- - struct iovec *msg_iov;
- - int msg_iovlen;
- - void *msg_control;
- - socklen_t msg_controllen;
- - int msg_flags;
- -};
- -
- -struct cmsghdr
- -{
- - socklen_t cmsg_len;
- - int cmsg_level;
- - int cmsg_type;
- -};
- --- a/arch/i386/bits/statfs.h
- +++ /dev/null
- @@ -1,7 +0,0 @@
- -struct statfs {
- - unsigned long f_type, f_bsize;
- - fsblkcnt_t f_blocks, f_bfree, f_bavail;
- - fsfilcnt_t f_files, f_ffree;
- - fsid_t f_fsid;
- - unsigned long f_namelen, f_frsize, f_flags, f_spare[4];
- -};
- --- a/arch/i386/bits/syscall.h
- +++ b/arch/i386/bits/syscall.h
- @@ -357,6 +357,24 @@
- #define __NR_memfd_create 356
- #define __NR_bpf 357
- #define __NR_execveat 358
- +#define __NR_socket 359
- +#define __NR_socketpair 360
- +#define __NR_bind 361
- +#define __NR_connect 362
- +#define __NR_listen 363
- +#define __NR_accept4 364
- +#define __NR_getsockopt 365
- +#define __NR_setsockopt 366
- +#define __NR_getsockname 367
- +#define __NR_getpeername 368
- +#define __NR_sendto 369
- +#define __NR_sendmsg 370
- +#define __NR_recvfrom 371
- +#define __NR_recvmsg 372
- +#define __NR_shutdown 373
- +#define __NR_userfaultfd 374
- +#define __NR_membarrier 375
- +#define __NR_mlock2 376
-
-
- /* Repeated with SYS_ prefix */
- @@ -720,3 +738,21 @@
- #define SYS_memfd_create 356
- #define SYS_bpf 357
- #define SYS_execveat 358
- +#define SYS_socket 359
- +#define SYS_socketpair 360
- +#define SYS_bind 361
- +#define SYS_connect 362
- +#define SYS_listen 363
- +#define SYS_accept4 364
- +#define SYS_getsockopt 365
- +#define SYS_setsockopt 366
- +#define SYS_getsockname 367
- +#define SYS_getpeername 368
- +#define SYS_sendto 369
- +#define SYS_sendmsg 370
- +#define SYS_recvfrom 371
- +#define SYS_recvmsg 372
- +#define SYS_shutdown 373
- +#define SYS_userfaultfd 374
- +#define SYS_membarrier 375
- +#define SYS_mlock2 376
- --- a/arch/i386/bits/termios.h
- +++ /dev/null
- @@ -1,160 +0,0 @@
- -struct termios
- -{
- - tcflag_t c_iflag;
- - tcflag_t c_oflag;
- - tcflag_t c_cflag;
- - tcflag_t c_lflag;
- - cc_t c_line;
- - cc_t c_cc[NCCS];
- - speed_t __c_ispeed;
- - speed_t __c_ospeed;
- -};
- -
- -#define VINTR 0
- -#define VQUIT 1
- -#define VERASE 2
- -#define VKILL 3
- -#define VEOF 4
- -#define VTIME 5
- -#define VMIN 6
- -#define VSWTC 7
- -#define VSTART 8
- -#define VSTOP 9
- -#define VSUSP 10
- -#define VEOL 11
- -#define VREPRINT 12
- -#define VDISCARD 13
- -#define VWERASE 14
- -#define VLNEXT 15
- -#define VEOL2 16
- -
- -#define IGNBRK 0000001
- -#define BRKINT 0000002
- -#define IGNPAR 0000004
- -#define PARMRK 0000010
- -#define INPCK 0000020
- -#define ISTRIP 0000040
- -#define INLCR 0000100
- -#define IGNCR 0000200
- -#define ICRNL 0000400
- -#define IUCLC 0001000
- -#define IXON 0002000
- -#define IXANY 0004000
- -#define IXOFF 0010000
- -#define IMAXBEL 0020000
- -#define IUTF8 0040000
- -
- -#define OPOST 0000001
- -#define OLCUC 0000002
- -#define ONLCR 0000004
- -#define OCRNL 0000010
- -#define ONOCR 0000020
- -#define ONLRET 0000040
- -#define OFILL 0000100
- -#define OFDEL 0000200
- -#define NLDLY 0000400
- -#define NL0 0000000
- -#define NL1 0000400
- -#define CRDLY 0003000
- -#define CR0 0000000
- -#define CR1 0001000
- -#define CR2 0002000
- -#define CR3 0003000
- -#define TABDLY 0014000
- -#define TAB0 0000000
- -#define TAB1 0004000
- -#define TAB2 0010000
- -#define TAB3 0014000
- -#define BSDLY 0020000
- -#define BS0 0000000
- -#define BS1 0020000
- -#define FFDLY 0100000
- -#define FF0 0000000
- -#define FF1 0100000
- -
- -#define VTDLY 0040000
- -#define VT0 0000000
- -#define VT1 0040000
- -
- -#define B0 0000000
- -#define B50 0000001
- -#define B75 0000002
- -#define B110 0000003
- -#define B134 0000004
- -#define B150 0000005
- -#define B200 0000006
- -#define B300 0000007
- -#define B600 0000010
- -#define B1200 0000011
- -#define B1800 0000012
- -#define B2400 0000013
- -#define B4800 0000014
- -#define B9600 0000015
- -#define B19200 0000016
- -#define B38400 0000017
- -
- -#define B57600 0010001
- -#define B115200 0010002
- -#define B230400 0010003
- -#define B460800 0010004
- -#define B500000 0010005
- -#define B576000 0010006
- -#define B921600 0010007
- -#define B1000000 0010010
- -#define B1152000 0010011
- -#define B1500000 0010012
- -#define B2000000 0010013
- -#define B2500000 0010014
- -#define B3000000 0010015
- -#define B3500000 0010016
- -#define B4000000 0010017
- -
- -#define CBAUD 0010017
- -
- -#define CSIZE 0000060
- -#define CS5 0000000
- -#define CS6 0000020
- -#define CS7 0000040
- -#define CS8 0000060
- -#define CSTOPB 0000100
- -#define CREAD 0000200
- -#define PARENB 0000400
- -#define PARODD 0001000
- -#define HUPCL 0002000
- -#define CLOCAL 0004000
- -
- -#define ISIG 0000001
- -#define ICANON 0000002
- -#define ECHO 0000010
- -#define ECHOE 0000020
- -#define ECHOK 0000040
- -#define ECHONL 0000100
- -#define NOFLSH 0000200
- -#define TOSTOP 0000400
- -#define IEXTEN 0100000
- -
- -#define ECHOCTL 0001000
- -#define ECHOPRT 0002000
- -#define ECHOKE 0004000
- -#define FLUSHO 0010000
- -#define PENDIN 0040000
- -
- -#define TCOOFF 0
- -#define TCOON 1
- -#define TCIOFF 2
- -#define TCION 3
- -
- -#define TCIFLUSH 0
- -#define TCOFLUSH 1
- -#define TCIOFLUSH 2
- -
- -#define TCSANOW 0
- -#define TCSADRAIN 1
- -#define TCSAFLUSH 2
- -
- -#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
- -#define CBAUDEX 0010000
- -#define CRTSCTS 020000000000
- -#define EXTPROC 0200000
- -#define XTABS 0014000
- -#endif
- --- a/arch/i386/pthread_arch.h
- +++ b/arch/i386/pthread_arch.h
- @@ -7,4 +7,4 @@ static inline struct pthread *__pthread_
-
- #define TP_ADJ(p) (p)
-
- -#define CANCEL_REG_IP 14
- +#define MC_PC gregs[REG_EIP]
- --- a/arch/i386/syscall_arch.h
- +++ b/arch/i386/syscall_arch.h
- @@ -55,3 +55,5 @@ static inline long __syscall6(long n, lo
- #define VDSO_USEFUL
- #define VDSO_CGT_SYM "__vdso_clock_gettime"
- #define VDSO_CGT_VER "LINUX_2.6"
- +
- +#define SYSCALL_USE_SOCKETCALL
- --- a/arch/microblaze/atomic.h
- +++ /dev/null
- @@ -1,143 +0,0 @@
- -#ifndef _INTERNAL_ATOMIC_H
- -#define _INTERNAL_ATOMIC_H
- -
- -#include <stdint.h>
- -
- -static inline int a_ctz_l(unsigned long x)
- -{
- - static const char debruijn32[32] = {
- - 0, 1, 23, 2, 29, 24, 19, 3, 30, 27, 25, 11, 20, 8, 4, 13,
- - 31, 22, 28, 18, 26, 10, 7, 12, 21, 17, 9, 6, 16, 5, 15, 14
- - };
- - return debruijn32[(x&-x)*0x076be629 >> 27];
- -}
- -
- -static inline int a_ctz_64(uint64_t x)
- -{
- - uint32_t y = x;
- - if (!y) {
- - y = x>>32;
- - return 32 + a_ctz_l(y);
- - }
- - return a_ctz_l(y);
- -}
- -
- -static inline int a_cas(volatile int *p, int t, int s)
- -{
- - register int old, tmp;
- - __asm__ __volatile__ (
- - " addi %0, r0, 0\n"
- - "1: lwx %0, %2, r0\n"
- - " rsubk %1, %0, %3\n"
- - " bnei %1, 1f\n"
- - " swx %4, %2, r0\n"
- - " addic %1, r0, 0\n"
- - " bnei %1, 1b\n"
- - "1: "
- - : "=&r"(old), "=&r"(tmp)
- - : "r"(p), "r"(t), "r"(s)
- - : "cc", "memory" );
- - return old;
- -}
- -
- -static inline void *a_cas_p(volatile void *p, void *t, void *s)
- -{
- - return (void *)a_cas(p, (int)t, (int)s);
- -}
- -
- -static inline int a_swap(volatile int *x, int v)
- -{
- - register int old, tmp;
- - __asm__ __volatile__ (
- - " addi %0, r0, 0\n"
- - "1: lwx %0, %2, r0\n"
- - " swx %3, %2, r0\n"
- - " addic %1, r0, 0\n"
- - " bnei %1, 1b\n"
- - "1: "
- - : "=&r"(old), "=&r"(tmp)
- - : "r"(x), "r"(v)
- - : "cc", "memory" );
- - return old;
- -}
- -
- -static inline int a_fetch_add(volatile int *x, int v)
- -{
- - register int new, tmp;
- - __asm__ __volatile__ (
- - " addi %0, r0, 0\n"
- - "1: lwx %0, %2, r0\n"
- - " addk %0, %0, %3\n"
- - " swx %0, %2, r0\n"
- - " addic %1, r0, 0\n"
- - " bnei %1, 1b\n"
- - "1: "
- - : "=&r"(new), "=&r"(tmp)
- - : "r"(x), "r"(v)
- - : "cc", "memory" );
- - return new-v;
- -}
- -
- -static inline void a_inc(volatile int *x)
- -{
- - a_fetch_add(x, 1);
- -}
- -
- -static inline void a_dec(volatile int *x)
- -{
- - a_fetch_add(x, -1);
- -}
- -
- -static inline void a_store(volatile int *p, int x)
- -{
- - __asm__ __volatile__ (
- - "swi %1, %0"
- - : "=m"(*p) : "r"(x) : "memory" );
- -}
- -
- -#define a_spin a_barrier
- -
- -static inline void a_barrier()
- -{
- - a_cas(&(int){0}, 0, 0);
- -}
- -
- -static inline void a_crash()
- -{
- - *(volatile char *)0=0;
- -}
- -
- -static inline void a_and(volatile int *p, int v)
- -{
- - int old;
- - do old = *p;
- - while (a_cas(p, old, old&v) != old);
- -}
- -
- -static inline void a_or(volatile int *p, int v)
- -{
- - int old;
- - do old = *p;
- - while (a_cas(p, old, old|v) != old);
- -}
- -
- -static inline void a_or_l(volatile void *p, long v)
- -{
- - a_or(p, v);
- -}
- -
- -static inline void a_and_64(volatile uint64_t *p, uint64_t v)
- -{
- - union { uint64_t v; uint32_t r[2]; } u = { v };
- - a_and((int *)p, u.r[0]);
- - a_and((int *)p+1, u.r[1]);
- -}
- -
- -static inline void a_or_64(volatile uint64_t *p, uint64_t v)
- -{
- - union { uint64_t v; uint32_t r[2]; } u = { v };
- - a_or((int *)p, u.r[0]);
- - a_or((int *)p+1, u.r[1]);
- -}
- -
- -#endif
- --- /dev/null
- +++ b/arch/microblaze/atomic_arch.h
- @@ -0,0 +1,53 @@
- +#define a_cas a_cas
- +static inline int a_cas(volatile int *p, int t, int s)
- +{
- + register int old, tmp;
- + __asm__ __volatile__ (
- + " addi %0, r0, 0\n"
- + "1: lwx %0, %2, r0\n"
- + " rsubk %1, %0, %3\n"
- + " bnei %1, 1f\n"
- + " swx %4, %2, r0\n"
- + " addic %1, r0, 0\n"
- + " bnei %1, 1b\n"
- + "1: "
- + : "=&r"(old), "=&r"(tmp)
- + : "r"(p), "r"(t), "r"(s)
- + : "cc", "memory" );
- + return old;
- +}
- +
- +#define a_swap a_swap
- +static inline int a_swap(volatile int *x, int v)
- +{
- + register int old, tmp;
- + __asm__ __volatile__ (
- + " addi %0, r0, 0\n"
- + "1: lwx %0, %2, r0\n"
- + " swx %3, %2, r0\n"
- + " addic %1, r0, 0\n"
- + " bnei %1, 1b\n"
- + "1: "
- + : "=&r"(old), "=&r"(tmp)
- + : "r"(x), "r"(v)
- + : "cc", "memory" );
- + return old;
- +}
- +
- +#define a_fetch_add a_fetch_add
- +static inline int a_fetch_add(volatile int *x, int v)
- +{
- + register int new, tmp;
- + __asm__ __volatile__ (
- + " addi %0, r0, 0\n"
- + "1: lwx %0, %2, r0\n"
- + " addk %0, %0, %3\n"
- + " swx %0, %2, r0\n"
- + " addic %1, r0, 0\n"
- + " bnei %1, 1b\n"
- + "1: "
- + : "=&r"(new), "=&r"(tmp)
- + : "r"(x), "r"(v)
- + : "cc", "memory" );
- + return new-v;
- +}
- --- a/arch/microblaze/bits/errno.h
- +++ /dev/null
- @@ -1,134 +0,0 @@
- -#define EPERM 1
- -#define ENOENT 2
- -#define ESRCH 3
- -#define EINTR 4
- -#define EIO 5
- -#define ENXIO 6
- -#define E2BIG 7
- -#define ENOEXEC 8
- -#define EBADF 9
- -#define ECHILD 10
- -#define EAGAIN 11
- -#define ENOMEM 12
- -#define EACCES 13
- -#define EFAULT 14
- -#define ENOTBLK 15
- -#define EBUSY 16
- -#define EEXIST 17
- -#define EXDEV 18
- -#define ENODEV 19
- -#define ENOTDIR 20
- -#define EISDIR 21
- -#define EINVAL 22
- -#define ENFILE 23
- -#define EMFILE 24
- -#define ENOTTY 25
- -#define ETXTBSY 26
- -#define EFBIG 27
- -#define ENOSPC 28
- -#define ESPIPE 29
- -#define EROFS 30
- -#define EMLINK 31
- -#define EPIPE 32
- -#define EDOM 33
- -#define ERANGE 34
- -#define EDEADLK 35
- -#define ENAMETOOLONG 36
- -#define ENOLCK 37
- -#define ENOSYS 38
- -#define ENOTEMPTY 39
- -#define ELOOP 40
- -#define EWOULDBLOCK EAGAIN
- -#define ENOMSG 42
- -#define EIDRM 43
- -#define ECHRNG 44
- -#define EL2NSYNC 45
- -#define EL3HLT 46
- -#define EL3RST 47
- -#define ELNRNG 48
- -#define EUNATCH 49
- -#define ENOCSI 50
- -#define EL2HLT 51
- -#define EBADE 52
- -#define EBADR 53
- -#define EXFULL 54
- -#define ENOANO 55
- -#define EBADRQC 56
- -#define EBADSLT 57
- -#define EDEADLOCK EDEADLK
- -#define EBFONT 59
- -#define ENOSTR 60
- -#define ENODATA 61
- -#define ETIME 62
- -#define ENOSR 63
- -#define ENONET 64
- -#define ENOPKG 65
- -#define EREMOTE 66
- -#define ENOLINK 67
- -#define EADV 68
- -#define ESRMNT 69
- -#define ECOMM 70
- -#define EPROTO 71
- -#define EMULTIHOP 72
- -#define EDOTDOT 73
- -#define EBADMSG 74
- -#define EOVERFLOW 75
- -#define ENOTUNIQ 76
- -#define EBADFD 77
- -#define EREMCHG 78
- -#define ELIBACC 79
- -#define ELIBBAD 80
- -#define ELIBSCN 81
- -#define ELIBMAX 82
- -#define ELIBEXEC 83
- -#define EILSEQ 84
- -#define ERESTART 85
- -#define ESTRPIPE 86
- -#define EUSERS 87
- -#define ENOTSOCK 88
- -#define EDESTADDRREQ 89
- -#define EMSGSIZE 90
- -#define EPROTOTYPE 91
- -#define ENOPROTOOPT 92
- -#define EPROTONOSUPPORT 93
- -#define ESOCKTNOSUPPORT 94
- -#define EOPNOTSUPP 95
- -#define ENOTSUP EOPNOTSUPP
- -#define EPFNOSUPPORT 96
- -#define EAFNOSUPPORT 97
- -#define EADDRINUSE 98
- -#define EADDRNOTAVAIL 99
- -#define ENETDOWN 100
- -#define ENETUNREACH 101
- -#define ENETRESET 102
- -#define ECONNABORTED 103
- -#define ECONNRESET 104
- -#define ENOBUFS 105
- -#define EISCONN 106
- -#define ENOTCONN 107
- -#define ESHUTDOWN 108
- -#define ETOOMANYREFS 109
- -#define ETIMEDOUT 110
- -#define ECONNREFUSED 111
- -#define EHOSTDOWN 112
- -#define EHOSTUNREACH 113
- -#define EALREADY 114
- -#define EINPROGRESS 115
- -#define ESTALE 116
- -#define EUCLEAN 117
- -#define ENOTNAM 118
- -#define ENAVAIL 119
- -#define EISNAM 120
- -#define EREMOTEIO 121
- -#define EDQUOT 122
- -#define ENOMEDIUM 123
- -#define EMEDIUMTYPE 124
- -#define ECANCELED 125
- -#define ENOKEY 126
- -#define EKEYEXPIRED 127
- -#define EKEYREVOKED 128
- -#define EKEYREJECTED 129
- -#define EOWNERDEAD 130
- -#define ENOTRECOVERABLE 131
- -#define ERFKILL 132
- -#define EHWPOISON 133
- --- a/arch/microblaze/bits/fcntl.h
- +++ /dev/null
- @@ -1,40 +0,0 @@
- -#define O_CREAT 0100
- -#define O_EXCL 0200
- -#define O_NOCTTY 0400
- -#define O_TRUNC 01000
- -#define O_APPEND 02000
- -#define O_NONBLOCK 04000
- -#define O_DSYNC 010000
- -#define O_SYNC 04010000
- -#define O_RSYNC 04010000
- -#define O_DIRECTORY 0200000
- -#define O_NOFOLLOW 0400000
- -#define O_CLOEXEC 02000000
- -
- -#define O_ASYNC 020000
- -#define O_DIRECT 040000
- -#define O_LARGEFILE 0100000
- -#define O_NOATIME 01000000
- -#define O_PATH 010000000
- -#define O_TMPFILE 020200000
- -#define O_NDELAY O_NONBLOCK
- -
- -#define F_DUPFD 0
- -#define F_GETFD 1
- -#define F_SETFD 2
- -#define F_GETFL 3
- -#define F_SETFL 4
- -
- -#define F_SETOWN 8
- -#define F_GETOWN 9
- -#define F_SETSIG 10
- -#define F_GETSIG 11
- -
- -#define F_GETLK 12
- -#define F_SETLK 13
- -#define F_SETLKW 14
- -
- -#define F_SETOWN_EX 15
- -#define F_GETOWN_EX 16
- -
- -#define F_GETOWNER_UIDS 17
- --- a/arch/microblaze/bits/fenv.h
- +++ /dev/null
- @@ -1,10 +0,0 @@
- -#define FE_ALL_EXCEPT 0
- -#define FE_TONEAREST 0
- -
- -typedef unsigned long fexcept_t;
- -
- -typedef struct {
- - unsigned long __cw;
- -} fenv_t;
- -
- -#define FE_DFL_ENV ((const fenv_t *) -1)
- --- a/arch/microblaze/bits/ioctl.h
- +++ /dev/null
- @@ -1,197 +0,0 @@
- -#define _IOC(a,b,c,d) ( ((a)<<30) | ((b)<<8) | (c) | ((d)<<16) )
- -#define _IOC_NONE 0U
- -#define _IOC_WRITE 1U
- -#define _IOC_READ 2U
- -
- -#define _IO(a,b) _IOC(_IOC_NONE,(a),(b),0)
- -#define _IOW(a,b,c) _IOC(_IOC_WRITE,(a),(b),sizeof(c))
- -#define _IOR(a,b,c) _IOC(_IOC_READ,(a),(b),sizeof(c))
- -#define _IOWR(a,b,c) _IOC(_IOC_READ|_IOC_WRITE,(a),(b),sizeof(c))
- -
- -#define TCGETS 0x5401
- -#define TCSETS 0x5402
- -#define TCSETSW 0x5403
- -#define TCSETSF 0x5404
- -#define TCGETA 0x5405
- -#define TCSETA 0x5406
- -#define TCSETAW 0x5407
- -#define TCSETAF 0x5408
- -#define TCSBRK 0x5409
- -#define TCXONC 0x540A
- -#define TCFLSH 0x540B
- -#define TIOCEXCL 0x540C
- -#define TIOCNXCL 0x540D
- -#define TIOCSCTTY 0x540E
- -#define TIOCGPGRP 0x540F
- -#define TIOCSPGRP 0x5410
- -#define TIOCOUTQ 0x5411
- -#define TIOCSTI 0x5412
- -#define TIOCGWINSZ 0x5413
- -#define TIOCSWINSZ 0x5414
- -#define TIOCMGET 0x5415
- -#define TIOCMBIS 0x5416
- -#define TIOCMBIC 0x5417
- -#define TIOCMSET 0x5418
- -#define TIOCGSOFTCAR 0x5419
- -#define TIOCSSOFTCAR 0x541A
- -#define FIONREAD 0x541B
- -#define TIOCINQ FIONREAD
- -#define TIOCLINUX 0x541C
- -#define TIOCCONS 0x541D
- -#define TIOCGSERIAL 0x541E
- -#define TIOCSSERIAL 0x541F
- -#define TIOCPKT 0x5420
- -#define FIONBIO 0x5421
- -#define TIOCNOTTY 0x5422
- -#define TIOCSETD 0x5423
- -#define TIOCGETD 0x5424
- -#define TCSBRKP 0x5425
- -#define TIOCTTYGSTRUCT 0x5426
- -#define TIOCSBRK 0x5427
- -#define TIOCCBRK 0x5428
- -#define TIOCGSID 0x5429
- -#define TIOCGPTN 0x80045430
- -#define TIOCSPTLCK 0x40045431
- -#define TCGETX 0x5432
- -#define TCSETX 0x5433
- -#define TCSETXF 0x5434
- -#define TCSETXW 0x5435
- -
- -#define FIONCLEX 0x5450
- -#define FIOCLEX 0x5451
- -#define FIOASYNC 0x5452
- -#define TIOCSERCONFIG 0x5453
- -#define TIOCSERGWILD 0x5454
- -#define TIOCSERSWILD 0x5455
- -#define TIOCGLCKTRMIOS 0x5456
- -#define TIOCSLCKTRMIOS 0x5457
- -#define TIOCSERGSTRUCT 0x5458
- -#define TIOCSERGETLSR 0x5459
- -#define TIOCSERGETMULTI 0x545A
- -#define TIOCSERSETMULTI 0x545B
- -
- -#define TIOCMIWAIT 0x545C
- -#define TIOCGICOUNT 0x545D
- -#define TIOCGHAYESESP 0x545E
- -#define TIOCSHAYESESP 0x545F
- -#define FIOQSIZE 0x5460
- -
- -#define TIOCPKT_DATA 0
- -#define TIOCPKT_FLUSHREAD 1
- -#define TIOCPKT_FLUSHWRITE 2
- -#define TIOCPKT_STOP 4
- -#define TIOCPKT_START 8
- -#define TIOCPKT_NOSTOP 16
- -#define TIOCPKT_DOSTOP 32
- -#define TIOCPKT_IOCTL 64
- -
- -#define TIOCSER_TEMT 0x01
- -
- -struct winsize {
- - unsigned short ws_row;
- - unsigned short ws_col;
- - unsigned short ws_xpixel;
- - unsigned short ws_ypixel;
- -};
- -
- -#define TIOCM_LE 0x001
- -#define TIOCM_DTR 0x002
- -#define TIOCM_RTS 0x004
- -#define TIOCM_ST 0x008
- -#define TIOCM_SR 0x010
- -#define TIOCM_CTS 0x020
- -#define TIOCM_CAR 0x040
- -#define TIOCM_RNG 0x080
- -#define TIOCM_DSR 0x100
- -#define TIOCM_CD TIOCM_CAR
- -#define TIOCM_RI TIOCM_RNG
- -#define TIOCM_OUT1 0x2000
- -#define TIOCM_OUT2 0x4000
- -#define TIOCM_LOOP 0x8000
- -#define TIOCM_MODEM_BITS TIOCM_OUT2
- -
- -#define N_TTY 0
- -#define N_SLIP 1
- -#define N_MOUSE 2
- -#define N_PPP 3
- -#define N_STRIP 4
- -#define N_AX25 5
- -#define N_X25 6
- -#define N_6PACK 7
- -#define N_MASC 8
- -#define N_R3964 9
- -#define N_PROFIBUS_FDL 10
- -#define N_IRDA 11
- -#define N_SMSBLOCK 12
- -#define N_HDLC 13
- -#define N_SYNC_PPP 14
- -#define N_HCI 15
- -
- -#define FIOSETOWN 0x8901
- -#define SIOCSPGRP 0x8902
- -#define FIOGETOWN 0x8903
- -#define SIOCGPGRP 0x8904
- -#define SIOCATMARK 0x8905
- -#define SIOCGSTAMP 0x8906
- -
- -#define SIOCADDRT 0x890B
- -#define SIOCDELRT 0x890C
- -#define SIOCRTMSG 0x890D
- -
- -#define SIOCGIFNAME 0x8910
- -#define SIOCSIFLINK 0x8911
- -#define SIOCGIFCONF 0x8912
- -#define SIOCGIFFLAGS 0x8913
- -#define SIOCSIFFLAGS 0x8914
- -#define SIOCGIFADDR 0x8915
- -#define SIOCSIFADDR 0x8916
- -#define SIOCGIFDSTADDR 0x8917
- -#define SIOCSIFDSTADDR 0x8918
- -#define SIOCGIFBRDADDR 0x8919
- -#define SIOCSIFBRDADDR 0x891a
- -#define SIOCGIFNETMASK 0x891b
- -#define SIOCSIFNETMASK 0x891c
- -#define SIOCGIFMETRIC 0x891d
- -#define SIOCSIFMETRIC 0x891e
- -#define SIOCGIFMEM 0x891f
- -#define SIOCSIFMEM 0x8920
- -#define SIOCGIFMTU 0x8921
- -#define SIOCSIFMTU 0x8922
- -#define SIOCSIFHWADDR 0x8924
- -#define SIOCGIFENCAP 0x8925
- -#define SIOCSIFENCAP 0x8926
- -#define SIOCGIFHWADDR 0x8927
- -#define SIOCGIFSLAVE 0x8929
- -#define SIOCSIFSLAVE 0x8930
- -#define SIOCADDMULTI 0x8931
- -#define SIOCDELMULTI 0x8932
- -#define SIOCGIFINDEX 0x8933
- -#define SIOGIFINDEX SIOCGIFINDEX
- -#define SIOCSIFPFLAGS 0x8934
- -#define SIOCGIFPFLAGS 0x8935
- -#define SIOCDIFADDR 0x8936
- -#define SIOCSIFHWBROADCAST 0x8937
- -#define SIOCGIFCOUNT 0x8938
- -
- -#define SIOCGIFBR 0x8940
- -#define SIOCSIFBR 0x8941
- -
- -#define SIOCGIFTXQLEN 0x8942
- -#define SIOCSIFTXQLEN 0x8943
- -
- -#define SIOCDARP 0x8953
- -#define SIOCGARP 0x8954
- -#define SIOCSARP 0x8955
- -
- -#define SIOCDRARP 0x8960
- -#define SIOCGRARP 0x8961
- -#define SIOCSRARP 0x8962
- -
- -#define SIOCGIFMAP 0x8970
- -#define SIOCSIFMAP 0x8971
- -
- -#define SIOCADDDLCI 0x8980
- -#define SIOCDELDLCI 0x8981
- -
- -#define SIOCDEVPRIVATE 0x89F0
- -#define SIOCPROTOPRIVATE 0x89E0
- --- a/arch/microblaze/bits/ipc.h
- +++ /dev/null
- @@ -1,14 +0,0 @@
- -struct ipc_perm
- -{
- - key_t __ipc_perm_key;
- - uid_t uid;
- - gid_t gid;
- - uid_t cuid;
- - gid_t cgid;
- - mode_t mode;
- - int __ipc_perm_seq;
- - long __pad1;
- - long __pad2;
- -};
- -
- -#define IPC_64 0x100
- --- a/arch/microblaze/bits/mman.h
- +++ b/arch/microblaze/bits/mman.h
- @@ -37,6 +37,7 @@
-
- #define MCL_CURRENT 1
- #define MCL_FUTURE 2
- +#define MCL_ONFAULT 4
-
- #if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
- #define MADV_NORMAL 0
- --- a/arch/microblaze/bits/msg.h
- +++ /dev/null
- @@ -1,16 +0,0 @@
- -struct msqid_ds
- -{
- - struct ipc_perm msg_perm;
- - time_t msg_stime;
- - int __unused1;
- - time_t msg_rtime;
- - int __unused2;
- - time_t msg_ctime;
- - int __unused3;
- - unsigned long msg_cbytes;
- - msgqnum_t msg_qnum;
- - msglen_t msg_qbytes;
- - pid_t msg_lspid;
- - pid_t msg_lrpid;
- - unsigned long __unused[2];
- -};
- --- a/arch/microblaze/bits/sem.h
- +++ /dev/null
- @@ -1,16 +0,0 @@
- -struct semid_ds {
- - struct ipc_perm sem_perm;
- - time_t sem_otime;
- - time_t __unused1;
- - time_t sem_ctime;
- - time_t __unused2;
- -#if __BYTE_ORDER == __LITTLE_ENDIAN
- - unsigned short sem_nsems;
- - char __sem_nsems_pad[sizeof(time_t)-sizeof(short)];
- -#else
- - char __sem_nsems_pad[sizeof(time_t)-sizeof(short)];
- - unsigned short sem_nsems;
- -#endif
- - time_t __unused3;
- - time_t __unused4;
- -};
- --- a/arch/microblaze/bits/shm.h
- +++ /dev/null
- @@ -1,29 +0,0 @@
- -#define SHMLBA 4096
- -
- -struct shmid_ds
- -{
- - struct ipc_perm shm_perm;
- - size_t shm_segsz;
- - time_t shm_atime;
- - int __unused1;
- - time_t shm_dtime;
- - int __unused2;
- - time_t shm_ctime;
- - int __unused3;
- - pid_t shm_cpid;
- - pid_t shm_lpid;
- - unsigned long shm_nattch;
- - unsigned long __pad1;
- - unsigned long __pad2;
- -};
- -
- -struct shminfo {
- - unsigned long shmmax, shmmin, shmmni, shmseg, shmall, __unused[4];
- -};
- -
- -struct shm_info {
- - int __used_ids;
- - unsigned long shm_tot, shm_rss, shm_swp;
- - unsigned long __swap_attempts, __swap_successes;
- -};
- -
- --- a/arch/microblaze/bits/socket.h
- +++ /dev/null
- @@ -1,17 +0,0 @@
- -struct msghdr
- -{
- - void *msg_name;
- - socklen_t msg_namelen;
- - struct iovec *msg_iov;
- - int msg_iovlen;
- - void *msg_control;
- - socklen_t msg_controllen;
- - int msg_flags;
- -};
- -
- -struct cmsghdr
- -{
- - socklen_t cmsg_len;
- - int cmsg_level;
- - int cmsg_type;
- -};
- --- a/arch/microblaze/bits/statfs.h
- +++ /dev/null
- @@ -1,7 +0,0 @@
- -struct statfs {
- - unsigned long f_type, f_bsize;
- - fsblkcnt_t f_blocks, f_bfree, f_bavail;
- - fsfilcnt_t f_files, f_ffree;
- - fsid_t f_fsid;
- - unsigned long f_namelen, f_frsize, f_flags, f_spare[4];
- -};
- --- a/arch/microblaze/bits/stdarg.h
- +++ /dev/null
- @@ -1,4 +0,0 @@
- -#define va_start(v,l) __builtin_va_start(v,l)
- -#define va_end(v) __builtin_va_end(v)
- -#define va_arg(v,l) __builtin_va_arg(v,l)
- -#define va_copy(d,s) __builtin_va_copy(d,s)
- --- a/arch/microblaze/bits/termios.h
- +++ /dev/null
- @@ -1,160 +0,0 @@
- -struct termios
- -{
- - tcflag_t c_iflag;
- - tcflag_t c_oflag;
- - tcflag_t c_cflag;
- - tcflag_t c_lflag;
- - cc_t c_line;
- - cc_t c_cc[NCCS];
- - speed_t __c_ispeed;
- - speed_t __c_ospeed;
- -};
- -
- -#define VINTR 0
- -#define VQUIT 1
- -#define VERASE 2
- -#define VKILL 3
- -#define VEOF 4
- -#define VTIME 5
- -#define VMIN 6
- -#define VSWTC 7
- -#define VSTART 8
- -#define VSTOP 9
- -#define VSUSP 10
- -#define VEOL 11
- -#define VREPRINT 12
- -#define VDISCARD 13
- -#define VWERASE 14
- -#define VLNEXT 15
- -#define VEOL2 16
- -
- -#define IGNBRK 0000001
- -#define BRKINT 0000002
- -#define IGNPAR 0000004
- -#define PARMRK 0000010
- -#define INPCK 0000020
- -#define ISTRIP 0000040
- -#define INLCR 0000100
- -#define IGNCR 0000200
- -#define ICRNL 0000400
- -#define IUCLC 0001000
- -#define IXON 0002000
- -#define IXANY 0004000
- -#define IXOFF 0010000
- -#define IMAXBEL 0020000
- -#define IUTF8 0040000
- -
- -#define OPOST 0000001
- -#define OLCUC 0000002
- -#define ONLCR 0000004
- -#define OCRNL 0000010
- -#define ONOCR 0000020
- -#define ONLRET 0000040
- -#define OFILL 0000100
- -#define OFDEL 0000200
- -#define NLDLY 0000400
- -#define NL0 0000000
- -#define NL1 0000400
- -#define CRDLY 0003000
- -#define CR0 0000000
- -#define CR1 0001000
- -#define CR2 0002000
- -#define CR3 0003000
- -#define TABDLY 0014000
- -#define TAB0 0000000
- -#define TAB1 0004000
- -#define TAB2 0010000
- -#define TAB3 0014000
- -#define BSDLY 0020000
- -#define BS0 0000000
- -#define BS1 0020000
- -#define FFDLY 0100000
- -#define FF0 0000000
- -#define FF1 0100000
- -
- -#define VTDLY 0040000
- -#define VT0 0000000
- -#define VT1 0040000
- -
- -#define B0 0000000
- -#define B50 0000001
- -#define B75 0000002
- -#define B110 0000003
- -#define B134 0000004
- -#define B150 0000005
- -#define B200 0000006
- -#define B300 0000007
- -#define B600 0000010
- -#define B1200 0000011
- -#define B1800 0000012
- -#define B2400 0000013
- -#define B4800 0000014
- -#define B9600 0000015
- -#define B19200 0000016
- -#define B38400 0000017
- -
- -#define B57600 0010001
- -#define B115200 0010002
- -#define B230400 0010003
- -#define B460800 0010004
- -#define B500000 0010005
- -#define B576000 0010006
- -#define B921600 0010007
- -#define B1000000 0010010
- -#define B1152000 0010011
- -#define B1500000 0010012
- -#define B2000000 0010013
- -#define B2500000 0010014
- -#define B3000000 0010015
- -#define B3500000 0010016
- -#define B4000000 0010017
- -
- -#define CBAUD 0010017
- -
- -#define CSIZE 0000060
- -#define CS5 0000000
- -#define CS6 0000020
- -#define CS7 0000040
- -#define CS8 0000060
- -#define CSTOPB 0000100
- -#define CREAD 0000200
- -#define PARENB 0000400
- -#define PARODD 0001000
- -#define HUPCL 0002000
- -#define CLOCAL 0004000
- -
- -#define ISIG 0000001
- -#define ICANON 0000002
- -#define ECHO 0000010
- -#define ECHOE 0000020
- -#define ECHOK 0000040
- -#define ECHONL 0000100
- -#define NOFLSH 0000200
- -#define TOSTOP 0000400
- -#define IEXTEN 0100000
- -
- -#define ECHOCTL 0001000
- -#define ECHOPRT 0002000
- -#define ECHOKE 0004000
- -#define FLUSHO 0010000
- -#define PENDIN 0040000
- -
- -#define TCOOFF 0
- -#define TCOON 1
- -#define TCIOFF 2
- -#define TCION 3
- -
- -#define TCIFLUSH 0
- -#define TCOFLUSH 1
- -#define TCIOFLUSH 2
- -
- -#define TCSANOW 0
- -#define TCSADRAIN 1
- -#define TCSAFLUSH 2
- -
- -#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
- -#define CBAUDEX 0010000
- -#define CRTSCTS 020000000000
- -#define EXTPROC 0200000
- -#define XTABS 0014000
- -#endif
- --- a/arch/microblaze/pthread_arch.h
- +++ b/arch/microblaze/pthread_arch.h
- @@ -7,4 +7,4 @@ static inline struct pthread *__pthread_
-
- #define TP_ADJ(p) (p)
-
- -#define CANCEL_REG_IP 32
- +#define MC_PC regs.pc
- --- a/arch/mips/atomic.h
- +++ /dev/null
- @@ -1,205 +0,0 @@
- -#ifndef _INTERNAL_ATOMIC_H
- -#define _INTERNAL_ATOMIC_H
- -
- -#include <stdint.h>
- -
- -static inline int a_ctz_l(unsigned long x)
- -{
- - static const char debruijn32[32] = {
- - 0, 1, 23, 2, 29, 24, 19, 3, 30, 27, 25, 11, 20, 8, 4, 13,
- - 31, 22, 28, 18, 26, 10, 7, 12, 21, 17, 9, 6, 16, 5, 15, 14
- - };
- - return debruijn32[(x&-x)*0x076be629 >> 27];
- -}
- -
- -static inline int a_ctz_64(uint64_t x)
- -{
- - uint32_t y = x;
- - if (!y) {
- - y = x>>32;
- - return 32 + a_ctz_l(y);
- - }
- - return a_ctz_l(y);
- -}
- -
- -static inline int a_cas(volatile int *p, int t, int s)
- -{
- - int dummy;
- - __asm__ __volatile__(
- - ".set push\n"
- - ".set mips2\n"
- - ".set noreorder\n"
- - " sync\n"
- - "1: ll %0, %2\n"
- - " bne %0, %3, 1f\n"
- - " addu %1, %4, $0\n"
- - " sc %1, %2\n"
- - " beq %1, $0, 1b\n"
- - " nop\n"
- - " sync\n"
- - "1: \n"
- - ".set pop\n"
- - : "=&r"(t), "=&r"(dummy), "+m"(*p) : "r"(t), "r"(s) : "memory" );
- - return t;
- -}
- -
- -static inline void *a_cas_p(volatile void *p, void *t, void *s)
- -{
- - return (void *)a_cas(p, (int)t, (int)s);
- -}
- -
- -static inline int a_swap(volatile int *x, int v)
- -{
- - int old, dummy;
- - __asm__ __volatile__(
- - ".set push\n"
- - ".set mips2\n"
- - ".set noreorder\n"
- - " sync\n"
- - "1: ll %0, %2\n"
- - " addu %1, %3, $0\n"
- - " sc %1, %2\n"
- - " beq %1, $0, 1b\n"
- - " nop\n"
- - " sync\n"
- - ".set pop\n"
- - : "=&r"(old), "=&r"(dummy), "+m"(*x) : "r"(v) : "memory" );
- - return old;
- -}
- -
- -static inline int a_fetch_add(volatile int *x, int v)
- -{
- - int old, dummy;
- - __asm__ __volatile__(
- - ".set push\n"
- - ".set mips2\n"
- - ".set noreorder\n"
- - " sync\n"
- - "1: ll %0, %2\n"
- - " addu %1, %0, %3\n"
- - " sc %1, %2\n"
- - " beq %1, $0, 1b\n"
- - " nop\n"
- - " sync\n"
- - ".set pop\n"
- - : "=&r"(old), "=&r"(dummy), "+m"(*x) : "r"(v) : "memory" );
- - return old;
- -}
- -
- -static inline void a_inc(volatile int *x)
- -{
- - int dummy;
- - __asm__ __volatile__(
- - ".set push\n"
- - ".set mips2\n"
- - ".set noreorder\n"
- - " sync\n"
- - "1: ll %0, %1\n"
- - " addu %0, %0, 1\n"
- - " sc %0, %1\n"
- - " beq %0, $0, 1b\n"
- - " nop\n"
- - " sync\n"
- - ".set pop\n"
- - : "=&r"(dummy), "+m"(*x) : : "memory" );
- -}
- -
- -static inline void a_dec(volatile int *x)
- -{
- - int dummy;
- - __asm__ __volatile__(
- - ".set push\n"
- - ".set mips2\n"
- - ".set noreorder\n"
- - " sync\n"
- - "1: ll %0, %1\n"
- - " subu %0, %0, 1\n"
- - " sc %0, %1\n"
- - " beq %0, $0, 1b\n"
- - " nop\n"
- - " sync\n"
- - ".set pop\n"
- - : "=&r"(dummy), "+m"(*x) : : "memory" );
- -}
- -
- -static inline void a_store(volatile int *p, int x)
- -{
- - __asm__ __volatile__(
- - ".set push\n"
- - ".set mips2\n"
- - ".set noreorder\n"
- - " sync\n"
- - " sw %1, %0\n"
- - " sync\n"
- - ".set pop\n"
- - : "+m"(*p) : "r"(x) : "memory" );
- -}
- -
- -#define a_spin a_barrier
- -
- -static inline void a_barrier()
- -{
- - a_cas(&(int){0}, 0, 0);
- -}
- -
- -static inline void a_crash()
- -{
- - *(volatile char *)0=0;
- -}
- -
- -static inline void a_and(volatile int *p, int v)
- -{
- - int dummy;
- - __asm__ __volatile__(
- - ".set push\n"
- - ".set mips2\n"
- - ".set noreorder\n"
- - " sync\n"
- - "1: ll %0, %1\n"
- - " and %0, %0, %2\n"
- - " sc %0, %1\n"
- - " beq %0, $0, 1b\n"
- - " nop\n"
- - " sync\n"
- - ".set pop\n"
- - : "=&r"(dummy), "+m"(*p) : "r"(v) : "memory" );
- -}
- -
- -static inline void a_or(volatile int *p, int v)
- -{
- - int dummy;
- - __asm__ __volatile__(
- - ".set push\n"
- - ".set mips2\n"
- - ".set noreorder\n"
- - " sync\n"
- - "1: ll %0, %1\n"
- - " or %0, %0, %2\n"
- - " sc %0, %1\n"
- - " beq %0, $0, 1b\n"
- - " nop\n"
- - " sync\n"
- - ".set pop\n"
- - : "=&r"(dummy), "+m"(*p) : "r"(v) : "memory" );
- -}
- -
- -static inline void a_or_l(volatile void *p, long v)
- -{
- - a_or(p, v);
- -}
- -
- -static inline void a_and_64(volatile uint64_t *p, uint64_t v)
- -{
- - union { uint64_t v; uint32_t r[2]; } u = { v };
- - a_and((int *)p, u.r[0]);
- - a_and((int *)p+1, u.r[1]);
- -}
- -
- -static inline void a_or_64(volatile uint64_t *p, uint64_t v)
- -{
- - union { uint64_t v; uint32_t r[2]; } u = { v };
- - a_or((int *)p, u.r[0]);
- - a_or((int *)p+1, u.r[1]);
- -}
- -
- -#endif
- --- /dev/null
- +++ b/arch/mips/atomic_arch.h
- @@ -0,0 +1,39 @@
- +#define a_ll a_ll
- +static inline int a_ll(volatile int *p)
- +{
- + int v;
- + __asm__ __volatile__ (
- + ".set push ; .set mips2\n\t"
- + "ll %0, %1"
- + "\n\t.set pop"
- + : "=r"(v) : "m"(*p));
- + return v;
- +}
- +
- +#define a_sc a_sc
- +static inline int a_sc(volatile int *p, int v)
- +{
- + int r;
- + __asm__ __volatile__ (
- + ".set push ; .set mips2\n\t"
- + "sc %0, %1"
- + "\n\t.set pop"
- + : "=r"(r), "=m"(*p) : "0"(v) : "memory");
- + return r;
- +}
- +
- +#define a_barrier a_barrier
- +static inline void a_barrier()
- +{
- + /* mips2 sync, but using too many directives causes
- + * gcc not to inline it, so encode with .long instead. */
- + __asm__ __volatile__ (".long 0xf" : : : "memory");
- +#if 0
- + __asm__ __volatile__ (
- + ".set push ; .set mips2 ; sync ; .set pop"
- + : : : "memory");
- +#endif
- +}
- +
- +#define a_pre_llsc a_barrier
- +#define a_post_llsc a_barrier
- --- a/arch/mips/bits/ipc.h
- +++ /dev/null
- @@ -1,14 +0,0 @@
- -struct ipc_perm
- -{
- - key_t __ipc_perm_key;
- - uid_t uid;
- - gid_t gid;
- - uid_t cuid;
- - gid_t cgid;
- - mode_t mode;
- - int __ipc_perm_seq;
- - long __pad1;
- - long __pad2;
- -};
- -
- -#define IPC_64 0x100
- --- a/arch/mips/bits/mman.h
- +++ b/arch/mips/bits/mman.h
- @@ -37,6 +37,7 @@
-
- #define MCL_CURRENT 1
- #define MCL_FUTURE 2
- +#define MCL_ONFAULT 4
-
- #if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
- #define MADV_NORMAL 0
- --- a/arch/mips/bits/signal.h
- +++ b/arch/mips/bits/signal.h
- @@ -73,6 +73,15 @@ typedef struct __ucontext {
- #define SIG_UNBLOCK 2
- #define SIG_SETMASK 3
-
- +#undef SI_ASYNCIO
- +#undef SI_MESGQ
- +#undef SI_TIMER
- +#define SI_ASYNCIO (-2)
- +#define SI_MESGQ (-4)
- +#define SI_TIMER (-3)
- +
- +#define __SI_SWAP_ERRNO_CODE
- +
- #endif
-
- #define SIGHUP 1
- --- a/arch/mips/bits/stdarg.h
- +++ /dev/null
- @@ -1,4 +0,0 @@
- -#define va_start(v,l) __builtin_va_start(v,l)
- -#define va_end(v) __builtin_va_end(v)
- -#define va_arg(v,l) __builtin_va_arg(v,l)
- -#define va_copy(d,s) __builtin_va_copy(d,s)
- --- a/arch/mips/bits/syscall.h
- +++ b/arch/mips/bits/syscall.h
- @@ -354,6 +354,9 @@
- #define __NR_memfd_create 4354
- #define __NR_bpf 4355
- #define __NR_execveat 4356
- +#define __NR_userfaultfd 4357
- +#define __NR_membarrier 4358
- +#define __NR_mlock2 4359
-
-
- /* Repeated with SYS_ prefix */
- @@ -713,3 +716,6 @@
- #define SYS_memfd_create 4354
- #define SYS_bpf 4355
- #define SYS_execveat 4356
- +#define SYS_userfaultfd 4357
- +#define SYS_membarrier 4358
- +#define SYS_mlock2 4359
- --- a/arch/mips/crt_arch.h
- +++ b/arch/mips/crt_arch.h
- @@ -4,13 +4,16 @@ __asm__(
- ".text \n"
- ".global _" START "\n"
- ".global " START "\n"
- +".global " START "_data\n"
- ".type _" START ", @function\n"
- ".type " START ", @function\n"
- +".type " START "_data, @function\n"
- "_" START ":\n"
- "" START ":\n"
- " bal 1f \n"
- " move $fp, $0 \n"
- -"2: .gpword 2b \n"
- +"" START "_data: \n"
- +" .gpword " START "_data \n"
- " .gpword " START "_c \n"
- ".weak _DYNAMIC \n"
- ".hidden _DYNAMIC \n"
- --- a/arch/mips/pthread_arch.h
- +++ b/arch/mips/pthread_arch.h
- @@ -16,4 +16,4 @@ static inline struct pthread *__pthread_
-
- #define DTP_OFFSET 0x8000
-
- -#define CANCEL_REG_IP (3-(union {int __i; char __b;}){1}.__b)
- +#define MC_PC pc
- --- a/arch/mips/syscall_arch.h
- +++ b/arch/mips/syscall_arch.h
- @@ -3,9 +3,7 @@
- ((union { long long ll; long l[2]; }){ .ll = x }).l[1]
- #define __SYSCALL_LL_O(x) 0, __SYSCALL_LL_E((x))
-
- -#ifdef SHARED
- __attribute__((visibility("hidden")))
- -#endif
- long (__syscall)(long, ...);
-
- #define SYSCALL_RLIM_INFINITY (-1UL/2)
- @@ -163,3 +161,7 @@ static inline long __syscall6(long n, lo
- if (n == SYS_fstatat) __stat_fix(c);
- return r2;
- }
- +
- +#define VDSO_USEFUL
- +#define VDSO_CGT_SYM "__vdso_clock_gettime"
- +#define VDSO_CGT_VER "LINUX_2.6"
- --- a/arch/or1k/atomic.h
- +++ /dev/null
- @@ -1,120 +0,0 @@
- -#ifndef _INTERNAL_ATOMIC_H
- -#define _INTERNAL_ATOMIC_H
- -
- -#include <stdint.h>
- -
- -static inline int a_ctz_l(unsigned long x)
- -{
- - static const char debruijn32[32] = {
- - 0, 1, 23, 2, 29, 24, 19, 3, 30, 27, 25, 11, 20, 8, 4, 13,
- - 31, 22, 28, 18, 26, 10, 7, 12, 21, 17, 9, 6, 16, 5, 15, 14
- - };
- - return debruijn32[(x&-x)*0x076be629 >> 27];
- -}
- -
- -static inline int a_ctz_64(uint64_t x)
- -{
- - uint32_t y = x;
- - if (!y) {
- - y = x>>32;
- - return 32 + a_ctz_l(y);
- - }
- - return a_ctz_l(y);
- -}
- -
- -static inline int a_cas(volatile int *p, int t, int s)
- -{
- - __asm__("1: l.lwa %0, %1\n"
- - " l.sfeq %0, %2\n"
- - " l.bnf 1f\n"
- - " l.nop\n"
- - " l.swa %1, %3\n"
- - " l.bnf 1b\n"
- - " l.nop\n"
- - "1: \n"
- - : "=&r"(t), "+m"(*p) : "r"(t), "r"(s) : "cc", "memory" );
- - return t;
- -}
- -
- -static inline void *a_cas_p(volatile void *p, void *t, void *s)
- -{
- - return (void *)a_cas(p, (int)t, (int)s);
- -}
- -
- -static inline int a_swap(volatile int *x, int v)
- -{
- - int old;
- - do old = *x;
- - while (a_cas(x, old, v) != old);
- - return old;
- -}
- -
- -static inline int a_fetch_add(volatile int *x, int v)
- -{
- - int old;
- - do old = *x;
- - while (a_cas(x, old, old+v) != old);
- - return old;
- -}
- -
- -static inline void a_inc(volatile int *x)
- -{
- - a_fetch_add(x, 1);
- -}
- -
- -static inline void a_dec(volatile int *x)
- -{
- - a_fetch_add(x, -1);
- -}
- -
- -static inline void a_store(volatile int *p, int x)
- -{
- - a_swap(p, x);
- -}
- -
- -#define a_spin a_barrier
- -
- -static inline void a_barrier()
- -{
- - a_cas(&(int){0}, 0, 0);
- -}
- -
- -static inline void a_crash()
- -{
- - *(volatile char *)0=0;
- -}
- -
- -static inline void a_and(volatile int *p, int v)
- -{
- - int old;
- - do old = *p;
- - while (a_cas(p, old, old&v) != old);
- -}
- -
- -static inline void a_or(volatile int *p, int v)
- -{
- - int old;
- - do old = *p;
- - while (a_cas(p, old, old|v) != old);
- -}
- -
- -static inline void a_or_l(volatile void *p, long v)
- -{
- - a_or(p, v);
- -}
- -
- -static inline void a_and_64(volatile uint64_t *p, uint64_t v)
- -{
- - union { uint64_t v; uint32_t r[2]; } u = { v };
- - a_and((int *)p, u.r[0]);
- - a_and((int *)p+1, u.r[1]);
- -}
- -
- -static inline void a_or_64(volatile uint64_t *p, uint64_t v)
- -{
- - union { uint64_t v; uint32_t r[2]; } u = { v };
- - a_or((int *)p, u.r[0]);
- - a_or((int *)p+1, u.r[1]);
- -}
- -
- -#endif
- --- /dev/null
- +++ b/arch/or1k/atomic_arch.h
- @@ -0,0 +1,14 @@
- +#define a_cas a_cas
- +static inline int a_cas(volatile int *p, int t, int s)
- +{
- + __asm__("1: l.lwa %0, %1\n"
- + " l.sfeq %0, %2\n"
- + " l.bnf 1f\n"
- + " l.nop\n"
- + " l.swa %1, %3\n"
- + " l.bnf 1b\n"
- + " l.nop\n"
- + "1: \n"
- + : "=&r"(t), "+m"(*p) : "r"(t), "r"(s) : "cc", "memory" );
- + return t;
- +}
- --- a/arch/or1k/bits/errno.h
- +++ /dev/null
- @@ -1,134 +0,0 @@
- -#define EPERM 1
- -#define ENOENT 2
- -#define ESRCH 3
- -#define EINTR 4
- -#define EIO 5
- -#define ENXIO 6
- -#define E2BIG 7
- -#define ENOEXEC 8
- -#define EBADF 9
- -#define ECHILD 10
- -#define EAGAIN 11
- -#define ENOMEM 12
- -#define EACCES 13
- -#define EFAULT 14
- -#define ENOTBLK 15
- -#define EBUSY 16
- -#define EEXIST 17
- -#define EXDEV 18
- -#define ENODEV 19
- -#define ENOTDIR 20
- -#define EISDIR 21
- -#define EINVAL 22
- -#define ENFILE 23
- -#define EMFILE 24
- -#define ENOTTY 25
- -#define ETXTBSY 26
- -#define EFBIG 27
- -#define ENOSPC 28
- -#define ESPIPE 29
- -#define EROFS 30
- -#define EMLINK 31
- -#define EPIPE 32
- -#define EDOM 33
- -#define ERANGE 34
- -#define EDEADLK 35
- -#define ENAMETOOLONG 36
- -#define ENOLCK 37
- -#define ENOSYS 38
- -#define ENOTEMPTY 39
- -#define ELOOP 40
- -#define EWOULDBLOCK EAGAIN
- -#define ENOMSG 42
- -#define EIDRM 43
- -#define ECHRNG 44
- -#define EL2NSYNC 45
- -#define EL3HLT 46
- -#define EL3RST 47
- -#define ELNRNG 48
- -#define EUNATCH 49
- -#define ENOCSI 50
- -#define EL2HLT 51
- -#define EBADE 52
- -#define EBADR 53
- -#define EXFULL 54
- -#define ENOANO 55
- -#define EBADRQC 56
- -#define EBADSLT 57
- -#define EDEADLOCK EDEADLK
- -#define EBFONT 59
- -#define ENOSTR 60
- -#define ENODATA 61
- -#define ETIME 62
- -#define ENOSR 63
- -#define ENONET 64
- -#define ENOPKG 65
- -#define EREMOTE 66
- -#define ENOLINK 67
- -#define EADV 68
- -#define ESRMNT 69
- -#define ECOMM 70
- -#define EPROTO 71
- -#define EMULTIHOP 72
- -#define EDOTDOT 73
- -#define EBADMSG 74
- -#define EOVERFLOW 75
- -#define ENOTUNIQ 76
- -#define EBADFD 77
- -#define EREMCHG 78
- -#define ELIBACC 79
- -#define ELIBBAD 80
- -#define ELIBSCN 81
- -#define ELIBMAX 82
- -#define ELIBEXEC 83
- -#define EILSEQ 84
- -#define ERESTART 85
- -#define ESTRPIPE 86
- -#define EUSERS 87
- -#define ENOTSOCK 88
- -#define EDESTADDRREQ 89
- -#define EMSGSIZE 90
- -#define EPROTOTYPE 91
- -#define ENOPROTOOPT 92
- -#define EPROTONOSUPPORT 93
- -#define ESOCKTNOSUPPORT 94
- -#define EOPNOTSUPP 95
- -#define ENOTSUP EOPNOTSUPP
- -#define EPFNOSUPPORT 96
- -#define EAFNOSUPPORT 97
- -#define EADDRINUSE 98
- -#define EADDRNOTAVAIL 99
- -#define ENETDOWN 100
- -#define ENETUNREACH 101
- -#define ENETRESET 102
- -#define ECONNABORTED 103
- -#define ECONNRESET 104
- -#define ENOBUFS 105
- -#define EISCONN 106
- -#define ENOTCONN 107
- -#define ESHUTDOWN 108
- -#define ETOOMANYREFS 109
- -#define ETIMEDOUT 110
- -#define ECONNREFUSED 111
- -#define EHOSTDOWN 112
- -#define EHOSTUNREACH 113
- -#define EALREADY 114
- -#define EINPROGRESS 115
- -#define ESTALE 116
- -#define EUCLEAN 117
- -#define ENOTNAM 118
- -#define ENAVAIL 119
- -#define EISNAM 120
- -#define EREMOTEIO 121
- -#define EDQUOT 122
- -#define ENOMEDIUM 123
- -#define EMEDIUMTYPE 124
- -#define ECANCELED 125
- -#define ENOKEY 126
- -#define EKEYEXPIRED 127
- -#define EKEYREVOKED 128
- -#define EKEYREJECTED 129
- -#define EOWNERDEAD 130
- -#define ENOTRECOVERABLE 131
- -#define ERFKILL 132
- -#define EHWPOISON 133
- --- a/arch/or1k/bits/fcntl.h
- +++ /dev/null
- @@ -1,40 +0,0 @@
- -#define O_CREAT 0100
- -#define O_EXCL 0200
- -#define O_NOCTTY 0400
- -#define O_TRUNC 01000
- -#define O_APPEND 02000
- -#define O_NONBLOCK 04000
- -#define O_DSYNC 010000
- -#define O_SYNC 04010000
- -#define O_RSYNC 04010000
- -#define O_DIRECTORY 0200000
- -#define O_NOFOLLOW 0400000
- -#define O_CLOEXEC 02000000
- -
- -#define O_ASYNC 020000
- -#define O_DIRECT 040000
- -#define O_LARGEFILE 0100000
- -#define O_NOATIME 01000000
- -#define O_PATH 010000000
- -#define O_TMPFILE 020200000
- -#define O_NDELAY O_NONBLOCK
- -
- -#define F_DUPFD 0
- -#define F_GETFD 1
- -#define F_SETFD 2
- -#define F_GETFL 3
- -#define F_SETFL 4
- -
- -#define F_SETOWN 8
- -#define F_GETOWN 9
- -#define F_SETSIG 10
- -#define F_GETSIG 11
- -
- -#define F_GETLK 12
- -#define F_SETLK 13
- -#define F_SETLKW 14
- -
- -#define F_SETOWN_EX 15
- -#define F_GETOWN_EX 16
- -
- -#define F_GETOWNER_UIDS 17
- --- a/arch/or1k/bits/fenv.h
- +++ /dev/null
- @@ -1,10 +0,0 @@
- -#define FE_ALL_EXCEPT 0
- -#define FE_TONEAREST 0
- -
- -typedef unsigned long fexcept_t;
- -
- -typedef struct {
- - unsigned long __cw;
- -} fenv_t;
- -
- -#define FE_DFL_ENV ((const fenv_t *) -1)
- --- a/arch/or1k/bits/ioctl.h
- +++ /dev/null
- @@ -1,197 +0,0 @@
- -#define _IOC(a,b,c,d) ( ((a)<<30) | ((b)<<8) | (c) | ((d)<<16) )
- -#define _IOC_NONE 0U
- -#define _IOC_WRITE 1U
- -#define _IOC_READ 2U
- -
- -#define _IO(a,b) _IOC(_IOC_NONE,(a),(b),0)
- -#define _IOW(a,b,c) _IOC(_IOC_WRITE,(a),(b),sizeof(c))
- -#define _IOR(a,b,c) _IOC(_IOC_READ,(a),(b),sizeof(c))
- -#define _IOWR(a,b,c) _IOC(_IOC_READ|_IOC_WRITE,(a),(b),sizeof(c))
- -
- -#define TCGETS 0x5401
- -#define TCSETS 0x5402
- -#define TCSETSW 0x5403
- -#define TCSETSF 0x5404
- -#define TCGETA 0x5405
- -#define TCSETA 0x5406
- -#define TCSETAW 0x5407
- -#define TCSETAF 0x5408
- -#define TCSBRK 0x5409
- -#define TCXONC 0x540A
- -#define TCFLSH 0x540B
- -#define TIOCEXCL 0x540C
- -#define TIOCNXCL 0x540D
- -#define TIOCSCTTY 0x540E
- -#define TIOCGPGRP 0x540F
- -#define TIOCSPGRP 0x5410
- -#define TIOCOUTQ 0x5411
- -#define TIOCSTI 0x5412
- -#define TIOCGWINSZ 0x5413
- -#define TIOCSWINSZ 0x5414
- -#define TIOCMGET 0x5415
- -#define TIOCMBIS 0x5416
- -#define TIOCMBIC 0x5417
- -#define TIOCMSET 0x5418
- -#define TIOCGSOFTCAR 0x5419
- -#define TIOCSSOFTCAR 0x541A
- -#define FIONREAD 0x541B
- -#define TIOCINQ FIONREAD
- -#define TIOCLINUX 0x541C
- -#define TIOCCONS 0x541D
- -#define TIOCGSERIAL 0x541E
- -#define TIOCSSERIAL 0x541F
- -#define TIOCPKT 0x5420
- -#define FIONBIO 0x5421
- -#define TIOCNOTTY 0x5422
- -#define TIOCSETD 0x5423
- -#define TIOCGETD 0x5424
- -#define TCSBRKP 0x5425
- -#define TIOCTTYGSTRUCT 0x5426
- -#define TIOCSBRK 0x5427
- -#define TIOCCBRK 0x5428
- -#define TIOCGSID 0x5429
- -#define TIOCGPTN 0x80045430
- -#define TIOCSPTLCK 0x40045431
- -#define TCGETX 0x5432
- -#define TCSETX 0x5433
- -#define TCSETXF 0x5434
- -#define TCSETXW 0x5435
- -
- -#define FIONCLEX 0x5450
- -#define FIOCLEX 0x5451
- -#define FIOASYNC 0x5452
- -#define TIOCSERCONFIG 0x5453
- -#define TIOCSERGWILD 0x5454
- -#define TIOCSERSWILD 0x5455
- -#define TIOCGLCKTRMIOS 0x5456
- -#define TIOCSLCKTRMIOS 0x5457
- -#define TIOCSERGSTRUCT 0x5458
- -#define TIOCSERGETLSR 0x5459
- -#define TIOCSERGETMULTI 0x545A
- -#define TIOCSERSETMULTI 0x545B
- -
- -#define TIOCMIWAIT 0x545C
- -#define TIOCGICOUNT 0x545D
- -#define TIOCGHAYESESP 0x545E
- -#define TIOCSHAYESESP 0x545F
- -#define FIOQSIZE 0x5460
- -
- -#define TIOCPKT_DATA 0
- -#define TIOCPKT_FLUSHREAD 1
- -#define TIOCPKT_FLUSHWRITE 2
- -#define TIOCPKT_STOP 4
- -#define TIOCPKT_START 8
- -#define TIOCPKT_NOSTOP 16
- -#define TIOCPKT_DOSTOP 32
- -#define TIOCPKT_IOCTL 64
- -
- -#define TIOCSER_TEMT 0x01
- -
- -struct winsize {
- - unsigned short ws_row;
- - unsigned short ws_col;
- - unsigned short ws_xpixel;
- - unsigned short ws_ypixel;
- -};
- -
- -#define TIOCM_LE 0x001
- -#define TIOCM_DTR 0x002
- -#define TIOCM_RTS 0x004
- -#define TIOCM_ST 0x008
- -#define TIOCM_SR 0x010
- -#define TIOCM_CTS 0x020
- -#define TIOCM_CAR 0x040
- -#define TIOCM_RNG 0x080
- -#define TIOCM_DSR 0x100
- -#define TIOCM_CD TIOCM_CAR
- -#define TIOCM_RI TIOCM_RNG
- -#define TIOCM_OUT1 0x2000
- -#define TIOCM_OUT2 0x4000
- -#define TIOCM_LOOP 0x8000
- -#define TIOCM_MODEM_BITS TIOCM_OUT2
- -
- -#define N_TTY 0
- -#define N_SLIP 1
- -#define N_MOUSE 2
- -#define N_PPP 3
- -#define N_STRIP 4
- -#define N_AX25 5
- -#define N_X25 6
- -#define N_6PACK 7
- -#define N_MASC 8
- -#define N_R3964 9
- -#define N_PROFIBUS_FDL 10
- -#define N_IRDA 11
- -#define N_SMSBLOCK 12
- -#define N_HDLC 13
- -#define N_SYNC_PPP 14
- -#define N_HCI 15
- -
- -#define FIOSETOWN 0x8901
- -#define SIOCSPGRP 0x8902
- -#define FIOGETOWN 0x8903
- -#define SIOCGPGRP 0x8904
- -#define SIOCATMARK 0x8905
- -#define SIOCGSTAMP 0x8906
- -
- -#define SIOCADDRT 0x890B
- -#define SIOCDELRT 0x890C
- -#define SIOCRTMSG 0x890D
- -
- -#define SIOCGIFNAME 0x8910
- -#define SIOCSIFLINK 0x8911
- -#define SIOCGIFCONF 0x8912
- -#define SIOCGIFFLAGS 0x8913
- -#define SIOCSIFFLAGS 0x8914
- -#define SIOCGIFADDR 0x8915
- -#define SIOCSIFADDR 0x8916
- -#define SIOCGIFDSTADDR 0x8917
- -#define SIOCSIFDSTADDR 0x8918
- -#define SIOCGIFBRDADDR 0x8919
- -#define SIOCSIFBRDADDR 0x891a
- -#define SIOCGIFNETMASK 0x891b
- -#define SIOCSIFNETMASK 0x891c
- -#define SIOCGIFMETRIC 0x891d
- -#define SIOCSIFMETRIC 0x891e
- -#define SIOCGIFMEM 0x891f
- -#define SIOCSIFMEM 0x8920
- -#define SIOCGIFMTU 0x8921
- -#define SIOCSIFMTU 0x8922
- -#define SIOCSIFHWADDR 0x8924
- -#define SIOCGIFENCAP 0x8925
- -#define SIOCSIFENCAP 0x8926
- -#define SIOCGIFHWADDR 0x8927
- -#define SIOCGIFSLAVE 0x8929
- -#define SIOCSIFSLAVE 0x8930
- -#define SIOCADDMULTI 0x8931
- -#define SIOCDELMULTI 0x8932
- -#define SIOCGIFINDEX 0x8933
- -#define SIOGIFINDEX SIOCGIFINDEX
- -#define SIOCSIFPFLAGS 0x8934
- -#define SIOCGIFPFLAGS 0x8935
- -#define SIOCDIFADDR 0x8936
- -#define SIOCSIFHWBROADCAST 0x8937
- -#define SIOCGIFCOUNT 0x8938
- -
- -#define SIOCGIFBR 0x8940
- -#define SIOCSIFBR 0x8941
- -
- -#define SIOCGIFTXQLEN 0x8942
- -#define SIOCSIFTXQLEN 0x8943
- -
- -#define SIOCDARP 0x8953
- -#define SIOCGARP 0x8954
- -#define SIOCSARP 0x8955
- -
- -#define SIOCDRARP 0x8960
- -#define SIOCGRARP 0x8961
- -#define SIOCSRARP 0x8962
- -
- -#define SIOCGIFMAP 0x8970
- -#define SIOCSIFMAP 0x8971
- -
- -#define SIOCADDDLCI 0x8980
- -#define SIOCDELDLCI 0x8981
- -
- -#define SIOCDEVPRIVATE 0x89F0
- -#define SIOCPROTOPRIVATE 0x89E0
- --- a/arch/or1k/bits/mman.h
- +++ b/arch/or1k/bits/mman.h
- @@ -37,6 +37,7 @@
-
- #define MCL_CURRENT 1
- #define MCL_FUTURE 2
- +#define MCL_ONFAULT 4
-
- #if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
- #define MADV_NORMAL 0
- --- a/arch/or1k/bits/shm.h
- +++ /dev/null
- @@ -1,27 +0,0 @@
- -#define SHMLBA 4096
- -
- -struct shmid_ds {
- - struct ipc_perm shm_perm;
- - size_t shm_segsz;
- - time_t shm_atime;
- - int __unused1;
- - time_t shm_dtime;
- - int __unused2;
- - time_t shm_ctime;
- - int __unused3;
- - pid_t shm_cpid;
- - pid_t shm_lpid;
- - unsigned long shm_nattch;
- - unsigned long __pad1;
- - unsigned long __pad2;
- -};
- -
- -struct shminfo {
- - unsigned long shmmax, shmmin, shmmni, shmseg, shmall, __unused[4];
- -};
- -
- -struct shm_info {
- - int __used_ids;
- - unsigned long shm_tot, shm_rss, shm_swp;
- - unsigned long __swap_attempts, __swap_successes;
- -};
- --- a/arch/or1k/bits/socket.h
- +++ /dev/null
- @@ -1,15 +0,0 @@
- -struct msghdr {
- - void *msg_name;
- - socklen_t msg_namelen;
- - struct iovec *msg_iov;
- - int msg_iovlen;
- - void *msg_control;
- - socklen_t msg_controllen;
- - int msg_flags;
- -};
- -
- -struct cmsghdr {
- - socklen_t cmsg_len;
- - int cmsg_level;
- - int cmsg_type;
- -};
- --- a/arch/or1k/bits/statfs.h
- +++ /dev/null
- @@ -1,7 +0,0 @@
- -struct statfs {
- - unsigned long f_type, f_bsize;
- - fsblkcnt_t f_blocks, f_bfree, f_bavail;
- - fsfilcnt_t f_files, f_ffree;
- - fsid_t f_fsid;
- - unsigned long f_namelen, f_frsize, f_flags, f_spare[4];
- -};
- --- a/arch/or1k/bits/stdarg.h
- +++ /dev/null
- @@ -1,4 +0,0 @@
- -#define va_start(v,l) __builtin_va_start(v,l)
- -#define va_end(v) __builtin_va_end(v)
- -#define va_arg(v,l) __builtin_va_arg(v,l)
- -#define va_copy(d,s) __builtin_va_copy(d,s)
- --- a/arch/or1k/bits/syscall.h
- +++ b/arch/or1k/bits/syscall.h
- @@ -265,6 +265,9 @@
- #define __NR_memfd_create 279
- #define __NR_bpf 280
- #define __NR_execveat 281
- +#define __NR_userfaultfd 282
- +#define __NR_membarrier 283
- +#define __NR_mlock2 284
-
- #define SYS_io_setup __NR_io_setup
- #define SYS_io_destroy __NR_io_destroy
- @@ -533,3 +536,6 @@
- #define SYS_memfd_create __NR_memfd_create
- #define SYS_bpf __NR_bpf
- #define SYS_execveat __NR_execveat
- +#define SYS_userfaultfd __NR_userfaultfd
- +#define SYS_membarrier __NR_membarrier
- +#define SYS_mlock2 __NR_mlock2
- --- a/arch/or1k/bits/termios.h
- +++ /dev/null
- @@ -1,159 +0,0 @@
- -struct termios {
- - tcflag_t c_iflag;
- - tcflag_t c_oflag;
- - tcflag_t c_cflag;
- - tcflag_t c_lflag;
- - cc_t c_line;
- - cc_t c_cc[NCCS];
- - speed_t __c_ispeed;
- - speed_t __c_ospeed;
- -};
- -
- -#define VINTR 0
- -#define VQUIT 1
- -#define VERASE 2
- -#define VKILL 3
- -#define VEOF 4
- -#define VTIME 5
- -#define VMIN 6
- -#define VSWTC 7
- -#define VSTART 8
- -#define VSTOP 9
- -#define VSUSP 10
- -#define VEOL 11
- -#define VREPRINT 12
- -#define VDISCARD 13
- -#define VWERASE 14
- -#define VLNEXT 15
- -#define VEOL2 16
- -
- -#define IGNBRK 0000001
- -#define BRKINT 0000002
- -#define IGNPAR 0000004
- -#define PARMRK 0000010
- -#define INPCK 0000020
- -#define ISTRIP 0000040
- -#define INLCR 0000100
- -#define IGNCR 0000200
- -#define ICRNL 0000400
- -#define IUCLC 0001000
- -#define IXON 0002000
- -#define IXANY 0004000
- -#define IXOFF 0010000
- -#define IMAXBEL 0020000
- -#define IUTF8 0040000
- -
- -#define OPOST 0000001
- -#define OLCUC 0000002
- -#define ONLCR 0000004
- -#define OCRNL 0000010
- -#define ONOCR 0000020
- -#define ONLRET 0000040
- -#define OFILL 0000100
- -#define OFDEL 0000200
- -#define NLDLY 0000400
- -#define NL0 0000000
- -#define NL1 0000400
- -#define CRDLY 0003000
- -#define CR0 0000000
- -#define CR1 0001000
- -#define CR2 0002000
- -#define CR3 0003000
- -#define TABDLY 0014000
- -#define TAB0 0000000
- -#define TAB1 0004000
- -#define TAB2 0010000
- -#define TAB3 0014000
- -#define BSDLY 0020000
- -#define BS0 0000000
- -#define BS1 0020000
- -#define FFDLY 0100000
- -#define FF0 0000000
- -#define FF1 0100000
- -
- -#define VTDLY 0040000
- -#define VT0 0000000
- -#define VT1 0040000
- -
- -#define B0 0000000
- -#define B50 0000001
- -#define B75 0000002
- -#define B110 0000003
- -#define B134 0000004
- -#define B150 0000005
- -#define B200 0000006
- -#define B300 0000007
- -#define B600 0000010
- -#define B1200 0000011
- -#define B1800 0000012
- -#define B2400 0000013
- -#define B4800 0000014
- -#define B9600 0000015
- -#define B19200 0000016
- -#define B38400 0000017
- -
- -#define B57600 0010001
- -#define B115200 0010002
- -#define B230400 0010003
- -#define B460800 0010004
- -#define B500000 0010005
- -#define B576000 0010006
- -#define B921600 0010007
- -#define B1000000 0010010
- -#define B1152000 0010011
- -#define B1500000 0010012
- -#define B2000000 0010013
- -#define B2500000 0010014
- -#define B3000000 0010015
- -#define B3500000 0010016
- -#define B4000000 0010017
- -
- -#define CBAUD 0010017
- -
- -#define CSIZE 0000060
- -#define CS5 0000000
- -#define CS6 0000020
- -#define CS7 0000040
- -#define CS8 0000060
- -#define CSTOPB 0000100
- -#define CREAD 0000200
- -#define PARENB 0000400
- -#define PARODD 0001000
- -#define HUPCL 0002000
- -#define CLOCAL 0004000
- -
- -#define ISIG 0000001
- -#define ICANON 0000002
- -#define ECHO 0000010
- -#define ECHOE 0000020
- -#define ECHOK 0000040
- -#define ECHONL 0000100
- -#define NOFLSH 0000200
- -#define TOSTOP 0000400
- -#define IEXTEN 0100000
- -
- -#define ECHOCTL 0001000
- -#define ECHOPRT 0002000
- -#define ECHOKE 0004000
- -#define FLUSHO 0010000
- -#define PENDIN 0040000
- -
- -#define TCOOFF 0
- -#define TCOON 1
- -#define TCIOFF 2
- -#define TCION 3
- -
- -#define TCIFLUSH 0
- -#define TCOFLUSH 1
- -#define TCIOFLUSH 2
- -
- -#define TCSANOW 0
- -#define TCSADRAIN 1
- -#define TCSAFLUSH 2
- -
- -#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
- -#define CBAUDEX 0010000
- -#define CRTSCTS 020000000000
- -#define EXTPROC 0200000
- -#define XTABS 0014000
- -#endif
- --- a/arch/or1k/pthread_arch.h
- +++ b/arch/or1k/pthread_arch.h
- @@ -14,5 +14,4 @@ static inline struct pthread *__pthread_
- #define TLS_ABOVE_TP
- #define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread))
-
- -/* word-offset to 'pc' in mcontext_t */
- -#define CANCEL_REG_IP 32
- +#define MC_PC regs.pc
- --- a/arch/powerpc/atomic.h
- +++ /dev/null
- @@ -1,126 +0,0 @@
- -#ifndef _INTERNAL_ATOMIC_H
- -#define _INTERNAL_ATOMIC_H
- -
- -#include <stdint.h>
- -#include <endian.h>
- -
- -static inline int a_ctz_l(unsigned long x)
- -{
- - static const char debruijn32[32] = {
- - 0, 1, 23, 2, 29, 24, 19, 3, 30, 27, 25, 11, 20, 8, 4, 13,
- - 31, 22, 28, 18, 26, 10, 7, 12, 21, 17, 9, 6, 16, 5, 15, 14
- - };
- - return debruijn32[(x&-x)*0x076be629 >> 27];
- -}
- -
- -static inline int a_ctz_64(uint64_t x)
- -{
- - uint32_t y = x;
- - if (!y) {
- - y = x>>32;
- - return 32 + a_ctz_l(y);
- - }
- - return a_ctz_l(y);
- -}
- -
- -static inline int a_cas(volatile int *p, int t, int s)
- -{
- - __asm__("\n"
- - " sync\n"
- - "1: lwarx %0, 0, %4\n"
- - " cmpw %0, %2\n"
- - " bne 1f\n"
- - " stwcx. %3, 0, %4\n"
- - " bne- 1b\n"
- - " isync\n"
- - "1: \n"
- - : "=&r"(t), "+m"(*p) : "r"(t), "r"(s), "r"(p) : "cc", "memory" );
- - return t;
- -}
- -
- -static inline void *a_cas_p(volatile void *p, void *t, void *s)
- -{
- - return (void *)a_cas(p, (int)t, (int)s);
- -}
- -
- -static inline int a_swap(volatile int *x, int v)
- -{
- - int old;
- - do old = *x;
- - while (a_cas(x, old, v) != old);
- - return old;
- -}
- -
- -static inline int a_fetch_add(volatile int *x, int v)
- -{
- - int old;
- - do old = *x;
- - while (a_cas(x, old, old+v) != old);
- - return old;
- -}
- -
- -static inline void a_inc(volatile int *x)
- -{
- - a_fetch_add(x, 1);
- -}
- -
- -static inline void a_dec(volatile int *x)
- -{
- - a_fetch_add(x, -1);
- -}
- -
- -static inline void a_store(volatile int *p, int x)
- -{
- - __asm__ __volatile__ ("\n"
- - " sync\n"
- - " stw %1, %0\n"
- - " isync\n"
- - : "=m"(*p) : "r"(x) : "memory" );
- -}
- -
- -#define a_spin a_barrier
- -
- -static inline void a_barrier()
- -{
- - a_cas(&(int){0}, 0, 0);
- -}
- -
- -static inline void a_crash()
- -{
- - *(volatile char *)0=0;
- -}
- -
- -static inline void a_and(volatile int *p, int v)
- -{
- - int old;
- - do old = *p;
- - while (a_cas(p, old, old&v) != old);
- -}
- -
- -static inline void a_or(volatile int *p, int v)
- -{
- - int old;
- - do old = *p;
- - while (a_cas(p, old, old|v) != old);
- -}
- -
- -static inline void a_or_l(volatile void *p, long v)
- -{
- - a_or(p, v);
- -}
- -
- -static inline void a_and_64(volatile uint64_t *p, uint64_t v)
- -{
- - union { uint64_t v; uint32_t r[2]; } u = { v };
- - a_and((int *)p, u.r[0]);
- - a_and((int *)p+1, u.r[1]);
- -}
- -
- -static inline void a_or_64(volatile uint64_t *p, uint64_t v)
- -{
- - union { uint64_t v; uint32_t r[2]; } u = { v };
- - a_or((int *)p, u.r[0]);
- - a_or((int *)p+1, u.r[1]);
- -}
- -
- -#endif
- --- /dev/null
- +++ b/arch/powerpc/atomic_arch.h
- @@ -0,0 +1,39 @@
- +#define a_ll a_ll
- +static inline int a_ll(volatile int *p)
- +{
- + int v;
- + __asm__ __volatile__ ("lwarx %0, 0, %2" : "=r"(v) : "m"(*p), "r"(p));
- + return v;
- +}
- +
- +#define a_sc a_sc
- +static inline int a_sc(volatile int *p, int v)
- +{
- + int r;
- + __asm__ __volatile__ (
- + "stwcx. %2, 0, %3 ; mfcr %0"
- + : "=r"(r), "=m"(*p) : "r"(v), "r"(p) : "memory", "cc");
- + return r & 0x20000000; /* "bit 2" of "cr0" (backwards bit order) */
- +}
- +
- +#define a_barrier a_barrier
- +static inline void a_barrier()
- +{
- + __asm__ __volatile__ ("sync" : : : "memory");
- +}
- +
- +#define a_pre_llsc a_barrier
- +
- +#define a_post_llsc a_post_llsc
- +static inline void a_post_llsc()
- +{
- + __asm__ __volatile__ ("isync" : : : "memory");
- +}
- +
- +#define a_store a_store
- +static inline void a_store(volatile int *p, int v)
- +{
- + a_pre_llsc();
- + *p = v;
- + a_post_llsc();
- +}
- --- a/arch/powerpc/bits/mman.h
- +++ b/arch/powerpc/bits/mman.h
- @@ -4,6 +4,7 @@
- #define PROT_READ 1
- #define PROT_WRITE 2
- #define PROT_EXEC 4
- +#define PROT_SAO 0x10
- #define PROT_GROWSDOWN 0x01000000
- #define PROT_GROWSUP 0x02000000
-
- @@ -35,8 +36,9 @@
- #define MS_INVALIDATE 2
- #define MS_SYNC 4
-
- -#define MCL_CURRENT 1
- -#define MCL_FUTURE 2
- +#define MCL_CURRENT 0x2000
- +#define MCL_FUTURE 0x4000
- +#define MCL_ONFAULT 0x8000
-
- #if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
- #define MADV_NORMAL 0
- --- a/arch/powerpc/bits/statfs.h
- +++ /dev/null
- @@ -1,7 +0,0 @@
- -struct statfs {
- - unsigned long f_type, f_bsize;
- - fsblkcnt_t f_blocks, f_bfree, f_bavail;
- - fsfilcnt_t f_files, f_ffree;
- - fsid_t f_fsid;
- - unsigned long f_namelen, f_frsize, f_flags, f_spare[4];
- -};
- --- a/arch/powerpc/bits/stdarg.h
- +++ /dev/null
- @@ -1,4 +0,0 @@
- -#define va_start(v,l) __builtin_va_start(v,l)
- -#define va_end(v) __builtin_va_end(v)
- -#define va_arg(v,l) __builtin_va_arg(v,l)
- -#define va_copy(d,s) __builtin_va_copy(d,s)
- --- a/arch/powerpc/bits/syscall.h
- +++ b/arch/powerpc/bits/syscall.h
- @@ -194,23 +194,19 @@
- #define __NR_vfork 189
- #define __NR_ugetrlimit 190
- #define __NR_readahead 191
- -#if !defined(__PPC64) || defined(__ABI32)
- #define __NR_mmap2 192
- #define __NR_truncate64 193
- #define __NR_ftruncate64 194
- #define __NR_stat64 195
- #define __NR_lstat64 196
- #define __NR_fstat64 197
- -#endif
- #define __NR_pciconfig_read 198
- #define __NR_pciconfig_write 199
- #define __NR_pciconfig_iobase 200
- #define __NR_multiplexer 201
- #define __NR_getdents64 202
- #define __NR_pivot_root 203
- -#if !defined(__PPC64) || defined(__ABI32)
- #define __NR_fcntl64 204
- -#endif
- #define __NR_madvise 205
- #define __NR_mincore 206
- #define __NR_gettid 207
- @@ -231,9 +227,7 @@
- #define __NR_sched_setaffinity 222
- #define __NR_sched_getaffinity 223
- #define __NR_tuxcall 225
- -#if !defined(__PPC64) || defined(__ABI32)
- #define __NR_sendfile64 226
- -#endif
- #define __NR_io_setup 227
- #define __NR_io_destroy 228
- #define __NR_io_getevents 229
- @@ -261,9 +255,7 @@
- #define __NR_utimes 251
- #define __NR_statfs64 252
- #define __NR_fstatfs64 253
- -#if !defined(__PPC64) || defined(__ABI32)
- #define __NR_fadvise64_64 254
- -#endif
- #define __NR_rtas 255
- #define __NR_sys_debug_setcontext 256
- #define __NR_migrate_pages 258
- @@ -299,11 +291,7 @@
- #define __NR_mknodat 288
- #define __NR_fchownat 289
- #define __NR_futimesat 290
- -#if defined(__PPC64) && !defined(__ABI32)
- -#define __NR_newfstatat 291
- -#else
- #define __NR_fstatat64 291
- -#endif
- #define __NR_unlinkat 292
- #define __NR_renameat 293
- #define __NR_linkat 294
- @@ -376,6 +364,10 @@
- #define __NR_memfd_create 360
- #define __NR_bpf 361
- #define __NR_execveat 362
- +#define __NR_switch_endian 363
- +#define __NR_userfaultfd 364
- +#define __NR_membarrier 365
- +#define __NR_mlock2 378
-
- /*
- * repeated with SYS prefix
- @@ -576,23 +568,19 @@
- #define SYS_vfork 189
- #define SYS_ugetrlimit 190
- #define SYS_readahead 191
- -#if !defined(__PPC64) || defined(__ABI32)
- #define SYS_mmap2 192
- #define SYS_truncate64 193
- #define SYS_ftruncate64 194
- #define SYS_stat64 195
- #define SYS_lstat64 196
- #define SYS_fstat64 197
- -#endif
- #define SYS_pciconfig_read 198
- #define SYS_pciconfig_write 199
- #define SYS_pciconfig_iobase 200
- #define SYS_multiplexer 201
- #define SYS_getdents64 202
- #define SYS_pivot_root 203
- -#if !defined(__PPC64) || defined(__ABI32)
- #define SYS_fcntl64 204
- -#endif
- #define SYS_madvise 205
- #define SYS_mincore 206
- #define SYS_gettid 207
- @@ -613,9 +601,7 @@
- #define SYS_sched_setaffinity 222
- #define SYS_sched_getaffinity 223
- #define SYS_tuxcall 225
- -#if !defined(__PPC64) || defined(__ABI32)
- #define SYS_sendfile64 226
- -#endif
- #define SYS_io_setup 227
- #define SYS_io_destroy 228
- #define SYS_io_getevents 229
- @@ -643,9 +629,7 @@
- #define SYS_utimes 251
- #define SYS_statfs64 252
- #define SYS_fstatfs64 253
- -#if !defined(__PPC64) || defined(__ABI32)
- #define SYS_fadvise64_64 254
- -#endif
- #define SYS_rtas 255
- #define SYS_sys_debug_setcontext 256
- #define SYS_migrate_pages 258
- @@ -681,11 +665,7 @@
- #define SYS_mknodat 288
- #define SYS_fchownat 289
- #define SYS_futimesat 290
- -#if defined(__PPC64) && !defined(__ABI32)
- -#define SYS_newfstatat 291
- -#else
- #define SYS_fstatat64 291
- -#endif
- #define SYS_unlinkat 292
- #define SYS_renameat 293
- #define SYS_linkat 294
- @@ -758,3 +738,7 @@
- #define SYS_memfd_create 360
- #define SYS_bpf 361
- #define SYS_execveat 362
- +#define SYS_switch_endian 363
- +#define SYS_userfaultfd 364
- +#define SYS_membarrier 365
- +#define SYS_mlock2 378
- --- a/arch/powerpc/pthread_arch.h
- +++ b/arch/powerpc/pthread_arch.h
- @@ -15,9 +15,8 @@ static inline struct pthread *__pthread_
-
- #define DTP_OFFSET 0x8000
-
- -// offset of the PC register in mcontext_t, divided by the system wordsize
- // the kernel calls the ip "nip", it's the first saved value after the 32
- // GPRs.
- -#define CANCEL_REG_IP 32
- +#define MC_PC gregs[32]
-
- #define CANARY canary_at_end
- --- a/arch/sh/atomic.h
- +++ /dev/null
- @@ -1,168 +0,0 @@
- -#ifndef _INTERNAL_ATOMIC_H
- -#define _INTERNAL_ATOMIC_H
- -
- -#include <stdint.h>
- -
- -static inline int a_ctz_l(unsigned long x)
- -{
- - static const char debruijn32[32] = {
- - 0, 1, 23, 2, 29, 24, 19, 3, 30, 27, 25, 11, 20, 8, 4, 13,
- - 31, 22, 28, 18, 26, 10, 7, 12, 21, 17, 9, 6, 16, 5, 15, 14
- - };
- - return debruijn32[(x&-x)*0x076be629 >> 27];
- -}
- -
- -static inline int a_ctz_64(uint64_t x)
- -{
- - uint32_t y = x;
- - if (!y) {
- - y = x>>32;
- - return 32 + a_ctz_l(y);
- - }
- - return a_ctz_l(y);
- -}
- -
- -#define LLSC_CLOBBERS "r0", "t", "memory"
- -#define LLSC_START(mem) "synco\n" \
- - "0: movli.l @" mem ", r0\n"
- -#define LLSC_END(mem) \
- - "1: movco.l r0, @" mem "\n" \
- - " bf 0b\n" \
- - " synco\n"
- -
- -static inline int __sh_cas_llsc(volatile int *p, int t, int s)
- -{
- - int old;
- - __asm__ __volatile__(
- - LLSC_START("%1")
- - " mov r0, %0\n"
- - " cmp/eq %0, %2\n"
- - " bf 1f\n"
- - " mov %3, r0\n"
- - LLSC_END("%1")
- - : "=&r"(old) : "r"(p), "r"(t), "r"(s) : LLSC_CLOBBERS);
- - return old;
- -}
- -
- -static inline int __sh_swap_llsc(volatile int *x, int v)
- -{
- - int old;
- - __asm__ __volatile__(
- - LLSC_START("%1")
- - " mov r0, %0\n"
- - " mov %2, r0\n"
- - LLSC_END("%1")
- - : "=&r"(old) : "r"(x), "r"(v) : LLSC_CLOBBERS);
- - return old;
- -}
- -
- -static inline int __sh_fetch_add_llsc(volatile int *x, int v)
- -{
- - int old;
- - __asm__ __volatile__(
- - LLSC_START("%1")
- - " mov r0, %0\n"
- - " add %2, r0\n"
- - LLSC_END("%1")
- - : "=&r"(old) : "r"(x), "r"(v) : LLSC_CLOBBERS);
- - return old;
- -}
- -
- -static inline void __sh_store_llsc(volatile int *p, int x)
- -{
- - __asm__ __volatile__(
- - " synco\n"
- - " mov.l %1, @%0\n"
- - " synco\n"
- - : : "r"(p), "r"(x) : "memory");
- -}
- -
- -static inline void __sh_and_llsc(volatile int *x, int v)
- -{
- - __asm__ __volatile__(
- - LLSC_START("%0")
- - " and %1, r0\n"
- - LLSC_END("%0")
- - : : "r"(x), "r"(v) : LLSC_CLOBBERS);
- -}
- -
- -static inline void __sh_or_llsc(volatile int *x, int v)
- -{
- - __asm__ __volatile__(
- - LLSC_START("%0")
- - " or %1, r0\n"
- - LLSC_END("%0")
- - : : "r"(x), "r"(v) : LLSC_CLOBBERS);
- -}
- -
- -#ifdef __SH4A__
- -#define a_cas(p,t,s) __sh_cas_llsc(p,t,s)
- -#define a_swap(x,v) __sh_swap_llsc(x,v)
- -#define a_fetch_add(x,v) __sh_fetch_add_llsc(x, v)
- -#define a_store(x,v) __sh_store_llsc(x, v)
- -#define a_and(x,v) __sh_and_llsc(x, v)
- -#define a_or(x,v) __sh_or_llsc(x, v)
- -#else
- -
- -int __sh_cas(volatile int *, int, int);
- -int __sh_swap(volatile int *, int);
- -int __sh_fetch_add(volatile int *, int);
- -void __sh_store(volatile int *, int);
- -void __sh_and(volatile int *, int);
- -void __sh_or(volatile int *, int);
- -
- -#define a_cas(p,t,s) __sh_cas(p,t,s)
- -#define a_swap(x,v) __sh_swap(x,v)
- -#define a_fetch_add(x,v) __sh_fetch_add(x, v)
- -#define a_store(x,v) __sh_store(x, v)
- -#define a_and(x,v) __sh_and(x, v)
- -#define a_or(x,v) __sh_or(x, v)
- -#endif
- -
- -static inline void *a_cas_p(volatile void *p, void *t, void *s)
- -{
- - return (void *)a_cas(p, (int)t, (int)s);
- -}
- -
- -static inline void a_inc(volatile int *x)
- -{
- - a_fetch_add(x, 1);
- -}
- -
- -static inline void a_dec(volatile int *x)
- -{
- - a_fetch_add(x, -1);
- -}
- -
- -#define a_spin a_barrier
- -
- -static inline void a_barrier()
- -{
- - a_cas(&(int){0}, 0, 0);
- -}
- -
- -static inline void a_crash()
- -{
- - *(volatile char *)0=0;
- -}
- -
- -static inline void a_or_l(volatile void *p, long v)
- -{
- - a_or(p, v);
- -}
- -
- -static inline void a_and_64(volatile uint64_t *p, uint64_t v)
- -{
- - union { uint64_t v; uint32_t r[2]; } u = { v };
- - a_and((int *)p, u.r[0]);
- - a_and((int *)p+1, u.r[1]);
- -}
- -
- -static inline void a_or_64(volatile uint64_t *p, uint64_t v)
- -{
- - union { uint64_t v; uint32_t r[2]; } u = { v };
- - a_or((int *)p, u.r[0]);
- - a_or((int *)p+1, u.r[1]);
- -}
- -
- -#endif
- --- /dev/null
- +++ b/arch/sh/atomic_arch.h
- @@ -0,0 +1,46 @@
- +#if defined(__SH4A__)
- +
- +#define a_ll a_ll
- +static inline int a_ll(volatile int *p)
- +{
- + int v;
- + __asm__ __volatile__ ("movli.l @%1, %0" : "=z"(v) : "r"(p), "m"(*p));
- + return v;
- +}
- +
- +#define a_sc a_sc
- +static inline int a_sc(volatile int *p, int v)
- +{
- + int r;
- + __asm__ __volatile__ (
- + "movco.l %2, @%3 ; movt %0"
- + : "=r"(r), "=m"(*p) : "z"(v), "r"(p) : "memory", "cc");
- + return r;
- +}
- +
- +#define a_barrier a_barrier
- +static inline void a_barrier()
- +{
- + __asm__ __volatile__ ("synco" : : "memory");
- +}
- +
- +#define a_pre_llsc a_barrier
- +#define a_post_llsc a_barrier
- +
- +#else
- +
- +#define a_cas a_cas
- +__attribute__((__visibility__("hidden"))) extern const void *__sh_cas_ptr;
- +static inline int a_cas(volatile int *p, int t, int s)
- +{
- + register int r1 __asm__("r1");
- + register int r2 __asm__("r2") = t;
- + register int r3 __asm__("r3") = s;
- + __asm__ __volatile__ (
- + "jsr @%4 ; nop"
- + : "=r"(r1), "+r"(r3) : "z"(p), "r"(r2), "r"(__sh_cas_ptr)
- + : "memory", "pr", "cc");
- + return r3;
- +}
- +
- +#endif
- --- a/arch/sh/bits/errno.h
- +++ /dev/null
- @@ -1,134 +0,0 @@
- -#define EPERM 1
- -#define ENOENT 2
- -#define ESRCH 3
- -#define EINTR 4
- -#define EIO 5
- -#define ENXIO 6
- -#define E2BIG 7
- -#define ENOEXEC 8
- -#define EBADF 9
- -#define ECHILD 10
- -#define EAGAIN 11
- -#define ENOMEM 12
- -#define EACCES 13
- -#define EFAULT 14
- -#define ENOTBLK 15
- -#define EBUSY 16
- -#define EEXIST 17
- -#define EXDEV 18
- -#define ENODEV 19
- -#define ENOTDIR 20
- -#define EISDIR 21
- -#define EINVAL 22
- -#define ENFILE 23
- -#define EMFILE 24
- -#define ENOTTY 25
- -#define ETXTBSY 26
- -#define EFBIG 27
- -#define ENOSPC 28
- -#define ESPIPE 29
- -#define EROFS 30
- -#define EMLINK 31
- -#define EPIPE 32
- -#define EDOM 33
- -#define ERANGE 34
- -#define EDEADLK 35
- -#define ENAMETOOLONG 36
- -#define ENOLCK 37
- -#define ENOSYS 38
- -#define ENOTEMPTY 39
- -#define ELOOP 40
- -#define EWOULDBLOCK EAGAIN
- -#define ENOMSG 42
- -#define EIDRM 43
- -#define ECHRNG 44
- -#define EL2NSYNC 45
- -#define EL3HLT 46
- -#define EL3RST 47
- -#define ELNRNG 48
- -#define EUNATCH 49
- -#define ENOCSI 50
- -#define EL2HLT 51
- -#define EBADE 52
- -#define EBADR 53
- -#define EXFULL 54
- -#define ENOANO 55
- -#define EBADRQC 56
- -#define EBADSLT 57
- -#define EDEADLOCK EDEADLK
- -#define EBFONT 59
- -#define ENOSTR 60
- -#define ENODATA 61
- -#define ETIME 62
- -#define ENOSR 63
- -#define ENONET 64
- -#define ENOPKG 65
- -#define EREMOTE 66
- -#define ENOLINK 67
- -#define EADV 68
- -#define ESRMNT 69
- -#define ECOMM 70
- -#define EPROTO 71
- -#define EMULTIHOP 72
- -#define EDOTDOT 73
- -#define EBADMSG 74
- -#define EOVERFLOW 75
- -#define ENOTUNIQ 76
- -#define EBADFD 77
- -#define EREMCHG 78
- -#define ELIBACC 79
- -#define ELIBBAD 80
- -#define ELIBSCN 81
- -#define ELIBMAX 82
- -#define ELIBEXEC 83
- -#define EILSEQ 84
- -#define ERESTART 85
- -#define ESTRPIPE 86
- -#define EUSERS 87
- -#define ENOTSOCK 88
- -#define EDESTADDRREQ 89
- -#define EMSGSIZE 90
- -#define EPROTOTYPE 91
- -#define ENOPROTOOPT 92
- -#define EPROTONOSUPPORT 93
- -#define ESOCKTNOSUPPORT 94
- -#define EOPNOTSUPP 95
- -#define ENOTSUP EOPNOTSUPP
- -#define EPFNOSUPPORT 96
- -#define EAFNOSUPPORT 97
- -#define EADDRINUSE 98
- -#define EADDRNOTAVAIL 99
- -#define ENETDOWN 100
- -#define ENETUNREACH 101
- -#define ENETRESET 102
- -#define ECONNABORTED 103
- -#define ECONNRESET 104
- -#define ENOBUFS 105
- -#define EISCONN 106
- -#define ENOTCONN 107
- -#define ESHUTDOWN 108
- -#define ETOOMANYREFS 109
- -#define ETIMEDOUT 110
- -#define ECONNREFUSED 111
- -#define EHOSTDOWN 112
- -#define EHOSTUNREACH 113
- -#define EALREADY 114
- -#define EINPROGRESS 115
- -#define ESTALE 116
- -#define EUCLEAN 117
- -#define ENOTNAM 118
- -#define ENAVAIL 119
- -#define EISNAM 120
- -#define EREMOTEIO 121
- -#define EDQUOT 122
- -#define ENOMEDIUM 123
- -#define EMEDIUMTYPE 124
- -#define ECANCELED 125
- -#define ENOKEY 126
- -#define EKEYEXPIRED 127
- -#define EKEYREVOKED 128
- -#define EKEYREJECTED 129
- -#define EOWNERDEAD 130
- -#define ENOTRECOVERABLE 131
- -#define ERFKILL 132
- -#define EHWPOISON 133
- --- a/arch/sh/bits/fcntl.h
- +++ /dev/null
- @@ -1,40 +0,0 @@
- -#define O_CREAT 0100
- -#define O_EXCL 0200
- -#define O_NOCTTY 0400
- -#define O_TRUNC 01000
- -#define O_APPEND 02000
- -#define O_NONBLOCK 04000
- -#define O_DSYNC 010000
- -#define O_SYNC 04010000
- -#define O_RSYNC 04010000
- -#define O_DIRECTORY 0200000
- -#define O_NOFOLLOW 0400000
- -#define O_CLOEXEC 02000000
- -
- -#define O_ASYNC 020000
- -#define O_DIRECT 040000
- -#define O_LARGEFILE 0100000
- -#define O_NOATIME 01000000
- -#define O_PATH 010000000
- -#define O_TMPFILE 020200000
- -#define O_NDELAY O_NONBLOCK
- -
- -#define F_DUPFD 0
- -#define F_GETFD 1
- -#define F_SETFD 2
- -#define F_GETFL 3
- -#define F_SETFL 4
- -
- -#define F_SETOWN 8
- -#define F_GETOWN 9
- -#define F_SETSIG 10
- -#define F_GETSIG 11
- -
- -#define F_GETLK 12
- -#define F_SETLK 13
- -#define F_SETLKW 14
- -
- -#define F_SETOWN_EX 15
- -#define F_GETOWN_EX 16
- -
- -#define F_GETOWNER_UIDS 17
- --- a/arch/sh/bits/ipc.h
- +++ /dev/null
- @@ -1,14 +0,0 @@
- -struct ipc_perm
- -{
- - key_t __ipc_perm_key;
- - uid_t uid;
- - gid_t gid;
- - uid_t cuid;
- - gid_t cgid;
- - mode_t mode;
- - int __ipc_perm_seq;
- - long __pad1;
- - long __pad2;
- -};
- -
- -#define IPC_64 0x100
- --- a/arch/sh/bits/mman.h
- +++ b/arch/sh/bits/mman.h
- @@ -38,6 +38,7 @@
-
- #define MCL_CURRENT 1
- #define MCL_FUTURE 2
- +#define MCL_ONFAULT 4
-
- #if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
- #define MADV_NORMAL 0
- --- a/arch/sh/bits/msg.h
- +++ /dev/null
- @@ -1,16 +0,0 @@
- -struct msqid_ds
- -{
- - struct ipc_perm msg_perm;
- - time_t msg_stime;
- - int __unused1;
- - time_t msg_rtime;
- - int __unused2;
- - time_t msg_ctime;
- - int __unused3;
- - unsigned long msg_cbytes;
- - msgqnum_t msg_qnum;
- - msglen_t msg_qbytes;
- - pid_t msg_lspid;
- - pid_t msg_lrpid;
- - unsigned long __unused[2];
- -};
- --- a/arch/sh/bits/sem.h
- +++ /dev/null
- @@ -1,16 +0,0 @@
- -struct semid_ds {
- - struct ipc_perm sem_perm;
- - time_t sem_otime;
- - time_t __unused1;
- - time_t sem_ctime;
- - time_t __unused2;
- -#if __BYTE_ORDER == __LITTLE_ENDIAN
- - unsigned short sem_nsems;
- - char __sem_nsems_pad[sizeof(time_t)-sizeof(short)];
- -#else
- - char __sem_nsems_pad[sizeof(time_t)-sizeof(short)];
- - unsigned short sem_nsems;
- -#endif
- - time_t __unused3;
- - time_t __unused4;
- -};
- --- a/arch/sh/bits/socket.h
- +++ /dev/null
- @@ -1,17 +0,0 @@
- -struct msghdr
- -{
- - void *msg_name;
- - socklen_t msg_namelen;
- - struct iovec *msg_iov;
- - int msg_iovlen;
- - void *msg_control;
- - socklen_t msg_controllen;
- - int msg_flags;
- -};
- -
- -struct cmsghdr
- -{
- - socklen_t cmsg_len;
- - int cmsg_level;
- - int cmsg_type;
- -};
- --- a/arch/sh/bits/statfs.h
- +++ /dev/null
- @@ -1,7 +0,0 @@
- -struct statfs {
- - unsigned long f_type, f_bsize;
- - fsblkcnt_t f_blocks, f_bfree, f_bavail;
- - fsfilcnt_t f_files, f_ffree;
- - fsid_t f_fsid;
- - unsigned long f_namelen, f_frsize, f_flags, f_spare[4];
- -};
- --- a/arch/sh/bits/stdarg.h
- +++ /dev/null
- @@ -1,4 +0,0 @@
- -#define va_start(v,l) __builtin_va_start(v,l)
- -#define va_end(v) __builtin_va_end(v)
- -#define va_arg(v,l) __builtin_va_arg(v,l)
- -#define va_copy(d,s) __builtin_va_copy(d,s)
- --- a/arch/sh/bits/termios.h
- +++ /dev/null
- @@ -1,160 +0,0 @@
- -struct termios
- -{
- - tcflag_t c_iflag;
- - tcflag_t c_oflag;
- - tcflag_t c_cflag;
- - tcflag_t c_lflag;
- - cc_t c_line;
- - cc_t c_cc[NCCS];
- - speed_t __c_ispeed;
- - speed_t __c_ospeed;
- -};
- -
- -#define VINTR 0
- -#define VQUIT 1
- -#define VERASE 2
- -#define VKILL 3
- -#define VEOF 4
- -#define VTIME 5
- -#define VMIN 6
- -#define VSWTC 7
- -#define VSTART 8
- -#define VSTOP 9
- -#define VSUSP 10
- -#define VEOL 11
- -#define VREPRINT 12
- -#define VDISCARD 13
- -#define VWERASE 14
- -#define VLNEXT 15
- -#define VEOL2 16
- -
- -#define IGNBRK 0000001
- -#define BRKINT 0000002
- -#define IGNPAR 0000004
- -#define PARMRK 0000010
- -#define INPCK 0000020
- -#define ISTRIP 0000040
- -#define INLCR 0000100
- -#define IGNCR 0000200
- -#define ICRNL 0000400
- -#define IUCLC 0001000
- -#define IXON 0002000
- -#define IXANY 0004000
- -#define IXOFF 0010000
- -#define IMAXBEL 0020000
- -#define IUTF8 0040000
- -
- -#define OPOST 0000001
- -#define OLCUC 0000002
- -#define ONLCR 0000004
- -#define OCRNL 0000010
- -#define ONOCR 0000020
- -#define ONLRET 0000040
- -#define OFILL 0000100
- -#define OFDEL 0000200
- -#define NLDLY 0000400
- -#define NL0 0000000
- -#define NL1 0000400
- -#define CRDLY 0003000
- -#define CR0 0000000
- -#define CR1 0001000
- -#define CR2 0002000
- -#define CR3 0003000
- -#define TABDLY 0014000
- -#define TAB0 0000000
- -#define TAB1 0004000
- -#define TAB2 0010000
- -#define TAB3 0014000
- -#define BSDLY 0020000
- -#define BS0 0000000
- -#define BS1 0020000
- -#define FFDLY 0100000
- -#define FF0 0000000
- -#define FF1 0100000
- -
- -#define VTDLY 0040000
- -#define VT0 0000000
- -#define VT1 0040000
- -
- -#define B0 0000000
- -#define B50 0000001
- -#define B75 0000002
- -#define B110 0000003
- -#define B134 0000004
- -#define B150 0000005
- -#define B200 0000006
- -#define B300 0000007
- -#define B600 0000010
- -#define B1200 0000011
- -#define B1800 0000012
- -#define B2400 0000013
- -#define B4800 0000014
- -#define B9600 0000015
- -#define B19200 0000016
- -#define B38400 0000017
- -
- -#define B57600 0010001
- -#define B115200 0010002
- -#define B230400 0010003
- -#define B460800 0010004
- -#define B500000 0010005
- -#define B576000 0010006
- -#define B921600 0010007
- -#define B1000000 0010010
- -#define B1152000 0010011
- -#define B1500000 0010012
- -#define B2000000 0010013
- -#define B2500000 0010014
- -#define B3000000 0010015
- -#define B3500000 0010016
- -#define B4000000 0010017
- -
- -#define CBAUD 0010017
- -
- -#define CSIZE 0000060
- -#define CS5 0000000
- -#define CS6 0000020
- -#define CS7 0000040
- -#define CS8 0000060
- -#define CSTOPB 0000100
- -#define CREAD 0000200
- -#define PARENB 0000400
- -#define PARODD 0001000
- -#define HUPCL 0002000
- -#define CLOCAL 0004000
- -
- -#define ISIG 0000001
- -#define ICANON 0000002
- -#define ECHO 0000010
- -#define ECHOE 0000020
- -#define ECHOK 0000040
- -#define ECHONL 0000100
- -#define NOFLSH 0000200
- -#define TOSTOP 0000400
- -#define IEXTEN 0100000
- -
- -#define ECHOCTL 0001000
- -#define ECHOPRT 0002000
- -#define ECHOKE 0004000
- -#define FLUSHO 0010000
- -#define PENDIN 0040000
- -
- -#define TCOOFF 0
- -#define TCOON 1
- -#define TCIOFF 2
- -#define TCION 3
- -
- -#define TCIFLUSH 0
- -#define TCOFLUSH 1
- -#define TCIOFLUSH 2
- -
- -#define TCSANOW 0
- -#define TCSADRAIN 1
- -#define TCSAFLUSH 2
- -
- -#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
- -#define CBAUDEX 0010000
- -#define CRTSCTS 020000000000
- -#define EXTPROC 0200000
- -#define XTABS 0014000
- -#endif
- --- a/arch/sh/crt_arch.h
- +++ b/arch/sh/crt_arch.h
- @@ -22,7 +22,8 @@ START ": \n"
- " mov.l 1f, r5 \n"
- " mov.l 1f+4, r6 \n"
- " add r0, r5 \n"
- -" bsr __fdpic_fixup \n"
- +" mov.l 4f, r1 \n"
- +"5: bsrf r1 \n"
- " add r0, r6 \n"
- " mov r0, r12 \n"
- #endif
- @@ -31,11 +32,16 @@ START ": \n"
- " mov.l r9, @-r15 \n"
- " mov.l r8, @-r15 \n"
- " mov #-16, r0 \n"
- -" bsr " START "_c \n"
- +" mov.l 2f, r1 \n"
- +"3: bsrf r1 \n"
- " and r0, r15 \n"
- ".align 2 \n"
- "1: .long __ROFIXUP_LIST__@PCREL \n"
- " .long __ROFIXUP_END__@PCREL + 4 \n"
- +"2: .long " START "_c@PCREL - (3b+4-.) \n"
- +#ifndef SHARED
- +"4: .long __fdpic_fixup@PCREL - (5b+4-.) \n"
- +#endif
- );
-
- #ifndef SHARED
- @@ -53,13 +59,14 @@ START ": \n"
- " add r0, r5 \n"
- " mov r15, r4 \n"
- " mov #-16, r0 \n"
- -" and r0, r15 \n"
- -" bsr " START "_c \n"
- -" nop \n"
- +" mov.l 2f, r1 \n"
- +"3: bsrf r1 \n"
- +" and r0, r15 \n"
- ".align 2 \n"
- ".weak _DYNAMIC \n"
- ".hidden _DYNAMIC \n"
- "1: .long _DYNAMIC-. \n"
- +"2: .long " START "_c@PCREL - (3b+4-.) \n"
- );
-
- #endif
- --- a/arch/sh/pthread_arch.h
- +++ b/arch/sh/pthread_arch.h
- @@ -8,4 +8,4 @@ static inline struct pthread *__pthread_
- #define TLS_ABOVE_TP
- #define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread) - 8)
-
- -#define CANCEL_REG_IP 17
- +#define MC_PC sc_pc
- --- a/arch/sh/reloc.h
- +++ b/arch/sh/reloc.h
- @@ -32,6 +32,8 @@
- #define REL_DTPOFF R_SH_TLS_DTPOFF32
- #define REL_TPOFF R_SH_TLS_TPOFF32
-
- +#define DL_NOMMU_SUPPORT 1
- +
- #if __SH_FDPIC__
- #define REL_FUNCDESC R_SH_FUNCDESC
- #define REL_FUNCDESC_VAL R_SH_FUNCDESC_VALUE
- --- a/arch/sh/src/__fpscr_values.c
- +++ /dev/null
- @@ -1,5 +0,0 @@
- -#include "libc.h"
- -
- -/* used by gcc for switching the FPU between single and double precision */
- -//const unsigned long __fpscr_values[2] ATTR_LIBC_VISIBILITY = { 0, 0x80000 };
- -
- --- a/arch/sh/src/__set_thread_area.c
- +++ /dev/null
- @@ -1,34 +0,0 @@
- -#include "pthread_impl.h"
- -#include "libc.h"
- -#include "sh_atomic.h"
- -#include <elf.h>
- -
- -/* Also perform sh-specific init */
- -
- -#define CPU_HAS_LLSC 0x0040
- -
- -__attribute__((__visibility__("hidden"))) unsigned __sh_atomic_model, __sh_nommu;
- -
- -int __set_thread_area(void *p)
- -{
- - size_t *aux;
- - __asm__ __volatile__ ( "ldc %0, gbr" : : "r"(p) : "memory" );
- -#ifndef __SH4A__
- - if (__hwcap & CPU_HAS_LLSC) {
- - __sh_atomic_model = SH_A_LLSC;
- - return 0;
- - }
- -#if !defined(__SH3__) && !defined(__SH4__)
- - for (aux=libc.auxv; *aux; aux+=2) {
- - if (*aux != AT_PLATFORM) continue;
- - const char *s = (void *)aux[1];
- - if (s[0]!='s' || s[1]!='h' || s[2]!='2' || s[3]-'0'<10u) break;
- - __sh_atomic_model = SH_A_IMASK;
- - __sh_nommu = 1;
- - return 0;
- - }
- -#endif
- - /* __sh_atomic_model = SH_A_GUSA; */ /* 0, default */
- -#endif
- - return 0;
- -}
- --- a/arch/sh/src/__shcall.c
- +++ /dev/null
- @@ -1,5 +0,0 @@
- -__attribute__((__visibility__("hidden")))
- -int __shcall(void *arg, int (*func)(void *))
- -{
- - return func(arg);
- -}
- --- a/arch/sh/src/__unmapself.c
- +++ /dev/null
- @@ -1,24 +0,0 @@
- -#include "pthread_impl.h"
- -
- -void __unmapself_sh_mmu(void *, size_t);
- -void __unmapself_sh_nommu(void *, size_t);
- -
- -#if !defined(__SH3__) && !defined(__SH4__)
- -#define __unmapself __unmapself_sh_nommu
- -#include "dynlink.h"
- -#undef CRTJMP
- -#define CRTJMP(pc,sp) __asm__ __volatile__( \
- - "mov.l @%0+,r0 ; mov.l @%0,r12 ; jmp @r0 ; mov %1,r15" \
- - : : "r"(pc), "r"(sp) : "r0", "memory" )
- -#include "../../../src/thread/__unmapself.c"
- -#undef __unmapself
- -extern __attribute__((__visibility__("hidden"))) unsigned __sh_nommu;
- -#else
- -#define __sh_nommu 0
- -#endif
- -
- -void __unmapself(void *base, size_t size)
- -{
- - if (__sh_nommu) __unmapself_sh_nommu(base, size);
- - else __unmapself_sh_mmu(base, size);
- -}
- --- a/arch/sh/src/atomic.c
- +++ /dev/null
- @@ -1,158 +0,0 @@
- -#ifndef __SH4A__
- -
- -#include "sh_atomic.h"
- -#include "atomic.h"
- -#include "libc.h"
- -
- -static inline unsigned mask()
- -{
- - unsigned sr;
- - __asm__ __volatile__ ( "\n"
- - " stc sr,r0 \n"
- - " mov r0,%0 \n"
- - " or #0xf0,r0 \n"
- - " ldc r0,sr \n"
- - : "=&r"(sr) : : "memory", "r0" );
- - return sr;
- -}
- -
- -static inline void unmask(unsigned sr)
- -{
- - __asm__ __volatile__ ( "ldc %0,sr" : : "r"(sr) : "memory" );
- -}
- -
- -/* gusa is a hack in the kernel which lets you create a sequence of instructions
- - * which will be restarted if the process is preempted in the middle of the
- - * sequence. It will do for implementing atomics on non-smp systems. ABI is:
- - * r0 = address of first instruction after the atomic sequence
- - * r1 = original stack pointer
- - * r15 = -1 * length of atomic sequence in bytes
- - */
- -#define GUSA_CLOBBERS "r0", "r1", "memory"
- -#define GUSA_START(mem,old,nop) \
- - " .align 2\n" \
- - " mova 1f, r0\n" \
- - nop \
- - " mov r15, r1\n" \
- - " mov #(0f-1f), r15\n" \
- - "0: mov.l @" mem ", " old "\n"
- -/* the target of mova must be 4 byte aligned, so we may need a nop */
- -#define GUSA_START_ODD(mem,old) GUSA_START(mem,old,"")
- -#define GUSA_START_EVEN(mem,old) GUSA_START(mem,old,"\tnop\n")
- -#define GUSA_END(mem,new) \
- - " mov.l " new ", @" mem "\n" \
- - "1: mov r1, r15\n"
- -
- -int __sh_cas(volatile int *p, int t, int s)
- -{
- - if (__sh_atomic_model == SH_A_LLSC) return __sh_cas_llsc(p, t, s);
- -
- - if (__sh_atomic_model == SH_A_IMASK) {
- - unsigned sr = mask();
- - int old = *p;
- - if (old==t) *p = s;
- - unmask(sr);
- - return old;
- - }
- -
- - int old;
- - __asm__ __volatile__(
- - GUSA_START_EVEN("%1", "%0")
- - " cmp/eq %0, %2\n"
- - " bf 1f\n"
- - GUSA_END("%1", "%3")
- - : "=&r"(old) : "r"(p), "r"(t), "r"(s) : GUSA_CLOBBERS, "t");
- - return old;
- -}
- -
- -int __sh_swap(volatile int *x, int v)
- -{
- - if (__sh_atomic_model == SH_A_LLSC) return __sh_swap_llsc(x, v);
- -
- - if (__sh_atomic_model == SH_A_IMASK) {
- - unsigned sr = mask();
- - int old = *x;
- - *x = v;
- - unmask(sr);
- - return old;
- - }
- -
- - int old;
- - __asm__ __volatile__(
- - GUSA_START_EVEN("%1", "%0")
- - GUSA_END("%1", "%2")
- - : "=&r"(old) : "r"(x), "r"(v) : GUSA_CLOBBERS);
- - return old;
- -}
- -
- -int __sh_fetch_add(volatile int *x, int v)
- -{
- - if (__sh_atomic_model == SH_A_LLSC) return __sh_fetch_add_llsc(x, v);
- -
- - if (__sh_atomic_model == SH_A_IMASK) {
- - unsigned sr = mask();
- - int old = *x;
- - *x = old + v;
- - unmask(sr);
- - return old;
- - }
- -
- - int old, dummy;
- - __asm__ __volatile__(
- - GUSA_START_EVEN("%2", "%0")
- - " mov %0, %1\n"
- - " add %3, %1\n"
- - GUSA_END("%2", "%1")
- - : "=&r"(old), "=&r"(dummy) : "r"(x), "r"(v) : GUSA_CLOBBERS);
- - return old;
- -}
- -
- -void __sh_store(volatile int *p, int x)
- -{
- - if (__sh_atomic_model == SH_A_LLSC) return __sh_store_llsc(p, x);
- - __asm__ __volatile__(
- - " mov.l %1, @%0\n"
- - : : "r"(p), "r"(x) : "memory");
- -}
- -
- -void __sh_and(volatile int *x, int v)
- -{
- - if (__sh_atomic_model == SH_A_LLSC) return __sh_and_llsc(x, v);
- -
- - if (__sh_atomic_model == SH_A_IMASK) {
- - unsigned sr = mask();
- - int old = *x;
- - *x = old & v;
- - unmask(sr);
- - return;
- - }
- -
- - int dummy;
- - __asm__ __volatile__(
- - GUSA_START_ODD("%1", "%0")
- - " and %2, %0\n"
- - GUSA_END("%1", "%0")
- - : "=&r"(dummy) : "r"(x), "r"(v) : GUSA_CLOBBERS);
- -}
- -
- -void __sh_or(volatile int *x, int v)
- -{
- - if (__sh_atomic_model == SH_A_LLSC) return __sh_or_llsc(x, v);
- -
- - if (__sh_atomic_model == SH_A_IMASK) {
- - unsigned sr = mask();
- - int old = *x;
- - *x = old | v;
- - unmask(sr);
- - return;
- - }
- -
- - int dummy;
- - __asm__ __volatile__(
- - GUSA_START_ODD("%1", "%0")
- - " or %2, %0\n"
- - GUSA_END("%1", "%0")
- - : "=&r"(dummy) : "r"(x), "r"(v) : GUSA_CLOBBERS);
- -}
- -
- -#endif
- --- a/arch/sh/src/sh_atomic.h
- +++ /dev/null
- @@ -1,15 +0,0 @@
- -#ifndef _SH_ATOMIC_H
- -#define _SH_ATOMIC_H
- -
- -#define SH_A_GUSA 0
- -#define SH_A_LLSC 1
- -#define SH_A_CAS 2
- -#if !defined(__SH3__) && !defined(__SH4__)
- -#define SH_A_IMASK 3
- -#else
- -#define SH_A_IMASK -1LL /* unmatchable by unsigned int */
- -#endif
- -
- -extern __attribute__((__visibility__("hidden"))) unsigned __sh_atomic_model;
- -
- -#endif
- --- a/arch/x32/atomic.h
- +++ /dev/null
- @@ -1,105 +0,0 @@
- -#ifndef _INTERNAL_ATOMIC_H
- -#define _INTERNAL_ATOMIC_H
- -
- -#include <stdint.h>
- -
- -static inline int a_ctz_64(uint64_t x)
- -{
- - __asm__( "bsf %1,%0" : "=r"(x) : "r"(x) );
- - return x;
- -}
- -
- -static inline int a_ctz_l(unsigned long x)
- -{
- - __asm__( "bsf %1,%0" : "=r"(x) : "r"(x) );
- - return x;
- -}
- -
- -static inline void a_and_64(volatile uint64_t *p, uint64_t v)
- -{
- - __asm__( "lock ; and %1, %0"
- - : "=m"(*p) : "r"(v) : "memory" );
- -}
- -
- -static inline void a_or_64(volatile uint64_t *p, uint64_t v)
- -{
- - __asm__( "lock ; or %1, %0"
- - : "=m"(*p) : "r"(v) : "memory" );
- -}
- -
- -static inline void a_or_l(volatile void *p, long v)
- -{
- - __asm__( "lock ; or %1, %0"
- - : "=m"(*(long *)p) : "r"(v) : "memory" );
- -}
- -
- -static inline void *a_cas_p(volatile void *p, void *t, void *s)
- -{
- - __asm__( "lock ; cmpxchg %3, %1"
- - : "=a"(t), "=m"(*(long *)p) : "a"(t), "r"(s) : "memory" );
- - return t;
- -}
- -
- -static inline int a_cas(volatile int *p, int t, int s)
- -{
- - __asm__( "lock ; cmpxchg %3, %1"
- - : "=a"(t), "=m"(*p) : "a"(t), "r"(s) : "memory" );
- - return t;
- -}
- -
- -static inline void a_or(volatile int *p, int v)
- -{
- - __asm__( "lock ; or %1, %0"
- - : "=m"(*p) : "r"(v) : "memory" );
- -}
- -
- -static inline void a_and(volatile int *p, int v)
- -{
- - __asm__( "lock ; and %1, %0"
- - : "=m"(*p) : "r"(v) : "memory" );
- -}
- -
- -static inline int a_swap(volatile int *x, int v)
- -{
- - __asm__( "xchg %0, %1" : "=r"(v), "=m"(*x) : "0"(v) : "memory" );
- - return v;
- -}
- -
- -static inline int a_fetch_add(volatile int *x, int v)
- -{
- - __asm__( "lock ; xadd %0, %1" : "=r"(v), "=m"(*x) : "0"(v) : "memory" );
- - return v;
- -}
- -
- -static inline void a_inc(volatile int *x)
- -{
- - __asm__( "lock ; incl %0" : "=m"(*x) : "m"(*x) : "memory" );
- -}
- -
- -static inline void a_dec(volatile int *x)
- -{
- - __asm__( "lock ; decl %0" : "=m"(*x) : "m"(*x) : "memory" );
- -}
- -
- -static inline void a_store(volatile int *p, int x)
- -{
- - __asm__( "mov %1, %0 ; lock ; orl $0,(%%rsp)" : "=m"(*p) : "r"(x) : "memory" );
- -}
- -
- -static inline void a_spin()
- -{
- - __asm__ __volatile__( "pause" : : : "memory" );
- -}
- -
- -static inline void a_barrier()
- -{
- - __asm__ __volatile__( "" : : : "memory" );
- -}
- -
- -static inline void a_crash()
- -{
- - __asm__ __volatile__( "hlt" : : : "memory" );
- -}
- -
- -
- -#endif
- --- /dev/null
- +++ b/arch/x32/atomic_arch.h
- @@ -0,0 +1,114 @@
- +#define a_cas a_cas
- +static inline int a_cas(volatile int *p, int t, int s)
- +{
- + __asm__ __volatile__ (
- + "lock ; cmpxchg %3, %1"
- + : "=a"(t), "=m"(*p) : "a"(t), "r"(s) : "memory" );
- + return t;
- +}
- +
- +#define a_swap a_swap
- +static inline int a_swap(volatile int *p, int v)
- +{
- + __asm__ __volatile__(
- + "xchg %0, %1"
- + : "=r"(v), "=m"(*p) : "0"(v) : "memory" );
- + return v;
- +}
- +
- +#define a_fetch_add a_fetch_add
- +static inline int a_fetch_add(volatile int *p, int v)
- +{
- + __asm__ __volatile__(
- + "lock ; xadd %0, %1"
- + : "=r"(v), "=m"(*p) : "0"(v) : "memory" );
- + return v;
- +}
- +
- +#define a_and a_and
- +static inline void a_and(volatile int *p, int v)
- +{
- + __asm__ __volatile__(
- + "lock ; and %1, %0"
- + : "=m"(*p) : "r"(v) : "memory" );
- +}
- +
- +#define a_or a_or
- +static inline void a_or(volatile int *p, int v)
- +{
- + __asm__ __volatile__(
- + "lock ; or %1, %0"
- + : "=m"(*p) : "r"(v) : "memory" );
- +}
- +
- +#define a_and_64 a_and_64
- +static inline void a_and_64(volatile uint64_t *p, uint64_t v)
- +{
- + __asm__ __volatile(
- + "lock ; and %1, %0"
- + : "=m"(*p) : "r"(v) : "memory" );
- +}
- +
- +#define a_or_64 a_or_64
- +static inline void a_or_64(volatile uint64_t *p, uint64_t v)
- +{
- + __asm__ __volatile__(
- + "lock ; or %1, %0"
- + : "=m"(*p) : "r"(v) : "memory" );
- +}
- +
- +#define a_inc a_inc
- +static inline void a_inc(volatile int *p)
- +{
- + __asm__ __volatile__(
- + "lock ; incl %0"
- + : "=m"(*p) : "m"(*p) : "memory" );
- +}
- +
- +#define a_dec a_dec
- +static inline void a_dec(volatile int *p)
- +{
- + __asm__ __volatile__(
- + "lock ; decl %0"
- + : "=m"(*p) : "m"(*p) : "memory" );
- +}
- +
- +#define a_store a_store
- +static inline void a_store(volatile int *p, int x)
- +{
- + __asm__ __volatile__(
- + "mov %1, %0 ; lock ; orl $0,(%%rsp)"
- + : "=m"(*p) : "r"(x) : "memory" );
- +}
- +
- +#define a_barrier a_barrier
- +static inline void a_barrier()
- +{
- + __asm__ __volatile__( "" : : : "memory" );
- +}
- +
- +#define a_pause a_pause
- +static inline void a_spin()
- +{
- + __asm__ __volatile__( "pause" : : : "memory" );
- +}
- +
- +#define a_crash a_crash
- +static inline void a_crash()
- +{
- + __asm__ __volatile__( "hlt" : : : "memory" );
- +}
- +
- +#define a_ctz_64 a_ctz_64
- +static inline int a_ctz_64(uint64_t x)
- +{
- + __asm__( "bsf %1,%0" : "=r"(x) : "r"(x) );
- + return x;
- +}
- +
- +#define a_ctz_l a_ctz_l
- +static inline int a_ctz_l(unsigned long x)
- +{
- + __asm__( "bsf %1,%0" : "=r"(x) : "r"(x) );
- + return x;
- +}
- --- a/arch/x32/bits/errno.h
- +++ /dev/null
- @@ -1,134 +0,0 @@
- -#define EPERM 1
- -#define ENOENT 2
- -#define ESRCH 3
- -#define EINTR 4
- -#define EIO 5
- -#define ENXIO 6
- -#define E2BIG 7
- -#define ENOEXEC 8
- -#define EBADF 9
- -#define ECHILD 10
- -#define EAGAIN 11
- -#define ENOMEM 12
- -#define EACCES 13
- -#define EFAULT 14
- -#define ENOTBLK 15
- -#define EBUSY 16
- -#define EEXIST 17
- -#define EXDEV 18
- -#define ENODEV 19
- -#define ENOTDIR 20
- -#define EISDIR 21
- -#define EINVAL 22
- -#define ENFILE 23
- -#define EMFILE 24
- -#define ENOTTY 25
- -#define ETXTBSY 26
- -#define EFBIG 27
- -#define ENOSPC 28
- -#define ESPIPE 29
- -#define EROFS 30
- -#define EMLINK 31
- -#define EPIPE 32
- -#define EDOM 33
- -#define ERANGE 34
- -#define EDEADLK 35
- -#define ENAMETOOLONG 36
- -#define ENOLCK 37
- -#define ENOSYS 38
- -#define ENOTEMPTY 39
- -#define ELOOP 40
- -#define EWOULDBLOCK EAGAIN
- -#define ENOMSG 42
- -#define EIDRM 43
- -#define ECHRNG 44
- -#define EL2NSYNC 45
- -#define EL3HLT 46
- -#define EL3RST 47
- -#define ELNRNG 48
- -#define EUNATCH 49
- -#define ENOCSI 50
- -#define EL2HLT 51
- -#define EBADE 52
- -#define EBADR 53
- -#define EXFULL 54
- -#define ENOANO 55
- -#define EBADRQC 56
- -#define EBADSLT 57
- -#define EDEADLOCK EDEADLK
- -#define EBFONT 59
- -#define ENOSTR 60
- -#define ENODATA 61
- -#define ETIME 62
- -#define ENOSR 63
- -#define ENONET 64
- -#define ENOPKG 65
- -#define EREMOTE 66
- -#define ENOLINK 67
- -#define EADV 68
- -#define ESRMNT 69
- -#define ECOMM 70
- -#define EPROTO 71
- -#define EMULTIHOP 72
- -#define EDOTDOT 73
- -#define EBADMSG 74
- -#define EOVERFLOW 75
- -#define ENOTUNIQ 76
- -#define EBADFD 77
- -#define EREMCHG 78
- -#define ELIBACC 79
- -#define ELIBBAD 80
- -#define ELIBSCN 81
- -#define ELIBMAX 82
- -#define ELIBEXEC 83
- -#define EILSEQ 84
- -#define ERESTART 85
- -#define ESTRPIPE 86
- -#define EUSERS 87
- -#define ENOTSOCK 88
- -#define EDESTADDRREQ 89
- -#define EMSGSIZE 90
- -#define EPROTOTYPE 91
- -#define ENOPROTOOPT 92
- -#define EPROTONOSUPPORT 93
- -#define ESOCKTNOSUPPORT 94
- -#define EOPNOTSUPP 95
- -#define ENOTSUP EOPNOTSUPP
- -#define EPFNOSUPPORT 96
- -#define EAFNOSUPPORT 97
- -#define EADDRINUSE 98
- -#define EADDRNOTAVAIL 99
- -#define ENETDOWN 100
- -#define ENETUNREACH 101
- -#define ENETRESET 102
- -#define ECONNABORTED 103
- -#define ECONNRESET 104
- -#define ENOBUFS 105
- -#define EISCONN 106
- -#define ENOTCONN 107
- -#define ESHUTDOWN 108
- -#define ETOOMANYREFS 109
- -#define ETIMEDOUT 110
- -#define ECONNREFUSED 111
- -#define EHOSTDOWN 112
- -#define EHOSTUNREACH 113
- -#define EALREADY 114
- -#define EINPROGRESS 115
- -#define ESTALE 116
- -#define EUCLEAN 117
- -#define ENOTNAM 118
- -#define ENAVAIL 119
- -#define EISNAM 120
- -#define EREMOTEIO 121
- -#define EDQUOT 122
- -#define ENOMEDIUM 123
- -#define EMEDIUMTYPE 124
- -#define ECANCELED 125
- -#define ENOKEY 126
- -#define EKEYEXPIRED 127
- -#define EKEYREVOKED 128
- -#define EKEYREJECTED 129
- -#define EOWNERDEAD 130
- -#define ENOTRECOVERABLE 131
- -#define ERFKILL 132
- -#define EHWPOISON 133
- --- a/arch/x32/bits/mman.h
- +++ b/arch/x32/bits/mman.h
- @@ -38,6 +38,7 @@
-
- #define MCL_CURRENT 1
- #define MCL_FUTURE 2
- +#define MCL_ONFAULT 4
-
- #if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
- #define MADV_NORMAL 0
- --- a/arch/x32/bits/sem.h
- +++ /dev/null
- @@ -1,16 +0,0 @@
- -struct semid_ds {
- - struct ipc_perm sem_perm;
- - time_t sem_otime;
- - time_t __unused1;
- - time_t sem_ctime;
- - time_t __unused2;
- -#if __BYTE_ORDER == __LITTLE_ENDIAN
- - unsigned short sem_nsems;
- - char __sem_nsems_pad[sizeof(time_t)-sizeof(short)];
- -#else
- - char __sem_nsems_pad[sizeof(time_t)-sizeof(short)];
- - unsigned short sem_nsems;
- -#endif
- - time_t __unused3;
- - time_t __unused4;
- -};
- --- a/arch/x32/bits/stdarg.h
- +++ /dev/null
- @@ -1,4 +0,0 @@
- -#define va_start(v,l) __builtin_va_start(v,l)
- -#define va_end(v) __builtin_va_end(v)
- -#define va_arg(v,l) __builtin_va_arg(v,l)
- -#define va_copy(d,s) __builtin_va_copy(d,s)
- --- a/arch/x32/bits/syscall.h
- +++ b/arch/x32/bits/syscall.h
- @@ -277,6 +277,9 @@
- #define __NR_memfd_create (__X32_SYSCALL_BIT + 319)
- #define __NR_kexec_file_load (__X32_SYSCALL_BIT + 320)
- #define __NR_bpf (__X32_SYSCALL_BIT + 321)
- +#define __NR_userfaultfd (__X32_SYSCALL_BIT + 323)
- +#define __NR_membarrier (__X32_SYSCALL_BIT + 324)
- +#define __NR_mlock2 (__X32_SYSCALL_BIT + 325)
-
- #define __NR_rt_sigaction (__X32_SYSCALL_BIT + 512)
- #define __NR_rt_sigreturn (__X32_SYSCALL_BIT + 513)
- @@ -607,6 +610,9 @@
- #define SYS_memfd_create __NR_memfd_create
- #define SYS_kexec_file_load __NR_kexec_file_load
- #define SYS_bpf __NR_bpf
- +#define SYS_userfaultfd __NR_userfaultfd
- +#define SYS_membarrier __NR_membarrier
- +#define SYS_mlock2 __NR_mlock2
-
-
- #define SYS_rt_sigaction __NR_rt_sigaction
- --- a/arch/x32/bits/termios.h
- +++ /dev/null
- @@ -1,160 +0,0 @@
- -struct termios
- -{
- - tcflag_t c_iflag;
- - tcflag_t c_oflag;
- - tcflag_t c_cflag;
- - tcflag_t c_lflag;
- - cc_t c_line;
- - cc_t c_cc[NCCS];
- - speed_t __c_ispeed;
- - speed_t __c_ospeed;
- -};
- -
- -#define VINTR 0
- -#define VQUIT 1
- -#define VERASE 2
- -#define VKILL 3
- -#define VEOF 4
- -#define VTIME 5
- -#define VMIN 6
- -#define VSWTC 7
- -#define VSTART 8
- -#define VSTOP 9
- -#define VSUSP 10
- -#define VEOL 11
- -#define VREPRINT 12
- -#define VDISCARD 13
- -#define VWERASE 14
- -#define VLNEXT 15
- -#define VEOL2 16
- -
- -#define IGNBRK 0000001
- -#define BRKINT 0000002
- -#define IGNPAR 0000004
- -#define PARMRK 0000010
- -#define INPCK 0000020
- -#define ISTRIP 0000040
- -#define INLCR 0000100
- -#define IGNCR 0000200
- -#define ICRNL 0000400
- -#define IUCLC 0001000
- -#define IXON 0002000
- -#define IXANY 0004000
- -#define IXOFF 0010000
- -#define IMAXBEL 0020000
- -#define IUTF8 0040000
- -
- -#define OPOST 0000001
- -#define OLCUC 0000002
- -#define ONLCR 0000004
- -#define OCRNL 0000010
- -#define ONOCR 0000020
- -#define ONLRET 0000040
- -#define OFILL 0000100
- -#define OFDEL 0000200
- -#define NLDLY 0000400
- -#define NL0 0000000
- -#define NL1 0000400
- -#define CRDLY 0003000
- -#define CR0 0000000
- -#define CR1 0001000
- -#define CR2 0002000
- -#define CR3 0003000
- -#define TABDLY 0014000
- -#define TAB0 0000000
- -#define TAB1 0004000
- -#define TAB2 0010000
- -#define TAB3 0014000
- -#define BSDLY 0020000
- -#define BS0 0000000
- -#define BS1 0020000
- -#define FFDLY 0100000
- -#define FF0 0000000
- -#define FF1 0100000
- -
- -#define VTDLY 0040000
- -#define VT0 0000000
- -#define VT1 0040000
- -
- -#define B0 0000000
- -#define B50 0000001
- -#define B75 0000002
- -#define B110 0000003
- -#define B134 0000004
- -#define B150 0000005
- -#define B200 0000006
- -#define B300 0000007
- -#define B600 0000010
- -#define B1200 0000011
- -#define B1800 0000012
- -#define B2400 0000013
- -#define B4800 0000014
- -#define B9600 0000015
- -#define B19200 0000016
- -#define B38400 0000017
- -
- -#define B57600 0010001
- -#define B115200 0010002
- -#define B230400 0010003
- -#define B460800 0010004
- -#define B500000 0010005
- -#define B576000 0010006
- -#define B921600 0010007
- -#define B1000000 0010010
- -#define B1152000 0010011
- -#define B1500000 0010012
- -#define B2000000 0010013
- -#define B2500000 0010014
- -#define B3000000 0010015
- -#define B3500000 0010016
- -#define B4000000 0010017
- -
- -#define CBAUD 0010017
- -
- -#define CSIZE 0000060
- -#define CS5 0000000
- -#define CS6 0000020
- -#define CS7 0000040
- -#define CS8 0000060
- -#define CSTOPB 0000100
- -#define CREAD 0000200
- -#define PARENB 0000400
- -#define PARODD 0001000
- -#define HUPCL 0002000
- -#define CLOCAL 0004000
- -
- -#define ISIG 0000001
- -#define ICANON 0000002
- -#define ECHO 0000010
- -#define ECHOE 0000020
- -#define ECHOK 0000040
- -#define ECHONL 0000100
- -#define NOFLSH 0000200
- -#define TOSTOP 0000400
- -#define IEXTEN 0100000
- -
- -#define ECHOCTL 0001000
- -#define ECHOPRT 0002000
- -#define ECHOKE 0004000
- -#define FLUSHO 0010000
- -#define PENDIN 0040000
- -
- -#define TCOOFF 0
- -#define TCOON 1
- -#define TCIOFF 2
- -#define TCION 3
- -
- -#define TCIFLUSH 0
- -#define TCOFLUSH 1
- -#define TCIOFLUSH 2
- -
- -#define TCSANOW 0
- -#define TCSADRAIN 1
- -#define TCSAFLUSH 2
- -
- -#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
- -#define CBAUDEX 0010000
- -#define CRTSCTS 020000000000
- -#define EXTPROC 0200000
- -#define XTABS 0014000
- -#endif
- --- a/arch/x32/pthread_arch.h
- +++ b/arch/x32/pthread_arch.h
- @@ -7,6 +7,6 @@ static inline struct pthread *__pthread_
-
- #define TP_ADJ(p) (p)
-
- -#define CANCEL_REG_IP 32
- +#define MC_PC gregs[REG_RIP]
-
- #define CANARY canary2
- --- a/arch/x32/src/syscall_cp_fixup.c
- +++ /dev/null
- @@ -1,42 +0,0 @@
- -#include <sys/syscall.h>
- -
- -#ifdef SHARED
- -__attribute__((__visibility__("hidden")))
- -#endif
- -long __syscall_cp_internal(volatile void*, long long, long long, long long, long long,
- - long long, long long, long long);
- -
- -struct __timespec { long long tv_sec; long tv_nsec; };
- -struct __timespec_kernel { long long tv_sec; long long tv_nsec; };
- -#define __tsc(X) ((struct __timespec*)(unsigned long)(X))
- -#define __fixup(X) do { if(X) { \
- - ts->tv_sec = __tsc(X)->tv_sec; \
- - ts->tv_nsec = __tsc(X)->tv_nsec; \
- - (X) = (unsigned long)ts; } } while(0)
- -
- -#ifdef SHARED
- -__attribute__((__visibility__("hidden")))
- -#endif
- -long __syscall_cp_asm (volatile void * foo, long long n, long long a1, long long a2, long long a3,
- - long long a4, long long a5, long long a6)
- -{
- - struct __timespec_kernel ts[1];
- - switch (n) {
- - case SYS_mq_timedsend: case SYS_mq_timedreceive: case SYS_pselect6:
- - __fixup(a5);
- - break;
- - case SYS_futex:
- - if((a2 & (~128 /* FUTEX_PRIVATE_FLAG */)) == 0 /* FUTEX_WAIT */)
- - __fixup(a4);
- - break;
- - case SYS_clock_nanosleep:
- - case SYS_rt_sigtimedwait: case SYS_ppoll:
- - __fixup(a3);
- - break;
- - case SYS_nanosleep:
- - __fixup(a1);
- - break;
- - }
- - return __syscall_cp_internal(foo, n, a1, a2, a3, a4, a5, a6);
- -}
- -
- --- a/arch/x32/src/sysinfo.c
- +++ /dev/null
- @@ -1,50 +0,0 @@
- -#include <sys/sysinfo.h>
- -#include "syscall.h"
- -#include "libc.h"
- -
- -#define klong long long
- -#define kulong unsigned long long
- -
- -struct kernel_sysinfo {
- - klong uptime;
- - kulong loads[3];
- - kulong totalram;
- - kulong freeram;
- - kulong sharedram;
- - kulong bufferram;
- - kulong totalswap;
- - kulong freeswap;
- - short procs;
- - short pad;
- - kulong totalhigh;
- - kulong freehigh;
- - unsigned mem_unit;
- -};
- -
- -int __lsysinfo(struct sysinfo *info)
- -{
- - struct kernel_sysinfo tmp;
- - int ret = syscall(SYS_sysinfo, &tmp);
- - if(ret == -1) return ret;
- - info->uptime = tmp.uptime;
- - info->loads[0] = tmp.loads[0];
- - info->loads[1] = tmp.loads[1];
- - info->loads[2] = tmp.loads[2];
- - kulong shifts;
- - kulong max = tmp.totalram | tmp.totalswap;
- - __asm__("bsr %1,%0" : "=r"(shifts) : "r"(max));
- - shifts = shifts >= 32 ? shifts - 31 : 0;
- - info->totalram = tmp.totalram >> shifts;
- - info->freeram = tmp.freeram >> shifts;
- - info->sharedram = tmp.sharedram >> shifts;
- - info->bufferram = tmp.bufferram >> shifts;
- - info->totalswap = tmp.totalswap >> shifts;
- - info->freeswap = tmp.freeswap >> shifts;
- - info->procs = tmp.procs ;
- - info->totalhigh = tmp.totalhigh >> shifts;
- - info->freehigh = tmp.freehigh >> shifts;
- - info->mem_unit = (tmp.mem_unit ? tmp.mem_unit : 1) << shifts;
- - return ret;
- -}
- -
- -weak_alias(__lsysinfo, sysinfo);
- --- a/arch/x86_64/atomic.h
- +++ /dev/null
- @@ -1,105 +0,0 @@
- -#ifndef _INTERNAL_ATOMIC_H
- -#define _INTERNAL_ATOMIC_H
- -
- -#include <stdint.h>
- -
- -static inline int a_ctz_64(uint64_t x)
- -{
- - __asm__( "bsf %1,%0" : "=r"(x) : "r"(x) );
- - return x;
- -}
- -
- -static inline int a_ctz_l(unsigned long x)
- -{
- - __asm__( "bsf %1,%0" : "=r"(x) : "r"(x) );
- - return x;
- -}
- -
- -static inline void a_and_64(volatile uint64_t *p, uint64_t v)
- -{
- - __asm__( "lock ; and %1, %0"
- - : "=m"(*p) : "r"(v) : "memory" );
- -}
- -
- -static inline void a_or_64(volatile uint64_t *p, uint64_t v)
- -{
- - __asm__( "lock ; or %1, %0"
- - : "=m"(*p) : "r"(v) : "memory" );
- -}
- -
- -static inline void a_or_l(volatile void *p, long v)
- -{
- - __asm__( "lock ; or %1, %0"
- - : "=m"(*(long *)p) : "r"(v) : "memory" );
- -}
- -
- -static inline void *a_cas_p(volatile void *p, void *t, void *s)
- -{
- - __asm__( "lock ; cmpxchg %3, %1"
- - : "=a"(t), "=m"(*(long *)p) : "a"(t), "r"(s) : "memory" );
- - return t;
- -}
- -
- -static inline int a_cas(volatile int *p, int t, int s)
- -{
- - __asm__( "lock ; cmpxchg %3, %1"
- - : "=a"(t), "=m"(*p) : "a"(t), "r"(s) : "memory" );
- - return t;
- -}
- -
- -static inline void a_or(volatile int *p, int v)
- -{
- - __asm__( "lock ; or %1, %0"
- - : "=m"(*p) : "r"(v) : "memory" );
- -}
- -
- -static inline void a_and(volatile int *p, int v)
- -{
- - __asm__( "lock ; and %1, %0"
- - : "=m"(*p) : "r"(v) : "memory" );
- -}
- -
- -static inline int a_swap(volatile int *x, int v)
- -{
- - __asm__( "xchg %0, %1" : "=r"(v), "=m"(*x) : "0"(v) : "memory" );
- - return v;
- -}
- -
- -static inline int a_fetch_add(volatile int *x, int v)
- -{
- - __asm__( "lock ; xadd %0, %1" : "=r"(v), "=m"(*x) : "0"(v) : "memory" );
- - return v;
- -}
- -
- -static inline void a_inc(volatile int *x)
- -{
- - __asm__( "lock ; incl %0" : "=m"(*x) : "m"(*x) : "memory" );
- -}
- -
- -static inline void a_dec(volatile int *x)
- -{
- - __asm__( "lock ; decl %0" : "=m"(*x) : "m"(*x) : "memory" );
- -}
- -
- -static inline void a_store(volatile int *p, int x)
- -{
- - __asm__( "mov %1, %0 ; lock ; orl $0,(%%rsp)" : "=m"(*p) : "r"(x) : "memory" );
- -}
- -
- -static inline void a_spin()
- -{
- - __asm__ __volatile__( "pause" : : : "memory" );
- -}
- -
- -static inline void a_barrier()
- -{
- - __asm__ __volatile__( "" : : : "memory" );
- -}
- -
- -static inline void a_crash()
- -{
- - __asm__ __volatile__( "hlt" : : : "memory" );
- -}
- -
- -
- -#endif
- --- /dev/null
- +++ b/arch/x86_64/atomic_arch.h
- @@ -0,0 +1,116 @@
- +#define a_cas a_cas
- +static inline int a_cas(volatile int *p, int t, int s)
- +{
- + __asm__ __volatile__ (
- + "lock ; cmpxchg %3, %1"
- + : "=a"(t), "=m"(*p) : "a"(t), "r"(s) : "memory" );
- + return t;
- +}
- +
- +#define a_cas_p a_cas_p
- +static inline void *a_cas_p(volatile void *p, void *t, void *s)
- +{
- + __asm__( "lock ; cmpxchg %3, %1"
- + : "=a"(t), "=m"(*(void *volatile *)p)
- + : "a"(t), "r"(s) : "memory" );
- + return t;
- +}
- +
- +#define a_swap a_swap
- +static inline int a_swap(volatile int *p, int v)
- +{
- + __asm__ __volatile__(
- + "xchg %0, %1"
- + : "=r"(v), "=m"(*p) : "0"(v) : "memory" );
- + return v;
- +}
- +
- +#define a_fetch_add a_fetch_add
- +static inline int a_fetch_add(volatile int *p, int v)
- +{
- + __asm__ __volatile__(
- + "lock ; xadd %0, %1"
- + : "=r"(v), "=m"(*p) : "0"(v) : "memory" );
- + return v;
- +}
- +
- +#define a_and a_and
- +static inline void a_and(volatile int *p, int v)
- +{
- + __asm__ __volatile__(
- + "lock ; and %1, %0"
- + : "=m"(*p) : "r"(v) : "memory" );
- +}
- +
- +#define a_or a_or
- +static inline void a_or(volatile int *p, int v)
- +{
- + __asm__ __volatile__(
- + "lock ; or %1, %0"
- + : "=m"(*p) : "r"(v) : "memory" );
- +}
- +
- +#define a_and_64 a_and_64
- +static inline void a_and_64(volatile uint64_t *p, uint64_t v)
- +{
- + __asm__ __volatile(
- + "lock ; and %1, %0"
- + : "=m"(*p) : "r"(v) : "memory" );
- +}
- +
- +#define a_or_64 a_or_64
- +static inline void a_or_64(volatile uint64_t *p, uint64_t v)
- +{
- + __asm__ __volatile__(
- + "lock ; or %1, %0"
- + : "=m"(*p) : "r"(v) : "memory" );
- +}
- +
- +#define a_inc a_inc
- +static inline void a_inc(volatile int *p)
- +{
- + __asm__ __volatile__(
- + "lock ; incl %0"
- + : "=m"(*p) : "m"(*p) : "memory" );
- +}
- +
- +#define a_dec a_dec
- +static inline void a_dec(volatile int *p)
- +{
- + __asm__ __volatile__(
- + "lock ; decl %0"
- + : "=m"(*p) : "m"(*p) : "memory" );
- +}
- +
- +#define a_store a_store
- +static inline void a_store(volatile int *p, int x)
- +{
- + __asm__ __volatile__(
- + "mov %1, %0 ; lock ; orl $0,(%%rsp)"
- + : "=m"(*p) : "r"(x) : "memory" );
- +}
- +
- +#define a_barrier a_barrier
- +static inline void a_barrier()
- +{
- + __asm__ __volatile__( "" : : : "memory" );
- +}
- +
- +#define a_pause a_pause
- +static inline void a_spin()
- +{
- + __asm__ __volatile__( "pause" : : : "memory" );
- +}
- +
- +#define a_crash a_crash
- +static inline void a_crash()
- +{
- + __asm__ __volatile__( "hlt" : : : "memory" );
- +}
- +
- +#define a_ctz_64 a_ctz_64
- +static inline int a_ctz_64(uint64_t x)
- +{
- + __asm__( "bsf %1,%0" : "=r"(x) : "r"(x) );
- + return x;
- +}
- --- a/arch/x86_64/bits/errno.h
- +++ /dev/null
- @@ -1,134 +0,0 @@
- -#define EPERM 1
- -#define ENOENT 2
- -#define ESRCH 3
- -#define EINTR 4
- -#define EIO 5
- -#define ENXIO 6
- -#define E2BIG 7
- -#define ENOEXEC 8
- -#define EBADF 9
- -#define ECHILD 10
- -#define EAGAIN 11
- -#define ENOMEM 12
- -#define EACCES 13
- -#define EFAULT 14
- -#define ENOTBLK 15
- -#define EBUSY 16
- -#define EEXIST 17
- -#define EXDEV 18
- -#define ENODEV 19
- -#define ENOTDIR 20
- -#define EISDIR 21
- -#define EINVAL 22
- -#define ENFILE 23
- -#define EMFILE 24
- -#define ENOTTY 25
- -#define ETXTBSY 26
- -#define EFBIG 27
- -#define ENOSPC 28
- -#define ESPIPE 29
- -#define EROFS 30
- -#define EMLINK 31
- -#define EPIPE 32
- -#define EDOM 33
- -#define ERANGE 34
- -#define EDEADLK 35
- -#define ENAMETOOLONG 36
- -#define ENOLCK 37
- -#define ENOSYS 38
- -#define ENOTEMPTY 39
- -#define ELOOP 40
- -#define EWOULDBLOCK EAGAIN
- -#define ENOMSG 42
- -#define EIDRM 43
- -#define ECHRNG 44
- -#define EL2NSYNC 45
- -#define EL3HLT 46
- -#define EL3RST 47
- -#define ELNRNG 48
- -#define EUNATCH 49
- -#define ENOCSI 50
- -#define EL2HLT 51
- -#define EBADE 52
- -#define EBADR 53
- -#define EXFULL 54
- -#define ENOANO 55
- -#define EBADRQC 56
- -#define EBADSLT 57
- -#define EDEADLOCK EDEADLK
- -#define EBFONT 59
- -#define ENOSTR 60
- -#define ENODATA 61
- -#define ETIME 62
- -#define ENOSR 63
- -#define ENONET 64
- -#define ENOPKG 65
- -#define EREMOTE 66
- -#define ENOLINK 67
- -#define EADV 68
- -#define ESRMNT 69
- -#define ECOMM 70
- -#define EPROTO 71
- -#define EMULTIHOP 72
- -#define EDOTDOT 73
- -#define EBADMSG 74
- -#define EOVERFLOW 75
- -#define ENOTUNIQ 76
- -#define EBADFD 77
- -#define EREMCHG 78
- -#define ELIBACC 79
- -#define ELIBBAD 80
- -#define ELIBSCN 81
- -#define ELIBMAX 82
- -#define ELIBEXEC 83
- -#define EILSEQ 84
- -#define ERESTART 85
- -#define ESTRPIPE 86
- -#define EUSERS 87
- -#define ENOTSOCK 88
- -#define EDESTADDRREQ 89
- -#define EMSGSIZE 90
- -#define EPROTOTYPE 91
- -#define ENOPROTOOPT 92
- -#define EPROTONOSUPPORT 93
- -#define ESOCKTNOSUPPORT 94
- -#define EOPNOTSUPP 95
- -#define ENOTSUP EOPNOTSUPP
- -#define EPFNOSUPPORT 96
- -#define EAFNOSUPPORT 97
- -#define EADDRINUSE 98
- -#define EADDRNOTAVAIL 99
- -#define ENETDOWN 100
- -#define ENETUNREACH 101
- -#define ENETRESET 102
- -#define ECONNABORTED 103
- -#define ECONNRESET 104
- -#define ENOBUFS 105
- -#define EISCONN 106
- -#define ENOTCONN 107
- -#define ESHUTDOWN 108
- -#define ETOOMANYREFS 109
- -#define ETIMEDOUT 110
- -#define ECONNREFUSED 111
- -#define EHOSTDOWN 112
- -#define EHOSTUNREACH 113
- -#define EALREADY 114
- -#define EINPROGRESS 115
- -#define ESTALE 116
- -#define EUCLEAN 117
- -#define ENOTNAM 118
- -#define ENAVAIL 119
- -#define EISNAM 120
- -#define EREMOTEIO 121
- -#define EDQUOT 122
- -#define ENOMEDIUM 123
- -#define EMEDIUMTYPE 124
- -#define ECANCELED 125
- -#define ENOKEY 126
- -#define EKEYEXPIRED 127
- -#define EKEYREVOKED 128
- -#define EKEYREJECTED 129
- -#define EOWNERDEAD 130
- -#define ENOTRECOVERABLE 131
- -#define ERFKILL 132
- -#define EHWPOISON 133
- --- a/arch/x86_64/bits/mman.h
- +++ b/arch/x86_64/bits/mman.h
- @@ -38,6 +38,7 @@
-
- #define MCL_CURRENT 1
- #define MCL_FUTURE 2
- +#define MCL_ONFAULT 4
-
- #if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
- #define MADV_NORMAL 0
- --- a/arch/x86_64/bits/sem.h
- +++ /dev/null
- @@ -1,16 +0,0 @@
- -struct semid_ds {
- - struct ipc_perm sem_perm;
- - time_t sem_otime;
- - time_t __unused1;
- - time_t sem_ctime;
- - time_t __unused2;
- -#if __BYTE_ORDER == __LITTLE_ENDIAN
- - unsigned short sem_nsems;
- - char __sem_nsems_pad[sizeof(time_t)-sizeof(short)];
- -#else
- - char __sem_nsems_pad[sizeof(time_t)-sizeof(short)];
- - unsigned short sem_nsems;
- -#endif
- - time_t __unused3;
- - time_t __unused4;
- -};
- --- a/arch/x86_64/bits/statfs.h
- +++ /dev/null
- @@ -1,7 +0,0 @@
- -struct statfs {
- - unsigned long f_type, f_bsize;
- - fsblkcnt_t f_blocks, f_bfree, f_bavail;
- - fsfilcnt_t f_files, f_ffree;
- - fsid_t f_fsid;
- - unsigned long f_namelen, f_frsize, f_flags, f_spare[4];
- -};
- --- a/arch/x86_64/bits/stdarg.h
- +++ /dev/null
- @@ -1,4 +0,0 @@
- -#define va_start(v,l) __builtin_va_start(v,l)
- -#define va_end(v) __builtin_va_end(v)
- -#define va_arg(v,l) __builtin_va_arg(v,l)
- -#define va_copy(d,s) __builtin_va_copy(d,s)
- --- a/arch/x86_64/bits/syscall.h
- +++ b/arch/x86_64/bits/syscall.h
- @@ -321,6 +321,9 @@
- #define __NR_kexec_file_load 320
- #define __NR_bpf 321
- #define __NR_execveat 322
- +#define __NR_userfaultfd 323
- +#define __NR_membarrier 324
- +#define __NR_mlock2 325
-
-
-
- @@ -649,3 +652,6 @@
- #define SYS_kexec_file_load 320
- #define SYS_bpf 321
- #define SYS_execveat 322
- +#define SYS_userfaultfd 323
- +#define SYS_membarrier 324
- +#define SYS_mlock2 325
- --- a/arch/x86_64/bits/termios.h
- +++ /dev/null
- @@ -1,160 +0,0 @@
- -struct termios
- -{
- - tcflag_t c_iflag;
- - tcflag_t c_oflag;
- - tcflag_t c_cflag;
- - tcflag_t c_lflag;
- - cc_t c_line;
- - cc_t c_cc[NCCS];
- - speed_t __c_ispeed;
- - speed_t __c_ospeed;
- -};
- -
- -#define VINTR 0
- -#define VQUIT 1
- -#define VERASE 2
- -#define VKILL 3
- -#define VEOF 4
- -#define VTIME 5
- -#define VMIN 6
- -#define VSWTC 7
- -#define VSTART 8
- -#define VSTOP 9
- -#define VSUSP 10
- -#define VEOL 11
- -#define VREPRINT 12
- -#define VDISCARD 13
- -#define VWERASE 14
- -#define VLNEXT 15
- -#define VEOL2 16
- -
- -#define IGNBRK 0000001
- -#define BRKINT 0000002
- -#define IGNPAR 0000004
- -#define PARMRK 0000010
- -#define INPCK 0000020
- -#define ISTRIP 0000040
- -#define INLCR 0000100
- -#define IGNCR 0000200
- -#define ICRNL 0000400
- -#define IUCLC 0001000
- -#define IXON 0002000
- -#define IXANY 0004000
- -#define IXOFF 0010000
- -#define IMAXBEL 0020000
- -#define IUTF8 0040000
- -
- -#define OPOST 0000001
- -#define OLCUC 0000002
- -#define ONLCR 0000004
- -#define OCRNL 0000010
- -#define ONOCR 0000020
- -#define ONLRET 0000040
- -#define OFILL 0000100
- -#define OFDEL 0000200
- -#define NLDLY 0000400
- -#define NL0 0000000
- -#define NL1 0000400
- -#define CRDLY 0003000
- -#define CR0 0000000
- -#define CR1 0001000
- -#define CR2 0002000
- -#define CR3 0003000
- -#define TABDLY 0014000
- -#define TAB0 0000000
- -#define TAB1 0004000
- -#define TAB2 0010000
- -#define TAB3 0014000
- -#define BSDLY 0020000
- -#define BS0 0000000
- -#define BS1 0020000
- -#define FFDLY 0100000
- -#define FF0 0000000
- -#define FF1 0100000
- -
- -#define VTDLY 0040000
- -#define VT0 0000000
- -#define VT1 0040000
- -
- -#define B0 0000000
- -#define B50 0000001
- -#define B75 0000002
- -#define B110 0000003
- -#define B134 0000004
- -#define B150 0000005
- -#define B200 0000006
- -#define B300 0000007
- -#define B600 0000010
- -#define B1200 0000011
- -#define B1800 0000012
- -#define B2400 0000013
- -#define B4800 0000014
- -#define B9600 0000015
- -#define B19200 0000016
- -#define B38400 0000017
- -
- -#define B57600 0010001
- -#define B115200 0010002
- -#define B230400 0010003
- -#define B460800 0010004
- -#define B500000 0010005
- -#define B576000 0010006
- -#define B921600 0010007
- -#define B1000000 0010010
- -#define B1152000 0010011
- -#define B1500000 0010012
- -#define B2000000 0010013
- -#define B2500000 0010014
- -#define B3000000 0010015
- -#define B3500000 0010016
- -#define B4000000 0010017
- -
- -#define CBAUD 0010017
- -
- -#define CSIZE 0000060
- -#define CS5 0000000
- -#define CS6 0000020
- -#define CS7 0000040
- -#define CS8 0000060
- -#define CSTOPB 0000100
- -#define CREAD 0000200
- -#define PARENB 0000400
- -#define PARODD 0001000
- -#define HUPCL 0002000
- -#define CLOCAL 0004000
- -
- -#define ISIG 0000001
- -#define ICANON 0000002
- -#define ECHO 0000010
- -#define ECHOE 0000020
- -#define ECHOK 0000040
- -#define ECHONL 0000100
- -#define NOFLSH 0000200
- -#define TOSTOP 0000400
- -#define IEXTEN 0100000
- -
- -#define ECHOCTL 0001000
- -#define ECHOPRT 0002000
- -#define ECHOKE 0004000
- -#define FLUSHO 0010000
- -#define PENDIN 0040000
- -
- -#define TCOOFF 0
- -#define TCOON 1
- -#define TCIOFF 2
- -#define TCION 3
- -
- -#define TCIFLUSH 0
- -#define TCOFLUSH 1
- -#define TCIOFLUSH 2
- -
- -#define TCSANOW 0
- -#define TCSADRAIN 1
- -#define TCSAFLUSH 2
- -
- -#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
- -#define CBAUDEX 0010000
- -#define CRTSCTS 020000000000
- -#define EXTPROC 0200000
- -#define XTABS 0014000
- -#endif
- --- a/arch/x86_64/pthread_arch.h
- +++ b/arch/x86_64/pthread_arch.h
- @@ -7,4 +7,4 @@ static inline struct pthread *__pthread_
-
- #define TP_ADJ(p) (p)
-
- -#define CANCEL_REG_IP 16
- +#define MC_PC gregs[REG_RIP]
- --- a/configure
- +++ b/configure
- @@ -9,6 +9,9 @@ VAR=VALUE. See below for descriptions o
-
- Defaults for the options are specified in brackets.
-
- +Configuration:
- + --srcdir=DIR source directory [detected]
- +
- Installation directories:
- --prefix=PREFIX main installation prefix [/usr/local/musl]
- --exec-prefix=EPREFIX installation prefix for executable files [PREFIX]
- @@ -117,6 +120,7 @@ CFLAGS_TRY=
- LDFLAGS_AUTO=
- LDFLAGS_TRY=
- OPTIMIZE_GLOBS=
- +srcdir=
- prefix=/usr/local/musl
- exec_prefix='$(prefix)'
- bindir='$(exec_prefix)/bin'
- @@ -139,6 +143,7 @@ clang_wrapper=no
- for arg ; do
- case "$arg" in
- --help) usage ;;
- +--srcdir=*) srcdir=${arg#*=} ;;
- --prefix=*) prefix=${arg#*=} ;;
- --exec-prefix=*) exec_prefix=${arg#*=} ;;
- --bindir=*) bindir=${arg#*=} ;;
- @@ -179,11 +184,23 @@ LIBCC=*) LIBCC=${arg#*=} ;;
- esac
- done
-
- -for i in prefix exec_prefix bindir libdir includedir syslibdir ; do
- +for i in srcdir prefix exec_prefix bindir libdir includedir syslibdir ; do
- stripdir $i
- done
-
- #
- +# Get the source dir for out-of-tree builds
- +#
- +if test -z "$srcdir" ; then
- +srcdir="${0%/configure}"
- +stripdir srcdir
- +fi
- +abs_builddir="$(pwd)" || fail "$0: cannot determine working directory"
- +abs_srcdir="$(cd $srcdir && pwd)" || fail "$0: invalid source directory $srcdir"
- +test "$abs_srcdir" = "$abs_builddir" && srcdir=.
- +test "$srcdir" != "." -a -f Makefile -a ! -h Makefile && fail "$0: Makefile already exists in the working directory"
- +
- +#
- # Get a temp filename we can use
- #
- i=0
- @@ -263,11 +280,11 @@ fi
- fi
-
- if test "$gcc_wrapper" = yes ; then
- -tools="$tools tools/musl-gcc"
- +tools="$tools obj/musl-gcc"
- tool_libs="$tool_libs lib/musl-gcc.specs"
- fi
- if test "$clang_wrapper" = yes ; then
- -tools="$tools tools/musl-clang tools/ld.musl-clang"
- +tools="$tools obj/musl-clang obj/ld.musl-clang"
- fi
-
- #
- @@ -321,7 +338,7 @@ __attribute__((__may_alias__))
- #endif
- x;
- EOF
- -if $CC $CFLAGS_C99FSE -I./arch/$ARCH -I./include $CPPFLAGS $CFLAGS \
- +if $CC $CFLAGS_C99FSE $CPPFLAGS $CFLAGS \
- -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then
- printf "no\n"
- else
- @@ -330,6 +347,13 @@ CFLAGS_C99FSE="$CFLAGS_C99FSE -D__may_al
- fi
-
- #
- +# The GNU toolchain defaults to assuming unmarked files need an
- +# executable stack, potentially exposing vulnerabilities in programs
- +# linked with such object files. Fix this.
- +#
- +tryflag CFLAGS_C99FSE -Wa,--noexecstack
- +
- +#
- # Check for options to disable stack protector, which needs to be
- # disabled for a few early-bootstrap translation units. If not found,
- # this is not an error; we assume the toolchain does not do ssp.
- @@ -430,11 +454,15 @@ tryflag CFLAGS_AUTO -fno-unwind-tables
- tryflag CFLAGS_AUTO -fno-asynchronous-unwind-tables
-
- #
- -# The GNU toolchain defaults to assuming unmarked files need an
- -# executable stack, potentially exposing vulnerabilities in programs
- -# linked with such object files. Fix this.
- +# Attempt to put each function and each data object in its own
- +# section. This both allows additional size optimizations at link
- +# time and works around a dangerous class of compiler/assembler bugs
- +# whereby relative address expressions are constant-folded by the
- +# assembler even when one or more of the symbols involved is
- +# replaceable. See gas pr 18561 and gcc pr 66609, 68178, etc.
- #
- -tryflag CFLAGS_AUTO -Wa,--noexecstack
- +tryflag CFLAGS_AUTO -ffunction-sections
- +tryflag CFLAGS_AUTO -fdata-sections
-
- #
- # On x86, make sure we don't have incompatible instruction set
- @@ -489,7 +517,7 @@ int foo(void) { }
- int bar(void) { fp = foo; return foo(); }
- EOF
- if $CC $CFLAGS_C99FSE $CPPFLAGS $CFLAGS \
- - -DSHARED -fPIC -I./src/internal -include vis.h \
- + -DSHARED -fPIC -I$srcdir/src/internal -include vis.h \
- -nostdlib -shared -Wl,-Bsymbolic-functions \
- -o /dev/null "$tmpc" >/dev/null 2>&1 ; then
- visibility=yes
- @@ -504,6 +532,25 @@ CFLAGS_AUTO="$CFLAGS_AUTO -include vis.h
- CFLAGS_AUTO="${CFLAGS_AUTO# }"
- fi
-
- +# Determine if the compiler produces position-independent code (PIC)
- +# by default. If so, we don't need to compile separate object files
- +# for libc.a and libc.so.
- +if trycppif __PIC__ "$CFLAGS_C99FSE $CPPFLAGS $CFLAGS" ; then
- +pic_default=yes
- +else
- +pic_default=no
- +fi
- +
- +# Reduce space lost to padding for alignment purposes by sorting data
- +# objects according to their alignment reqirements. This approximates
- +# optimal packing.
- +tryldflag LDFLAGS_AUTO -Wl,--sort-section,alignment
- +tryldflag LDFLAGS_AUTO -Wl,--sort-common
- +
- +# When linking shared library, drop dummy weak definitions that were
- +# replaced by strong definitions from other translation units.
- +tryldflag LDFLAGS_AUTO -Wl,--gc-sections
- +
- # Some patched GCC builds have these defaults messed up...
- tryldflag LDFLAGS_AUTO -Wl,--hash-style=both
-
- @@ -513,6 +560,11 @@ tryldflag LDFLAGS_AUTO -Wl,--hash-style=
- # runtime library; implementation error is also a possibility.
- tryldflag LDFLAGS_AUTO -Wl,--no-undefined
-
- +# Avoid exporting symbols from compiler runtime libraries. They
- +# should be hidden anyway, but some toolchains including old gcc
- +# versions built without shared library support and pcc are broken.
- +tryldflag LDFLAGS_AUTO -Wl,--exclude-libs=ALL
- +
- test "$shared" = "no" || {
- # Disable dynamic linking if ld is broken and can't do -Bsymbolic-functions
- LDFLAGS_DUMMY=
- @@ -599,8 +651,9 @@ echo '#include <float.h>' > "$tmpc"
- echo '#if LDBL_MANT_DIG == 53' >> "$tmpc"
- echo 'typedef char ldcheck[9-(int)sizeof(long double)];' >> "$tmpc"
- echo '#endif' >> "$tmpc"
- -if $CC $CFLAGS_C99FSE -I./arch/$ARCH -I./include $CPPFLAGS $CFLAGS \
- - -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then
- +if $CC $CFLAGS_C99FSE \
- + -I$srcdir/arch/$ARCH -I$srcdir/arch/generic -I$srcdir/include \
- + $CPPFLAGS $CFLAGS -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then
- printf "yes\n"
- else
- printf "no\n"
- @@ -622,6 +675,7 @@ cat << EOF
- ARCH = $ARCH
- SUBARCH = $SUBARCH
- ASMSUBARCH = $ASMSUBARCH
- +srcdir = $srcdir
- prefix = $prefix
- exec_prefix = $exec_prefix
- bindir = $bindir
- @@ -629,12 +683,14 @@ libdir = $libdir
- includedir = $includedir
- syslibdir = $syslibdir
- CC = $CC
- -CFLAGS = $CFLAGS_AUTO $CFLAGS
- +CFLAGS = $CFLAGS
- +CFLAGS_AUTO = $CFLAGS_AUTO
- CFLAGS_C99FSE = $CFLAGS_C99FSE
- CFLAGS_MEMOPS = $CFLAGS_MEMOPS
- CFLAGS_NOSSP = $CFLAGS_NOSSP
- CPPFLAGS = $CPPFLAGS
- -LDFLAGS = $LDFLAGS_AUTO $LDFLAGS
- +LDFLAGS = $LDFLAGS
- +LDFLAGS_AUTO = $LDFLAGS_AUTO
- CROSS_COMPILE = $CROSS_COMPILE
- LIBCC = $LIBCC
- OPTIMIZE_GLOBS = $OPTIMIZE_GLOBS
- @@ -646,6 +702,9 @@ test "x$static" = xno && echo "STATIC_LI
- test "x$shared" = xno && echo "SHARED_LIBS ="
- test "x$cc_family" = xgcc && echo 'WRAPCC_GCC = $(CC)'
- test "x$cc_family" = xclang && echo 'WRAPCC_CLANG = $(CC)'
- +test "x$pic_default" = xyes && echo 'AOBJS = $(LOBJS)'
- exec 1>&3 3>&-
-
- +test "$srcdir" = "." || ln -sf $srcdir/Makefile .
- +
- printf "done\n"
- --- a/crt/arm/crti.s
- +++ b/crt/arm/crti.s
- @@ -1,3 +1,5 @@
- +.syntax unified
- +
- .section .init
- .global _init
- .type _init,%function
- --- a/crt/arm/crtn.s
- +++ b/crt/arm/crtn.s
- @@ -1,11 +1,9 @@
- +.syntax unified
- +
- .section .init
- pop {r0,lr}
- - tst lr,#1
- - moveq pc,lr
- bx lr
-
- .section .fini
- pop {r0,lr}
- - tst lr,#1
- - moveq pc,lr
- bx lr
- --- a/crt/rcrt1.c
- +++ b/crt/rcrt1.c
- @@ -1,7 +1,7 @@
- #define SHARED
- #define START "_start"
- #define _dlstart_c _start_c
- -#include "../src/ldso/dlstart.c"
- +#include "../ldso/dlstart.c"
-
- int main();
- void _init() __attribute__((weak));
- --- a/include/complex.h
- +++ b/include/complex.h
- @@ -116,7 +116,7 @@ long double creall(long double complex);
-
- #if __STDC_VERSION__ >= 201112L
- #if defined(_Imaginary_I)
- -#define __CMPLX(x, y, t) ((t)(x) + _Imaginary_I*(t)(y)))
- +#define __CMPLX(x, y, t) ((t)(x) + _Imaginary_I*(t)(y))
- #elif defined(__clang__)
- #define __CMPLX(x, y, t) (+(_Complex t){ (t)(x), (t)(y) })
- #else
- --- a/include/netinet/in.h
- +++ b/include/netinet/in.h
- @@ -103,6 +103,7 @@ uint16_t ntohs(uint16_t);
- #define IPPROTO_SCTP 132
- #define IPPROTO_MH 135
- #define IPPROTO_UDPLITE 136
- +#define IPPROTO_MPLS 137
- #define IPPROTO_RAW 255
- #define IPPROTO_MAX 256
-
- @@ -200,6 +201,7 @@ uint16_t ntohs(uint16_t);
- #define IP_MINTTL 21
- #define IP_NODEFRAG 22
- #define IP_CHECKSUM 23
- +#define IP_BIND_ADDRESS_NO_PORT 24
- #define IP_MULTICAST_IF 32
- #define IP_MULTICAST_TTL 33
- #define IP_MULTICAST_LOOP 34
- --- a/include/netinet/tcp.h
- +++ b/include/netinet/tcp.h
- @@ -27,6 +27,9 @@
- #define TCP_FASTOPEN 23
- #define TCP_TIMESTAMP 24
- #define TCP_NOTSENT_LOWAT 25
- +#define TCP_CC_INFO 26
- +#define TCP_SAVE_SYN 27
- +#define TCP_SAVED_SYN 28
-
- #define TCP_ESTABLISHED 1
- #define TCP_SYN_SENT 2
- @@ -41,7 +44,20 @@
- #define TCP_CLOSING 11
-
- #if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
- +#define TCPOPT_EOL 0
- +#define TCPOPT_NOP 1
- +#define TCPOPT_MAXSEG 2
- +#define TCPOPT_WINDOW 3
- +#define TCPOPT_SACK_PERMITTED 4
- +#define TCPOPT_SACK 5
- +#define TCPOPT_TIMESTAMP 8
- +#define TCPOLEN_SACK_PERMITTED 2
- +#define TCPOLEN_WINDOW 3
- +#define TCPOLEN_MAXSEG 4
- +#define TCPOLEN_TIMESTAMP 10
- +
- #define SOL_TCP 6
- +
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <stdint.h>
- @@ -164,6 +180,10 @@ struct tcp_info
- uint32_t tcpi_total_retrans;
- uint64_t tcpi_pacing_rate;
- uint64_t tcpi_max_pacing_rate;
- + uint64_t tcpi_bytes_acked;
- + uint64_t tcpi_bytes_received;
- + uint32_t tcpi_segs_out;
- + uint32_t tcpi_segs_in;
- };
-
- #define TCP_MD5SIG_MAXKEYLEN 80
- --- a/include/netpacket/packet.h
- +++ b/include/netpacket/packet.h
- @@ -32,10 +32,27 @@ struct packet_mreq {
- #define PACKET_RECV_OUTPUT 3
- #define PACKET_RX_RING 5
- #define PACKET_STATISTICS 6
- +#define PACKET_COPY_THRESH 7
- +#define PACKET_AUXDATA 8
- +#define PACKET_ORIGDEV 9
- +#define PACKET_VERSION 10
- +#define PACKET_HDRLEN 11
- +#define PACKET_RESERVE 12
- +#define PACKET_TX_RING 13
- +#define PACKET_LOSS 14
- +#define PACKET_VNET_HDR 15
- +#define PACKET_TX_TIMESTAMP 16
- +#define PACKET_TIMESTAMP 17
- +#define PACKET_FANOUT 18
- +#define PACKET_TX_HAS_OFF 19
- +#define PACKET_QDISC_BYPASS 20
- +#define PACKET_ROLLOVER_STATS 21
- +#define PACKET_FANOUT_DATA 22
-
- #define PACKET_MR_MULTICAST 0
- #define PACKET_MR_PROMISC 1
- #define PACKET_MR_ALLMULTI 2
- +#define PACKET_MR_UNICAST 3
-
- #ifdef __cplusplus
- }
- --- a/include/signal.h
- +++ b/include/signal.h
- @@ -27,8 +27,6 @@ extern "C" {
-
- #include <bits/alltypes.h>
-
- -#define SIG_HOLD ((void (*)(int)) 2)
- -
- #define SIG_BLOCK 0
- #define SIG_UNBLOCK 1
- #define SIG_SETMASK 2
- @@ -43,6 +41,18 @@ extern "C" {
- #define SI_USER 0
- #define SI_KERNEL 128
-
- +typedef struct sigaltstack stack_t;
- +
- +#endif
- +
- +#include <bits/signal.h>
- +
- +#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
- + || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
- + || defined(_BSD_SOURCE)
- +
- +#define SIG_HOLD ((void (*)(int)) 2)
- +
- #define FPE_INTDIV 1
- #define FPE_INTOVF 2
- #define FPE_FLTDIV 3
- @@ -78,15 +88,17 @@ extern "C" {
- #define CLD_STOPPED 5
- #define CLD_CONTINUED 6
-
- -typedef struct sigaltstack stack_t;
- -
- union sigval {
- int sival_int;
- void *sival_ptr;
- };
-
- typedef struct {
- +#ifdef __SI_SWAP_ERRNO_CODE
- + int si_signo, si_code, si_errno;
- +#else
- int si_signo, si_errno, si_code;
- +#endif
- union {
- char __pad[128 - 2*sizeof(int) - sizeof(long)];
- struct {
- @@ -240,8 +252,6 @@ int sigandset(sigset_t *, const sigset_t
- #define SA_ONESHOT SA_RESETHAND
- #endif
-
- -#include <bits/signal.h>
- -
- #define SIG_ERR ((void (*)(int))-1)
- #define SIG_DFL ((void (*)(int)) 0)
- #define SIG_IGN ((void (*)(int)) 1)
- --- a/include/sys/mman.h
- +++ b/include/sys/mman.h
- @@ -39,6 +39,7 @@ int remap_file_pages (void *, size_t, in
- #endif
-
- #if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
- +#define MLOCK_ONFAULT 0x01
- int madvise (void *, size_t, int);
- int mincore (void *, size_t, unsigned char *);
- #endif
- --- a/include/sys/mount.h
- +++ b/include/sys/mount.h
- @@ -46,12 +46,13 @@ extern "C" {
- #define MS_KERNMOUNT (1<<22)
- #define MS_I_VERSION (1<<23)
- #define MS_STRICTATIME (1<<24)
- +#define MS_LAZYTIME (1<<25)
- #define MS_NOSEC (1<<28)
- #define MS_BORN (1<<29)
- #define MS_ACTIVE (1<<30)
- #define MS_NOUSER (1U<<31)
-
- -#define MS_RMT_MASK (MS_RDONLY|MS_SYNCHRONOUS|MS_MANDLOCK|MS_I_VERSION)
- +#define MS_RMT_MASK (MS_RDONLY|MS_SYNCHRONOUS|MS_MANDLOCK|MS_I_VERSION|MS_LAZYTIME)
-
- #define MS_MGC_VAL 0xc0ed0000
- #define MS_MGC_MSK 0xffff0000
- --- a/include/sys/prctl.h
- +++ b/include/sys/prctl.h
- @@ -124,6 +124,12 @@ struct prctl_mm_map {
- #define PR_FP_MODE_FR (1 << 0)
- #define PR_FP_MODE_FRE (1 << 1)
-
- +#define PR_CAP_AMBIENT 47
- +#define PR_CAP_AMBIENT_IS_SET 1
- +#define PR_CAP_AMBIENT_RAISE 2
- +#define PR_CAP_AMBIENT_LOWER 3
- +#define PR_CAP_AMBIENT_CLEAR_ALL 4
- +
- int prctl (int, ...);
-
- #ifdef __cplusplus
- --- a/include/sys/ptrace.h
- +++ b/include/sys/ptrace.h
- @@ -39,6 +39,7 @@ extern "C" {
- #define PTRACE_PEEKSIGINFO 0x4209
- #define PTRACE_GETSIGMASK 0x420a
- #define PTRACE_SETSIGMASK 0x420b
- +#define PTRACE_SECCOMP_GET_FILTER 0x420c
-
- #define PT_READ_I PTRACE_PEEKTEXT
- #define PT_READ_D PTRACE_PEEKDATA
- @@ -72,7 +73,8 @@ extern "C" {
- #define PTRACE_O_TRACEEXIT 0x00000040
- #define PTRACE_O_TRACESECCOMP 0x00000080
- #define PTRACE_O_EXITKILL 0x00100000
- -#define PTRACE_O_MASK 0x001000ff
- +#define PTRACE_O_SUSPEND_SECCOMP 0x00200000
- +#define PTRACE_O_MASK 0x003000ff
-
- #define PTRACE_EVENT_FORK 1
- #define PTRACE_EVENT_VFORK 2
- --- a/include/sys/socket.h
- +++ b/include/sys/socket.h
- @@ -96,6 +96,7 @@ struct linger
- #define PF_WANPIPE 25
- #define PF_LLC 26
- #define PF_IB 27
- +#define PF_MPLS 28
- #define PF_CAN 29
- #define PF_TIPC 30
- #define PF_BLUETOOTH 31
- @@ -141,6 +142,7 @@ struct linger
- #define AF_WANPIPE PF_WANPIPE
- #define AF_LLC PF_LLC
- #define AF_IB PF_IB
- +#define AF_MPLS PF_MPLS
- #define AF_CAN PF_CAN
- #define AF_TIPC PF_TIPC
- #define AF_BLUETOOTH PF_BLUETOOTH
- @@ -255,6 +257,7 @@ struct linger
- #define MSG_NOSIGNAL 0x4000
- #define MSG_MORE 0x8000
- #define MSG_WAITFORONE 0x10000
- +#define MSG_FASTOPEN 0x20000000
- #define MSG_CMSG_CLOEXEC 0x40000000
-
- #define __CMSG_LEN(cmsg) (((cmsg)->cmsg_len + sizeof(long) - 1) & ~(long)(sizeof(long) - 1))
- --- /dev/null
- +++ b/ldso/dlstart.c
- @@ -0,0 +1,146 @@
- +#include <stddef.h>
- +#include "dynlink.h"
- +
- +#ifndef START
- +#define START "_dlstart"
- +#endif
- +
- +#include "crt_arch.h"
- +
- +#ifndef GETFUNCSYM
- +#define GETFUNCSYM(fp, sym, got) do { \
- + __attribute__((__visibility__("hidden"))) void sym(); \
- + static void (*static_func_ptr)() = sym; \
- + __asm__ __volatile__ ( "" : "+m"(static_func_ptr) : : "memory"); \
- + *(fp) = static_func_ptr; } while(0)
- +#endif
- +
- +__attribute__((__visibility__("hidden")))
- +void _dlstart_c(size_t *sp, size_t *dynv)
- +{
- + size_t i, aux[AUX_CNT], dyn[DYN_CNT];
- + size_t *rel, rel_size, base;
- +
- + int argc = *sp;
- + char **argv = (void *)(sp+1);
- +
- + for (i=argc+1; argv[i]; i++);
- + size_t *auxv = (void *)(argv+i+1);
- +
- + for (i=0; i<AUX_CNT; i++) aux[i] = 0;
- + for (i=0; auxv[i]; i+=2) if (auxv[i]<AUX_CNT)
- + aux[auxv[i]] = auxv[i+1];
- +
- +#if DL_FDPIC
- + struct fdpic_loadseg *segs, fakeseg;
- + size_t j;
- + if (dynv) {
- + /* crt_arch.h entry point asm is responsible for reserving
- + * space and moving the extra fdpic arguments to the stack
- + * vector where they are easily accessible from C. */
- + segs = ((struct fdpic_loadmap *)(sp[-1] ? sp[-1] : sp[-2]))->segs;
- + } else {
- + /* If dynv is null, the entry point was started from loader
- + * that is not fdpic-aware. We can assume normal fixed-
- + * displacement ELF loading was performed, but when ldso was
- + * run as a command, finding the Ehdr is a heursitic: we
- + * have to assume Phdrs start in the first 4k of the file. */
- + base = aux[AT_BASE];
- + if (!base) base = aux[AT_PHDR] & -4096;
- + segs = &fakeseg;
- + segs[0].addr = base;
- + segs[0].p_vaddr = 0;
- + segs[0].p_memsz = -1;
- + Ehdr *eh = (void *)base;
- + Phdr *ph = (void *)(base + eh->e_phoff);
- + size_t phnum = eh->e_phnum;
- + size_t phent = eh->e_phentsize;
- + while (phnum-- && ph->p_type != PT_DYNAMIC)
- + ph = (void *)((size_t)ph + phent);
- + dynv = (void *)(base + ph->p_vaddr);
- + }
- +#endif
- +
- + for (i=0; i<DYN_CNT; i++) dyn[i] = 0;
- + for (i=0; dynv[i]; i+=2) if (dynv[i]<DYN_CNT)
- + dyn[dynv[i]] = dynv[i+1];
- +
- +#if DL_FDPIC
- + for (i=0; i<DYN_CNT; i++) {
- + if (i==DT_RELASZ || i==DT_RELSZ) continue;
- + if (!dyn[i]) continue;
- + for (j=0; dyn[i]-segs[j].p_vaddr >= segs[j].p_memsz; j++);
- + dyn[i] += segs[j].addr - segs[j].p_vaddr;
- + }
- + base = 0;
- +
- + const Sym *syms = (void *)dyn[DT_SYMTAB];
- +
- + rel = (void *)dyn[DT_RELA];
- + rel_size = dyn[DT_RELASZ];
- + for (; rel_size; rel+=3, rel_size-=3*sizeof(size_t)) {
- + if (!IS_RELATIVE(rel[1], syms)) continue;
- + for (j=0; rel[0]-segs[j].p_vaddr >= segs[j].p_memsz; j++);
- + size_t *rel_addr = (void *)
- + (rel[0] + segs[j].addr - segs[j].p_vaddr);
- + if (R_TYPE(rel[1]) == REL_FUNCDESC_VAL) {
- + *rel_addr += segs[rel_addr[1]].addr
- + - segs[rel_addr[1]].p_vaddr
- + + syms[R_SYM(rel[1])].st_value;
- + rel_addr[1] = dyn[DT_PLTGOT];
- + } else {
- + size_t val = syms[R_SYM(rel[1])].st_value;
- + for (j=0; val-segs[j].p_vaddr >= segs[j].p_memsz; j++);
- + *rel_addr = rel[2] + segs[j].addr - segs[j].p_vaddr + val;
- + }
- + }
- +#else
- + /* If the dynamic linker is invoked as a command, its load
- + * address is not available in the aux vector. Instead, compute
- + * the load address as the difference between &_DYNAMIC and the
- + * virtual address in the PT_DYNAMIC program header. */
- + base = aux[AT_BASE];
- + if (!base) {
- + size_t phnum = aux[AT_PHNUM];
- + size_t phentsize = aux[AT_PHENT];
- + Phdr *ph = (void *)aux[AT_PHDR];
- + for (i=phnum; i--; ph = (void *)((char *)ph + phentsize)) {
- + if (ph->p_type == PT_DYNAMIC) {
- + base = (size_t)dynv - ph->p_vaddr;
- + break;
- + }
- + }
- + }
- +
- + /* MIPS uses an ugly packed form for GOT relocations. Since we
- + * can't make function calls yet and the code is tiny anyway,
- + * it's simply inlined here. */
- + if (NEED_MIPS_GOT_RELOCS) {
- + size_t local_cnt = 0;
- + size_t *got = (void *)(base + dyn[DT_PLTGOT]);
- + for (i=0; dynv[i]; i+=2) if (dynv[i]==DT_MIPS_LOCAL_GOTNO)
- + local_cnt = dynv[i+1];
- + for (i=0; i<local_cnt; i++) got[i] += base;
- + }
- +
- + rel = (void *)(base+dyn[DT_REL]);
- + rel_size = dyn[DT_RELSZ];
- + for (; rel_size; rel+=2, rel_size-=2*sizeof(size_t)) {
- + if (!IS_RELATIVE(rel[1], 0)) continue;
- + size_t *rel_addr = (void *)(base + rel[0]);
- + *rel_addr += base;
- + }
- +
- + rel = (void *)(base+dyn[DT_RELA]);
- + rel_size = dyn[DT_RELASZ];
- + for (; rel_size; rel+=3, rel_size-=3*sizeof(size_t)) {
- + if (!IS_RELATIVE(rel[1], 0)) continue;
- + size_t *rel_addr = (void *)(base + rel[0]);
- + *rel_addr = base + rel[2];
- + }
- +#endif
- +
- + stage2_func dls2;
- + GETFUNCSYM(&dls2, __dls2, base+dyn[DT_PLTGOT]);
- + dls2((void *)base, sp);
- +}
- --- /dev/null
- +++ b/ldso/dynlink.c
- @@ -0,0 +1,1931 @@
- +#define _GNU_SOURCE
- +#include <stdio.h>
- +#include <stdlib.h>
- +#include <stdarg.h>
- +#include <stddef.h>
- +#include <string.h>
- +#include <unistd.h>
- +#include <stdint.h>
- +#include <elf.h>
- +#include <sys/mman.h>
- +#include <limits.h>
- +#include <fcntl.h>
- +#include <sys/stat.h>
- +#include <errno.h>
- +#include <link.h>
- +#include <setjmp.h>
- +#include <pthread.h>
- +#include <ctype.h>
- +#include <dlfcn.h>
- +#include "pthread_impl.h"
- +#include "libc.h"
- +#include "dynlink.h"
- +
- +static void error(const char *, ...);
- +
- +#define MAXP2(a,b) (-(-(a)&-(b)))
- +#define ALIGN(x,y) ((x)+(y)-1 & -(y))
- +
- +struct debug {
- + int ver;
- + void *head;
- + void (*bp)(void);
- + int state;
- + void *base;
- +};
- +
- +struct td_index {
- + size_t args[2];
- + struct td_index *next;
- +};
- +
- +struct dso {
- +#if DL_FDPIC
- + struct fdpic_loadmap *loadmap;
- +#else
- + unsigned char *base;
- +#endif
- + char *name;
- + size_t *dynv;
- + struct dso *next, *prev;
- +
- + Phdr *phdr;
- + int phnum;
- + size_t phentsize;
- + int refcnt;
- + Sym *syms;
- + uint32_t *hashtab;
- + uint32_t *ghashtab;
- + int16_t *versym;
- + char *strings;
- + unsigned char *map;
- + size_t map_len;
- + dev_t dev;
- + ino_t ino;
- + signed char global;
- + char relocated;
- + char constructed;
- + char kernel_mapped;
- + struct dso **deps, *needed_by;
- + char *rpath_orig, *rpath;
- + struct tls_module tls;
- + size_t tls_id;
- + size_t relro_start, relro_end;
- + void **new_dtv;
- + unsigned char *new_tls;
- + volatile int new_dtv_idx, new_tls_idx;
- + struct td_index *td_index;
- + struct dso *fini_next;
- + char *shortname;
- +#if DL_FDPIC
- + unsigned char *base;
- +#else
- + struct fdpic_loadmap *loadmap;
- +#endif
- + struct funcdesc {
- + void *addr;
- + size_t *got;
- + } *funcdescs;
- + size_t *got;
- + char buf[];
- +};
- +
- +struct symdef {
- + Sym *sym;
- + struct dso *dso;
- +};
- +
- +int __init_tp(void *);
- +void __init_libc(char **, char *);
- +void *__copy_tls(unsigned char *);
- +
- +__attribute__((__visibility__("hidden")))
- +const char *__libc_get_version(void);
- +
- +static struct builtin_tls {
- + char c;
- + struct pthread pt;
- + void *space[16];
- +} builtin_tls[1];
- +#define MIN_TLS_ALIGN offsetof(struct builtin_tls, pt)
- +
- +#define ADDEND_LIMIT 4096
- +static size_t *saved_addends, *apply_addends_to;
- +
- +static struct dso ldso;
- +static struct dso *head, *tail, *fini_head;
- +static char *env_path, *sys_path;
- +static unsigned long long gencnt;
- +static int runtime;
- +static int ldd_mode;
- +static int ldso_fail;
- +static int noload;
- +static jmp_buf *rtld_fail;
- +static pthread_rwlock_t lock;
- +static struct debug debug;
- +static struct tls_module *tls_tail;
- +static size_t tls_cnt, tls_offset, tls_align = MIN_TLS_ALIGN;
- +static size_t static_tls_cnt;
- +static pthread_mutex_t init_fini_lock = { ._m_type = PTHREAD_MUTEX_RECURSIVE };
- +static struct fdpic_loadmap *app_loadmap;
- +static struct fdpic_dummy_loadmap app_dummy_loadmap;
- +
- +struct debug *_dl_debug_addr = &debug;
- +
- +__attribute__((__visibility__("hidden")))
- +void (*const __init_array_start)(void)=0, (*const __fini_array_start)(void)=0;
- +
- +__attribute__((__visibility__("hidden")))
- +extern void (*const __init_array_end)(void), (*const __fini_array_end)(void);
- +
- +weak_alias(__init_array_start, __init_array_end);
- +weak_alias(__fini_array_start, __fini_array_end);
- +
- +static int dl_strcmp(const char *l, const char *r)
- +{
- + for (; *l==*r && *l; l++, r++);
- + return *(unsigned char *)l - *(unsigned char *)r;
- +}
- +#define strcmp(l,r) dl_strcmp(l,r)
- +
- +/* Compute load address for a virtual address in a given dso. */
- +#if DL_FDPIC
- +static void *laddr(const struct dso *p, size_t v)
- +{
- + size_t j=0;
- + if (!p->loadmap) return p->base + v;
- + for (j=0; v-p->loadmap->segs[j].p_vaddr >= p->loadmap->segs[j].p_memsz; j++);
- + return (void *)(v - p->loadmap->segs[j].p_vaddr + p->loadmap->segs[j].addr);
- +}
- +#define fpaddr(p, v) ((void (*)())&(struct funcdesc){ \
- + laddr(p, v), (p)->got })
- +#else
- +#define laddr(p, v) (void *)((p)->base + (v))
- +#define fpaddr(p, v) ((void (*)())laddr(p, v))
- +#endif
- +
- +static void decode_vec(size_t *v, size_t *a, size_t cnt)
- +{
- + size_t i;
- + for (i=0; i<cnt; i++) a[i] = 0;
- + for (; v[0]; v+=2) if (v[0]-1<cnt-1) {
- + a[0] |= 1UL<<v[0];
- + a[v[0]] = v[1];
- + }
- +}
- +
- +static int search_vec(size_t *v, size_t *r, size_t key)
- +{
- + for (; v[0]!=key; v+=2)
- + if (!v[0]) return 0;
- + *r = v[1];
- + return 1;
- +}
- +
- +static uint32_t sysv_hash(const char *s0)
- +{
- + const unsigned char *s = (void *)s0;
- + uint_fast32_t h = 0;
- + while (*s) {
- + h = 16*h + *s++;
- + h ^= h>>24 & 0xf0;
- + }
- + return h & 0xfffffff;
- +}
- +
- +static uint32_t gnu_hash(const char *s0)
- +{
- + const unsigned char *s = (void *)s0;
- + uint_fast32_t h = 5381;
- + for (; *s; s++)
- + h += h*32 + *s;
- + return h;
- +}
- +
- +static Sym *sysv_lookup(const char *s, uint32_t h, struct dso *dso)
- +{
- + size_t i;
- + Sym *syms = dso->syms;
- + uint32_t *hashtab = dso->hashtab;
- + char *strings = dso->strings;
- + for (i=hashtab[2+h%hashtab[0]]; i; i=hashtab[2+hashtab[0]+i]) {
- + if ((!dso->versym || dso->versym[i] >= 0)
- + && (!strcmp(s, strings+syms[i].st_name)))
- + return syms+i;
- + }
- + return 0;
- +}
- +
- +static Sym *gnu_lookup(uint32_t h1, uint32_t *hashtab, struct dso *dso, const char *s)
- +{
- + uint32_t nbuckets = hashtab[0];
- + uint32_t *buckets = hashtab + 4 + hashtab[2]*(sizeof(size_t)/4);
- + uint32_t i = buckets[h1 % nbuckets];
- +
- + if (!i) return 0;
- +
- + uint32_t *hashval = buckets + nbuckets + (i - hashtab[1]);
- +
- + for (h1 |= 1; ; i++) {
- + uint32_t h2 = *hashval++;
- + if ((h1 == (h2|1)) && (!dso->versym || dso->versym[i] >= 0)
- + && !strcmp(s, dso->strings + dso->syms[i].st_name))
- + return dso->syms+i;
- + if (h2 & 1) break;
- + }
- +
- + return 0;
- +}
- +
- +static Sym *gnu_lookup_filtered(uint32_t h1, uint32_t *hashtab, struct dso *dso, const char *s, uint32_t fofs, size_t fmask)
- +{
- + const size_t *bloomwords = (const void *)(hashtab+4);
- + size_t f = bloomwords[fofs & (hashtab[2]-1)];
- + if (!(f & fmask)) return 0;
- +
- + f >>= (h1 >> hashtab[3]) % (8 * sizeof f);
- + if (!(f & 1)) return 0;
- +
- + return gnu_lookup(h1, hashtab, dso, s);
- +}
- +
- +#define OK_TYPES (1<<STT_NOTYPE | 1<<STT_OBJECT | 1<<STT_FUNC | 1<<STT_COMMON | 1<<STT_TLS)
- +#define OK_BINDS (1<<STB_GLOBAL | 1<<STB_WEAK | 1<<STB_GNU_UNIQUE)
- +
- +#ifndef ARCH_SYM_REJECT_UND
- +#define ARCH_SYM_REJECT_UND(s) 0
- +#endif
- +
- +static struct symdef find_sym(struct dso *dso, const char *s, int need_def)
- +{
- + uint32_t h = 0, gh, gho, *ght;
- + size_t ghm = 0;
- + struct symdef def = {0};
- + for (; dso; dso=dso->next) {
- + Sym *sym;
- + if (!dso->global) continue;
- + if ((ght = dso->ghashtab)) {
- + if (!ghm) {
- + gh = gnu_hash(s);
- + int maskbits = 8 * sizeof ghm;
- + gho = gh / maskbits;
- + ghm = 1ul << gh % maskbits;
- + }
- + sym = gnu_lookup_filtered(gh, ght, dso, s, gho, ghm);
- + } else {
- + if (!h) h = sysv_hash(s);
- + sym = sysv_lookup(s, h, dso);
- + }
- + if (!sym) continue;
- + if (!sym->st_shndx)
- + if (need_def || (sym->st_info&0xf) == STT_TLS
- + || ARCH_SYM_REJECT_UND(sym))
- + continue;
- + if (!sym->st_value)
- + if ((sym->st_info&0xf) != STT_TLS)
- + continue;
- + if (!(1<<(sym->st_info&0xf) & OK_TYPES)) continue;
- + if (!(1<<(sym->st_info>>4) & OK_BINDS)) continue;
- +
- + if (def.sym && sym->st_info>>4 == STB_WEAK) continue;
- + def.sym = sym;
- + def.dso = dso;
- + if (sym->st_info>>4 == STB_GLOBAL) break;
- + }
- + return def;
- +}
- +
- +__attribute__((__visibility__("hidden")))
- +ptrdiff_t __tlsdesc_static(), __tlsdesc_dynamic();
- +
- +static void do_relocs(struct dso *dso, size_t *rel, size_t rel_size, size_t stride)
- +{
- + unsigned char *base = dso->base;
- + Sym *syms = dso->syms;
- + char *strings = dso->strings;
- + Sym *sym;
- + const char *name;
- + void *ctx;
- + int type;
- + int sym_index;
- + struct symdef def;
- + size_t *reloc_addr;
- + size_t sym_val;
- + size_t tls_val;
- + size_t addend;
- + int skip_relative = 0, reuse_addends = 0, save_slot = 0;
- +
- + if (dso == &ldso) {
- + /* Only ldso's REL table needs addend saving/reuse. */
- + if (rel == apply_addends_to)
- + reuse_addends = 1;
- + skip_relative = 1;
- + }
- +
- + for (; rel_size; rel+=stride, rel_size-=stride*sizeof(size_t)) {
- + if (skip_relative && IS_RELATIVE(rel[1], dso->syms)) continue;
- + type = R_TYPE(rel[1]);
- + if (type == REL_NONE) continue;
- + sym_index = R_SYM(rel[1]);
- + reloc_addr = laddr(dso, rel[0]);
- + if (sym_index) {
- + sym = syms + sym_index;
- + name = strings + sym->st_name;
- + ctx = type==REL_COPY ? head->next : head;
- + def = (sym->st_info&0xf) == STT_SECTION
- + ? (struct symdef){ .dso = dso, .sym = sym }
- + : find_sym(ctx, name, type==REL_PLT);
- + if (!def.sym && (sym->st_shndx != SHN_UNDEF
- + || sym->st_info>>4 != STB_WEAK)) {
- + error("Error relocating %s: %s: symbol not found",
- + dso->name, name);
- + if (runtime) longjmp(*rtld_fail, 1);
- + continue;
- + }
- + } else {
- + sym = 0;
- + def.sym = 0;
- + def.dso = dso;
- + }
- +
- + if (stride > 2) {
- + addend = rel[2];
- + } else if (type==REL_GOT || type==REL_PLT|| type==REL_COPY) {
- + addend = 0;
- + } else if (reuse_addends) {
- + /* Save original addend in stage 2 where the dso
- + * chain consists of just ldso; otherwise read back
- + * saved addend since the inline one was clobbered. */
- + if (head==&ldso)
- + saved_addends[save_slot] = *reloc_addr;
- + addend = saved_addends[save_slot++];
- + } else {
- + addend = *reloc_addr;
- + }
- +
- + sym_val = def.sym ? (size_t)laddr(def.dso, def.sym->st_value) : 0;
- + tls_val = def.sym ? def.sym->st_value : 0;
- +
- + switch(type) {
- + case REL_NONE:
- + break;
- + case REL_OFFSET:
- + addend -= (size_t)reloc_addr;
- + case REL_SYMBOLIC:
- + case REL_GOT:
- + case REL_PLT:
- + *reloc_addr = sym_val + addend;
- + break;
- + case REL_RELATIVE:
- + *reloc_addr = (size_t)base + addend;
- + break;
- + case REL_SYM_OR_REL:
- + if (sym) *reloc_addr = sym_val + addend;
- + else *reloc_addr = (size_t)base + addend;
- + break;
- + case REL_COPY:
- + memcpy(reloc_addr, (void *)sym_val, sym->st_size);
- + break;
- + case REL_OFFSET32:
- + *(uint32_t *)reloc_addr = sym_val + addend
- + - (size_t)reloc_addr;
- + break;
- + case REL_FUNCDESC:
- + *reloc_addr = def.sym ? (size_t)(def.dso->funcdescs
- + + (def.sym - def.dso->syms)) : 0;
- + break;
- + case REL_FUNCDESC_VAL:
- + if ((sym->st_info&0xf) == STT_SECTION) *reloc_addr += sym_val;
- + else *reloc_addr = sym_val;
- + reloc_addr[1] = def.sym ? (size_t)def.dso->got : 0;
- + break;
- + case REL_DTPMOD:
- + *reloc_addr = def.dso->tls_id;
- + break;
- + case REL_DTPOFF:
- + *reloc_addr = tls_val + addend - DTP_OFFSET;
- + break;
- +#ifdef TLS_ABOVE_TP
- + case REL_TPOFF:
- + *reloc_addr = tls_val + def.dso->tls.offset + TPOFF_K + addend;
- + break;
- +#else
- + case REL_TPOFF:
- + *reloc_addr = tls_val - def.dso->tls.offset + addend;
- + break;
- + case REL_TPOFF_NEG:
- + *reloc_addr = def.dso->tls.offset - tls_val + addend;
- + break;
- +#endif
- + case REL_TLSDESC:
- + if (stride<3) addend = reloc_addr[1];
- + if (runtime && def.dso->tls_id >= static_tls_cnt) {
- + struct td_index *new = malloc(sizeof *new);
- + if (!new) {
- + error(
- + "Error relocating %s: cannot allocate TLSDESC for %s",
- + dso->name, sym ? name : "(local)" );
- + longjmp(*rtld_fail, 1);
- + }
- + new->next = dso->td_index;
- + dso->td_index = new;
- + new->args[0] = def.dso->tls_id;
- + new->args[1] = tls_val + addend;
- + reloc_addr[0] = (size_t)__tlsdesc_dynamic;
- + reloc_addr[1] = (size_t)new;
- + } else {
- + reloc_addr[0] = (size_t)__tlsdesc_static;
- +#ifdef TLS_ABOVE_TP
- + reloc_addr[1] = tls_val + def.dso->tls.offset
- + + TPOFF_K + addend;
- +#else
- + reloc_addr[1] = tls_val - def.dso->tls.offset
- + + addend;
- +#endif
- + }
- + break;
- + default:
- + error("Error relocating %s: unsupported relocation type %d",
- + dso->name, type);
- + if (runtime) longjmp(*rtld_fail, 1);
- + continue;
- + }
- + }
- +}
- +
- +/* A huge hack: to make up for the wastefulness of shared libraries
- + * needing at least a page of dirty memory even if they have no global
- + * data, we reclaim the gaps at the beginning and end of writable maps
- + * and "donate" them to the heap by setting up minimal malloc
- + * structures and then freeing them. */
- +
- +static void reclaim(struct dso *dso, size_t start, size_t end)
- +{
- + size_t *a, *z;
- + if (start >= dso->relro_start && start < dso->relro_end) start = dso->relro_end;
- + if (end >= dso->relro_start && end < dso->relro_end) end = dso->relro_start;
- + start = start + 6*sizeof(size_t)-1 & -4*sizeof(size_t);
- + end = (end & -4*sizeof(size_t)) - 2*sizeof(size_t);
- + if (start>end || end-start < 4*sizeof(size_t)) return;
- + a = laddr(dso, start);
- + z = laddr(dso, end);
- + a[-2] = 1;
- + a[-1] = z[0] = end-start + 2*sizeof(size_t) | 1;
- + z[1] = 1;
- + free(a);
- +}
- +
- +static void reclaim_gaps(struct dso *dso)
- +{
- + Phdr *ph = dso->phdr;
- + size_t phcnt = dso->phnum;
- +
- + if (DL_FDPIC) return; // FIXME
- + for (; phcnt--; ph=(void *)((char *)ph+dso->phentsize)) {
- + if (ph->p_type!=PT_LOAD) continue;
- + if ((ph->p_flags&(PF_R|PF_W))!=(PF_R|PF_W)) continue;
- + reclaim(dso, ph->p_vaddr & -PAGE_SIZE, ph->p_vaddr);
- + reclaim(dso, ph->p_vaddr+ph->p_memsz,
- + ph->p_vaddr+ph->p_memsz+PAGE_SIZE-1 & -PAGE_SIZE);
- + }
- +}
- +
- +static void *mmap_fixed(void *p, size_t n, int prot, int flags, int fd, off_t off)
- +{
- + static int no_map_fixed;
- + char *q;
- + if (!no_map_fixed) {
- + q = mmap(p, n, prot, flags|MAP_FIXED, fd, off);
- + if (!DL_NOMMU_SUPPORT || q != MAP_FAILED || errno != EINVAL)
- + return q;
- + no_map_fixed = 1;
- + }
- + /* Fallbacks for MAP_FIXED failure on NOMMU kernels. */
- + if (flags & MAP_ANONYMOUS) {
- + memset(p, 0, n);
- + return p;
- + }
- + ssize_t r;
- + if (lseek(fd, off, SEEK_SET) < 0) return MAP_FAILED;
- + for (q=p; n; q+=r, off+=r, n-=r) {
- + r = read(fd, q, n);
- + if (r < 0 && errno != EINTR) return MAP_FAILED;
- + if (!r) {
- + memset(q, 0, n);
- + break;
- + }
- + }
- + return p;
- +}
- +
- +static void unmap_library(struct dso *dso)
- +{
- + if (dso->loadmap) {
- + size_t i;
- + for (i=0; i<dso->loadmap->nsegs; i++) {
- + if (!dso->loadmap->segs[i].p_memsz)
- + continue;
- + munmap((void *)dso->loadmap->segs[i].addr,
- + dso->loadmap->segs[i].p_memsz);
- + }
- + free(dso->loadmap);
- + } else if (dso->map && dso->map_len) {
- + munmap(dso->map, dso->map_len);
- + }
- +}
- +
- +static void *map_library(int fd, struct dso *dso)
- +{
- + Ehdr buf[(896+sizeof(Ehdr))/sizeof(Ehdr)];
- + void *allocated_buf=0;
- + size_t phsize;
- + size_t addr_min=SIZE_MAX, addr_max=0, map_len;
- + size_t this_min, this_max;
- + size_t nsegs = 0;
- + off_t off_start;
- + Ehdr *eh;
- + Phdr *ph, *ph0;
- + unsigned prot;
- + unsigned char *map=MAP_FAILED, *base;
- + size_t dyn=0;
- + size_t tls_image=0;
- + size_t i;
- +
- + ssize_t l = read(fd, buf, sizeof buf);
- + eh = buf;
- + if (l<0) return 0;
- + if (l<sizeof *eh || (eh->e_type != ET_DYN && eh->e_type != ET_EXEC))
- + goto noexec;
- + phsize = eh->e_phentsize * eh->e_phnum;
- + if (phsize > sizeof buf - sizeof *eh) {
- + allocated_buf = malloc(phsize);
- + if (!allocated_buf) return 0;
- + l = pread(fd, allocated_buf, phsize, eh->e_phoff);
- + if (l < 0) goto error;
- + if (l != phsize) goto noexec;
- + ph = ph0 = allocated_buf;
- + } else if (eh->e_phoff + phsize > l) {
- + l = pread(fd, buf+1, phsize, eh->e_phoff);
- + if (l < 0) goto error;
- + if (l != phsize) goto noexec;
- + ph = ph0 = (void *)(buf + 1);
- + } else {
- + ph = ph0 = (void *)((char *)buf + eh->e_phoff);
- + }
- + for (i=eh->e_phnum; i; i--, ph=(void *)((char *)ph+eh->e_phentsize)) {
- + if (ph->p_type == PT_DYNAMIC) {
- + dyn = ph->p_vaddr;
- + } else if (ph->p_type == PT_TLS) {
- + tls_image = ph->p_vaddr;
- + dso->tls.align = ph->p_align;
- + dso->tls.len = ph->p_filesz;
- + dso->tls.size = ph->p_memsz;
- + } else if (ph->p_type == PT_GNU_RELRO) {
- + dso->relro_start = ph->p_vaddr & -PAGE_SIZE;
- + dso->relro_end = (ph->p_vaddr + ph->p_memsz) & -PAGE_SIZE;
- + }
- + if (ph->p_type != PT_LOAD) continue;
- + nsegs++;
- + if (ph->p_vaddr < addr_min) {
- + addr_min = ph->p_vaddr;
- + off_start = ph->p_offset;
- + prot = (((ph->p_flags&PF_R) ? PROT_READ : 0) |
- + ((ph->p_flags&PF_W) ? PROT_WRITE: 0) |
- + ((ph->p_flags&PF_X) ? PROT_EXEC : 0));
- + }
- + if (ph->p_vaddr+ph->p_memsz > addr_max) {
- + addr_max = ph->p_vaddr+ph->p_memsz;
- + }
- + }
- + if (!dyn) goto noexec;
- + if (DL_FDPIC && !(eh->e_flags & FDPIC_CONSTDISP_FLAG)) {
- + dso->loadmap = calloc(1, sizeof *dso->loadmap
- + + nsegs * sizeof *dso->loadmap->segs);
- + if (!dso->loadmap) goto error;
- + dso->loadmap->nsegs = nsegs;
- + for (ph=ph0, i=0; i<nsegs; ph=(void *)((char *)ph+eh->e_phentsize)) {
- + if (ph->p_type != PT_LOAD) continue;
- + prot = (((ph->p_flags&PF_R) ? PROT_READ : 0) |
- + ((ph->p_flags&PF_W) ? PROT_WRITE: 0) |
- + ((ph->p_flags&PF_X) ? PROT_EXEC : 0));
- + map = mmap(0, ph->p_memsz + (ph->p_vaddr & PAGE_SIZE-1),
- + prot, MAP_PRIVATE,
- + fd, ph->p_offset & -PAGE_SIZE);
- + if (map == MAP_FAILED) {
- + unmap_library(dso);
- + goto error;
- + }
- + dso->loadmap->segs[i].addr = (size_t)map +
- + (ph->p_vaddr & PAGE_SIZE-1);
- + dso->loadmap->segs[i].p_vaddr = ph->p_vaddr;
- + dso->loadmap->segs[i].p_memsz = ph->p_memsz;
- + i++;
- + if (prot & PROT_WRITE) {
- + size_t brk = (ph->p_vaddr & PAGE_SIZE-1)
- + + ph->p_filesz;
- + size_t pgbrk = brk + PAGE_SIZE-1 & -PAGE_SIZE;
- + size_t pgend = brk + ph->p_memsz - ph->p_filesz
- + + PAGE_SIZE-1 & -PAGE_SIZE;
- + if (pgend > pgbrk && mmap_fixed(map+pgbrk,
- + pgend-pgbrk, prot,
- + MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS,
- + -1, off_start) == MAP_FAILED)
- + goto error;
- + memset(map + brk, 0, pgbrk-brk);
- + }
- + }
- + map = (void *)dso->loadmap->segs[0].addr;
- + map_len = 0;
- + goto done_mapping;
- + }
- + addr_max += PAGE_SIZE-1;
- + addr_max &= -PAGE_SIZE;
- + addr_min &= -PAGE_SIZE;
- + off_start &= -PAGE_SIZE;
- + map_len = addr_max - addr_min + off_start;
- + /* The first time, we map too much, possibly even more than
- + * the length of the file. This is okay because we will not
- + * use the invalid part; we just need to reserve the right
- + * amount of virtual address space to map over later. */
- + map = DL_NOMMU_SUPPORT
- + ? mmap((void *)addr_min, map_len, PROT_READ|PROT_WRITE|PROT_EXEC,
- + MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)
- + : mmap((void *)addr_min, map_len, prot,
- + MAP_PRIVATE, fd, off_start);
- + if (map==MAP_FAILED) goto error;
- + dso->map = map;
- + dso->map_len = map_len;
- + /* If the loaded file is not relocatable and the requested address is
- + * not available, then the load operation must fail. */
- + if (eh->e_type != ET_DYN && addr_min && map!=(void *)addr_min) {
- + errno = EBUSY;
- + goto error;
- + }
- + base = map - addr_min;
- + dso->phdr = 0;
- + dso->phnum = 0;
- + for (ph=ph0, i=eh->e_phnum; i; i--, ph=(void *)((char *)ph+eh->e_phentsize)) {
- + if (ph->p_type != PT_LOAD) continue;
- + /* Check if the programs headers are in this load segment, and
- + * if so, record the address for use by dl_iterate_phdr. */
- + if (!dso->phdr && eh->e_phoff >= ph->p_offset
- + && eh->e_phoff+phsize <= ph->p_offset+ph->p_filesz) {
- + dso->phdr = (void *)(base + ph->p_vaddr
- + + (eh->e_phoff-ph->p_offset));
- + dso->phnum = eh->e_phnum;
- + dso->phentsize = eh->e_phentsize;
- + }
- + /* Reuse the existing mapping for the lowest-address LOAD */
- + if ((ph->p_vaddr & -PAGE_SIZE) == addr_min && !DL_NOMMU_SUPPORT)
- + continue;
- + this_min = ph->p_vaddr & -PAGE_SIZE;
- + this_max = ph->p_vaddr+ph->p_memsz+PAGE_SIZE-1 & -PAGE_SIZE;
- + off_start = ph->p_offset & -PAGE_SIZE;
- + prot = (((ph->p_flags&PF_R) ? PROT_READ : 0) |
- + ((ph->p_flags&PF_W) ? PROT_WRITE: 0) |
- + ((ph->p_flags&PF_X) ? PROT_EXEC : 0));
- + if (mmap_fixed(base+this_min, this_max-this_min, prot, MAP_PRIVATE|MAP_FIXED, fd, off_start) == MAP_FAILED)
- + goto error;
- + if (ph->p_memsz > ph->p_filesz) {
- + size_t brk = (size_t)base+ph->p_vaddr+ph->p_filesz;
- + size_t pgbrk = brk+PAGE_SIZE-1 & -PAGE_SIZE;
- + memset((void *)brk, 0, pgbrk-brk & PAGE_SIZE-1);
- + if (pgbrk-(size_t)base < this_max && mmap_fixed((void *)pgbrk, (size_t)base+this_max-pgbrk, prot, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) == MAP_FAILED)
- + goto error;
- + }
- + }
- + for (i=0; ((size_t *)(base+dyn))[i]; i+=2)
- + if (((size_t *)(base+dyn))[i]==DT_TEXTREL) {
- + if (mprotect(map, map_len, PROT_READ|PROT_WRITE|PROT_EXEC)
- + && errno != ENOSYS)
- + goto error;
- + break;
- + }
- +done_mapping:
- + dso->base = base;
- + dso->dynv = laddr(dso, dyn);
- + if (dso->tls.size) dso->tls.image = laddr(dso, tls_image);
- + if (!runtime) reclaim_gaps(dso);
- + free(allocated_buf);
- + return map;
- +noexec:
- + errno = ENOEXEC;
- +error:
- + if (map!=MAP_FAILED) unmap_library(dso);
- + free(allocated_buf);
- + return 0;
- +}
- +
- +static int path_open(const char *name, const char *s, char *buf, size_t buf_size)
- +{
- + size_t l;
- + int fd;
- + for (;;) {
- + s += strspn(s, ":\n");
- + l = strcspn(s, ":\n");
- + if (l-1 >= INT_MAX) return -1;
- + if (snprintf(buf, buf_size, "%.*s/%s", (int)l, s, name) < buf_size) {
- + if ((fd = open(buf, O_RDONLY|O_CLOEXEC))>=0) return fd;
- + switch (errno) {
- + case ENOENT:
- + case ENOTDIR:
- + case EACCES:
- + case ENAMETOOLONG:
- + break;
- + default:
- + /* Any negative value but -1 will inhibit
- + * futher path search. */
- + return -2;
- + }
- + }
- + s += l;
- + }
- +}
- +
- +static int fixup_rpath(struct dso *p, char *buf, size_t buf_size)
- +{
- + size_t n, l;
- + const char *s, *t, *origin;
- + char *d;
- + if (p->rpath || !p->rpath_orig) return 0;
- + if (!strchr(p->rpath_orig, '$')) {
- + p->rpath = p->rpath_orig;
- + return 0;
- + }
- + n = 0;
- + s = p->rpath_orig;
- + while ((t=strchr(s, '$'))) {
- + if (strncmp(t, "$ORIGIN", 7) && strncmp(t, "${ORIGIN}", 9))
- + return 0;
- + s = t+1;
- + n++;
- + }
- + if (n > SSIZE_MAX/PATH_MAX) return 0;
- +
- + if (p->kernel_mapped) {
- + /* $ORIGIN searches cannot be performed for the main program
- + * when it is suid/sgid/AT_SECURE. This is because the
- + * pathname is under the control of the caller of execve.
- + * For libraries, however, $ORIGIN can be processed safely
- + * since the library's pathname came from a trusted source
- + * (either system paths or a call to dlopen). */
- + if (libc.secure)
- + return 0;
- + l = readlink("/proc/self/exe", buf, buf_size);
- + if (l == -1) switch (errno) {
- + case ENOENT:
- + case ENOTDIR:
- + case EACCES:
- + break;
- + default:
- + return -1;
- + }
- + if (l >= buf_size)
- + return 0;
- + buf[l] = 0;
- + origin = buf;
- + } else {
- + origin = p->name;
- + }
- + t = strrchr(origin, '/');
- + l = t ? t-origin : 0;
- + p->rpath = malloc(strlen(p->rpath_orig) + n*l + 1);
- + if (!p->rpath) return -1;
- +
- + d = p->rpath;
- + s = p->rpath_orig;
- + while ((t=strchr(s, '$'))) {
- + memcpy(d, s, t-s);
- + d += t-s;
- + memcpy(d, origin, l);
- + d += l;
- + /* It was determined previously that the '$' is followed
- + * either by "ORIGIN" or "{ORIGIN}". */
- + s = t + 7 + 2*(t[1]=='{');
- + }
- + strcpy(d, s);
- + return 0;
- +}
- +
- +static void decode_dyn(struct dso *p)
- +{
- + size_t dyn[DYN_CNT];
- + decode_vec(p->dynv, dyn, DYN_CNT);
- + p->syms = laddr(p, dyn[DT_SYMTAB]);
- + p->strings = laddr(p, dyn[DT_STRTAB]);
- + if (dyn[0]&(1<<DT_HASH))
- + p->hashtab = laddr(p, dyn[DT_HASH]);
- + if (dyn[0]&(1<<DT_RPATH))
- + p->rpath_orig = p->strings + dyn[DT_RPATH];
- + if (dyn[0]&(1<<DT_RUNPATH))
- + p->rpath_orig = p->strings + dyn[DT_RUNPATH];
- + if (dyn[0]&(1<<DT_PLTGOT))
- + p->got = laddr(p, dyn[DT_PLTGOT]);
- + if (search_vec(p->dynv, dyn, DT_GNU_HASH))
- + p->ghashtab = laddr(p, *dyn);
- + if (search_vec(p->dynv, dyn, DT_VERSYM))
- + p->versym = laddr(p, *dyn);
- +}
- +
- +static size_t count_syms(struct dso *p)
- +{
- + if (p->hashtab) return p->hashtab[1];
- +
- + size_t nsym, i;
- + uint32_t *buckets = p->ghashtab + 4 + (p->ghashtab[2]*sizeof(size_t)/4);
- + uint32_t *hashval;
- + for (i = nsym = 0; i < p->ghashtab[0]; i++) {
- + if (buckets[i] > nsym)
- + nsym = buckets[i];
- + }
- + if (nsym) {
- + hashval = buckets + p->ghashtab[0] + (nsym - p->ghashtab[1]);
- + do nsym++;
- + while (!(*hashval++ & 1));
- + }
- + return nsym;
- +}
- +
- +static void *dl_mmap(size_t n)
- +{
- + void *p;
- + int prot = PROT_READ|PROT_WRITE, flags = MAP_ANONYMOUS|MAP_PRIVATE;
- +#ifdef SYS_mmap2
- + p = (void *)__syscall(SYS_mmap2, 0, n, prot, flags, -1, 0);
- +#else
- + p = (void *)__syscall(SYS_mmap, 0, n, prot, flags, -1, 0);
- +#endif
- + return p == MAP_FAILED ? 0 : p;
- +}
- +
- +static void makefuncdescs(struct dso *p)
- +{
- + static int self_done;
- + size_t nsym = count_syms(p);
- + size_t i, size = nsym * sizeof(*p->funcdescs);
- +
- + if (!self_done) {
- + p->funcdescs = dl_mmap(size);
- + self_done = 1;
- + } else {
- + p->funcdescs = malloc(size);
- + }
- + if (!p->funcdescs) {
- + if (!runtime) a_crash();
- + error("Error allocating function descriptors for %s", p->name);
- + longjmp(*rtld_fail, 1);
- + }
- + for (i=0; i<nsym; i++) {
- + if ((p->syms[i].st_info&0xf)==STT_FUNC && p->syms[i].st_shndx) {
- + p->funcdescs[i].addr = laddr(p, p->syms[i].st_value);
- + p->funcdescs[i].got = p->got;
- + } else {
- + p->funcdescs[i].addr = 0;
- + p->funcdescs[i].got = 0;
- + }
- + }
- +}
- +
- +static struct dso *load_library(const char *name, struct dso *needed_by)
- +{
- + char buf[2*NAME_MAX+2];
- + const char *pathname;
- + unsigned char *map;
- + struct dso *p, temp_dso = {0};
- + int fd;
- + struct stat st;
- + size_t alloc_size;
- + int n_th = 0;
- + int is_self = 0;
- +
- + if (!*name) {
- + errno = EINVAL;
- + return 0;
- + }
- +
- + /* Catch and block attempts to reload the implementation itself */
- + if (name[0]=='l' && name[1]=='i' && name[2]=='b') {
- + static const char *rp, reserved[] =
- + "c\0pthread\0rt\0m\0dl\0util\0xnet\0";
- + char *z = strchr(name, '.');
- + if (z) {
- + size_t l = z-name;
- + for (rp=reserved; *rp && strncmp(name+3, rp, l-3); rp+=strlen(rp)+1);
- + if (*rp) {
- + if (ldd_mode) {
- + /* Track which names have been resolved
- + * and only report each one once. */
- + static unsigned reported;
- + unsigned mask = 1U<<(rp-reserved);
- + if (!(reported & mask)) {
- + reported |= mask;
- + dprintf(1, "\t%s => %s (%p)\n",
- + name, ldso.name,
- + ldso.base);
- + }
- + }
- + is_self = 1;
- + }
- + }
- + }
- + if (!strcmp(name, ldso.name)) is_self = 1;
- + if (is_self) {
- + if (!ldso.prev) {
- + tail->next = &ldso;
- + ldso.prev = tail;
- + tail = ldso.next ? ldso.next : &ldso;
- + }
- + return &ldso;
- + }
- + if (strchr(name, '/')) {
- + pathname = name;
- + fd = open(name, O_RDONLY|O_CLOEXEC);
- + } else {
- + /* Search for the name to see if it's already loaded */
- + for (p=head->next; p; p=p->next) {
- + if (p->shortname && !strcmp(p->shortname, name)) {
- + p->refcnt++;
- + return p;
- + }
- + }
- + if (strlen(name) > NAME_MAX) return 0;
- + fd = -1;
- + if (env_path) fd = path_open(name, env_path, buf, sizeof buf);
- + for (p=needed_by; fd == -1 && p; p=p->needed_by) {
- + if (fixup_rpath(p, buf, sizeof buf) < 0)
- + fd = -2; /* Inhibit further search. */
- + if (p->rpath)
- + fd = path_open(name, p->rpath, buf, sizeof buf);
- + }
- + if (fd == -1) {
- + if (!sys_path) {
- + char *prefix = 0;
- + size_t prefix_len;
- + if (ldso.name[0]=='/') {
- + char *s, *t, *z;
- + for (s=t=z=ldso.name; *s; s++)
- + if (*s=='/') z=t, t=s;
- + prefix_len = z-ldso.name;
- + if (prefix_len < PATH_MAX)
- + prefix = ldso.name;
- + }
- + if (!prefix) {
- + prefix = "";
- + prefix_len = 0;
- + }
- + char etc_ldso_path[prefix_len + 1
- + + sizeof "/etc/ld-musl-" LDSO_ARCH ".path"];
- + snprintf(etc_ldso_path, sizeof etc_ldso_path,
- + "%.*s/etc/ld-musl-" LDSO_ARCH ".path",
- + (int)prefix_len, prefix);
- + FILE *f = fopen(etc_ldso_path, "rbe");
- + if (f) {
- + if (getdelim(&sys_path, (size_t[1]){0}, 0, f) <= 0) {
- + free(sys_path);
- + sys_path = "";
- + }
- + fclose(f);
- + } else if (errno != ENOENT) {
- + sys_path = "";
- + }
- + }
- + if (!sys_path) sys_path = "/lib:/usr/local/lib:/usr/lib";
- + fd = path_open(name, sys_path, buf, sizeof buf);
- + }
- + pathname = buf;
- + }
- + if (fd < 0) return 0;
- + if (fstat(fd, &st) < 0) {
- + close(fd);
- + return 0;
- + }
- + for (p=head->next; p; p=p->next) {
- + if (p->dev == st.st_dev && p->ino == st.st_ino) {
- + /* If this library was previously loaded with a
- + * pathname but a search found the same inode,
- + * setup its shortname so it can be found by name. */
- + if (!p->shortname && pathname != name)
- + p->shortname = strrchr(p->name, '/')+1;
- + close(fd);
- + p->refcnt++;
- + return p;
- + }
- + }
- + map = noload ? 0 : map_library(fd, &temp_dso);
- + close(fd);
- + if (!map) return 0;
- +
- + /* Allocate storage for the new DSO. When there is TLS, this
- + * storage must include a reservation for all pre-existing
- + * threads to obtain copies of both the new TLS, and an
- + * extended DTV capable of storing an additional slot for
- + * the newly-loaded DSO. */
- + alloc_size = sizeof *p + strlen(pathname) + 1;
- + if (runtime && temp_dso.tls.image) {
- + size_t per_th = temp_dso.tls.size + temp_dso.tls.align
- + + sizeof(void *) * (tls_cnt+3);
- + n_th = libc.threads_minus_1 + 1;
- + if (n_th > SSIZE_MAX / per_th) alloc_size = SIZE_MAX;
- + else alloc_size += n_th * per_th;
- + }
- + p = calloc(1, alloc_size);
- + if (!p) {
- + unmap_library(&temp_dso);
- + return 0;
- + }
- + memcpy(p, &temp_dso, sizeof temp_dso);
- + decode_dyn(p);
- + p->dev = st.st_dev;
- + p->ino = st.st_ino;
- + p->refcnt = 1;
- + p->needed_by = needed_by;
- + p->name = p->buf;
- + strcpy(p->name, pathname);
- + /* Add a shortname only if name arg was not an explicit pathname. */
- + if (pathname != name) p->shortname = strrchr(p->name, '/')+1;
- + if (p->tls.image) {
- + p->tls_id = ++tls_cnt;
- + tls_align = MAXP2(tls_align, p->tls.align);
- +#ifdef TLS_ABOVE_TP
- + p->tls.offset = tls_offset + ( (tls_align-1) &
- + -(tls_offset + (uintptr_t)p->tls.image) );
- + tls_offset += p->tls.size;
- +#else
- + tls_offset += p->tls.size + p->tls.align - 1;
- + tls_offset -= (tls_offset + (uintptr_t)p->tls.image)
- + & (p->tls.align-1);
- + p->tls.offset = tls_offset;
- +#endif
- + p->new_dtv = (void *)(-sizeof(size_t) &
- + (uintptr_t)(p->name+strlen(p->name)+sizeof(size_t)));
- + p->new_tls = (void *)(p->new_dtv + n_th*(tls_cnt+1));
- + if (tls_tail) tls_tail->next = &p->tls;
- + else libc.tls_head = &p->tls;
- + tls_tail = &p->tls;
- + }
- +
- + tail->next = p;
- + p->prev = tail;
- + tail = p;
- +
- + if (DL_FDPIC) makefuncdescs(p);
- +
- + if (ldd_mode) dprintf(1, "\t%s => %s (%p)\n", name, pathname, p->base);
- +
- + return p;
- +}
- +
- +static void load_deps(struct dso *p)
- +{
- + size_t i, ndeps=0;
- + struct dso ***deps = &p->deps, **tmp, *dep;
- + for (; p; p=p->next) {
- + for (i=0; p->dynv[i]; i+=2) {
- + if (p->dynv[i] != DT_NEEDED) continue;
- + dep = load_library(p->strings + p->dynv[i+1], p);
- + if (!dep) {
- + error("Error loading shared library %s: %m (needed by %s)",
- + p->strings + p->dynv[i+1], p->name);
- + if (runtime) longjmp(*rtld_fail, 1);
- + continue;
- + }
- + if (runtime) {
- + tmp = realloc(*deps, sizeof(*tmp)*(ndeps+2));
- + if (!tmp) longjmp(*rtld_fail, 1);
- + tmp[ndeps++] = dep;
- + tmp[ndeps] = 0;
- + *deps = tmp;
- + }
- + }
- + }
- +}
- +
- +static void load_preload(char *s)
- +{
- + int tmp;
- + char *z;
- + for (z=s; *z; s=z) {
- + for ( ; *s && (isspace(*s) || *s==':'); s++);
- + for (z=s; *z && !isspace(*z) && *z!=':'; z++);
- + tmp = *z;
- + *z = 0;
- + load_library(s, 0);
- + *z = tmp;
- + }
- +}
- +
- +static void make_global(struct dso *p)
- +{
- + for (; p; p=p->next) p->global = 1;
- +}
- +
- +static void do_mips_relocs(struct dso *p, size_t *got)
- +{
- + size_t i, j, rel[2];
- + unsigned char *base = p->base;
- + i=0; search_vec(p->dynv, &i, DT_MIPS_LOCAL_GOTNO);
- + if (p==&ldso) {
- + got += i;
- + } else {
- + while (i--) *got++ += (size_t)base;
- + }
- + j=0; search_vec(p->dynv, &j, DT_MIPS_GOTSYM);
- + i=0; search_vec(p->dynv, &i, DT_MIPS_SYMTABNO);
- + Sym *sym = p->syms + j;
- + rel[0] = (unsigned char *)got - base;
- + for (i-=j; i; i--, sym++, rel[0]+=sizeof(size_t)) {
- + rel[1] = sym-p->syms << 8 | R_MIPS_JUMP_SLOT;
- + do_relocs(p, rel, sizeof rel, 2);
- + }
- +}
- +
- +static void reloc_all(struct dso *p)
- +{
- + size_t dyn[DYN_CNT];
- + for (; p; p=p->next) {
- + if (p->relocated) continue;
- + decode_vec(p->dynv, dyn, DYN_CNT);
- + if (NEED_MIPS_GOT_RELOCS)
- + do_mips_relocs(p, laddr(p, dyn[DT_PLTGOT]));
- + do_relocs(p, laddr(p, dyn[DT_JMPREL]), dyn[DT_PLTRELSZ],
- + 2+(dyn[DT_PLTREL]==DT_RELA));
- + do_relocs(p, laddr(p, dyn[DT_REL]), dyn[DT_RELSZ], 2);
- + do_relocs(p, laddr(p, dyn[DT_RELA]), dyn[DT_RELASZ], 3);
- +
- + if (head != &ldso && p->relro_start != p->relro_end &&
- + mprotect(laddr(p, p->relro_start), p->relro_end-p->relro_start, PROT_READ)
- + && errno != ENOSYS) {
- + error("Error relocating %s: RELRO protection failed: %m",
- + p->name);
- + if (runtime) longjmp(*rtld_fail, 1);
- + }
- +
- + p->relocated = 1;
- + }
- +}
- +
- +static void kernel_mapped_dso(struct dso *p)
- +{
- + size_t min_addr = -1, max_addr = 0, cnt;
- + Phdr *ph = p->phdr;
- + for (cnt = p->phnum; cnt--; ph = (void *)((char *)ph + p->phentsize)) {
- + if (ph->p_type == PT_DYNAMIC) {
- + p->dynv = laddr(p, ph->p_vaddr);
- + } else if (ph->p_type == PT_GNU_RELRO) {
- + p->relro_start = ph->p_vaddr & -PAGE_SIZE;
- + p->relro_end = (ph->p_vaddr + ph->p_memsz) & -PAGE_SIZE;
- + }
- + if (ph->p_type != PT_LOAD) continue;
- + if (ph->p_vaddr < min_addr)
- + min_addr = ph->p_vaddr;
- + if (ph->p_vaddr+ph->p_memsz > max_addr)
- + max_addr = ph->p_vaddr+ph->p_memsz;
- + }
- + min_addr &= -PAGE_SIZE;
- + max_addr = (max_addr + PAGE_SIZE-1) & -PAGE_SIZE;
- + p->map = p->base + min_addr;
- + p->map_len = max_addr - min_addr;
- + p->kernel_mapped = 1;
- +}
- +
- +void __libc_exit_fini()
- +{
- + struct dso *p;
- + size_t dyn[DYN_CNT];
- + for (p=fini_head; p; p=p->fini_next) {
- + if (!p->constructed) continue;
- + decode_vec(p->dynv, dyn, DYN_CNT);
- + if (dyn[0] & (1<<DT_FINI_ARRAY)) {
- + size_t n = dyn[DT_FINI_ARRAYSZ]/sizeof(size_t);
- + size_t *fn = (size_t *)laddr(p, dyn[DT_FINI_ARRAY])+n;
- + while (n--) ((void (*)(void))*--fn)();
- + }
- +#ifndef NO_LEGACY_INITFINI
- + if ((dyn[0] & (1<<DT_FINI)) && dyn[DT_FINI])
- + fpaddr(p, dyn[DT_FINI])();
- +#endif
- + }
- +}
- +
- +static void do_init_fini(struct dso *p)
- +{
- + size_t dyn[DYN_CNT];
- + int need_locking = libc.threads_minus_1;
- + /* Allow recursive calls that arise when a library calls
- + * dlopen from one of its constructors, but block any
- + * other threads until all ctors have finished. */
- + if (need_locking) pthread_mutex_lock(&init_fini_lock);
- + for (; p; p=p->prev) {
- + if (p->constructed) continue;
- + p->constructed = 1;
- + decode_vec(p->dynv, dyn, DYN_CNT);
- + if (dyn[0] & ((1<<DT_FINI) | (1<<DT_FINI_ARRAY))) {
- + p->fini_next = fini_head;
- + fini_head = p;
- + }
- +#ifndef NO_LEGACY_INITFINI
- + if ((dyn[0] & (1<<DT_INIT)) && dyn[DT_INIT])
- + fpaddr(p, dyn[DT_INIT])();
- +#endif
- + if (dyn[0] & (1<<DT_INIT_ARRAY)) {
- + size_t n = dyn[DT_INIT_ARRAYSZ]/sizeof(size_t);
- + size_t *fn = laddr(p, dyn[DT_INIT_ARRAY]);
- + while (n--) ((void (*)(void))*fn++)();
- + }
- + if (!need_locking && libc.threads_minus_1) {
- + need_locking = 1;
- + pthread_mutex_lock(&init_fini_lock);
- + }
- + }
- + if (need_locking) pthread_mutex_unlock(&init_fini_lock);
- +}
- +
- +void __libc_start_init(void)
- +{
- + do_init_fini(tail);
- +}
- +
- +static void dl_debug_state(void)
- +{
- +}
- +
- +weak_alias(dl_debug_state, _dl_debug_state);
- +
- +void __init_tls(size_t *auxv)
- +{
- +}
- +
- +__attribute__((__visibility__("hidden")))
- +void *__tls_get_new(size_t *v)
- +{
- + pthread_t self = __pthread_self();
- +
- + /* Block signals to make accessing new TLS async-signal-safe */
- + sigset_t set;
- + __block_all_sigs(&set);
- + if (v[0]<=(size_t)self->dtv[0]) {
- + __restore_sigs(&set);
- + return (char *)self->dtv[v[0]]+v[1]+DTP_OFFSET;
- + }
- +
- + /* This is safe without any locks held because, if the caller
- + * is able to request the Nth entry of the DTV, the DSO list
- + * must be valid at least that far out and it was synchronized
- + * at program startup or by an already-completed call to dlopen. */
- + struct dso *p;
- + for (p=head; p->tls_id != v[0]; p=p->next);
- +
- + /* Get new DTV space from new DSO if needed */
- + if (v[0] > (size_t)self->dtv[0]) {
- + void **newdtv = p->new_dtv +
- + (v[0]+1)*a_fetch_add(&p->new_dtv_idx,1);
- + memcpy(newdtv, self->dtv,
- + ((size_t)self->dtv[0]+1) * sizeof(void *));
- + newdtv[0] = (void *)v[0];
- + self->dtv = self->dtv_copy = newdtv;
- + }
- +
- + /* Get new TLS memory from all new DSOs up to the requested one */
- + unsigned char *mem;
- + for (p=head; ; p=p->next) {
- + if (!p->tls_id || self->dtv[p->tls_id]) continue;
- + mem = p->new_tls + (p->tls.size + p->tls.align)
- + * a_fetch_add(&p->new_tls_idx,1);
- + mem += ((uintptr_t)p->tls.image - (uintptr_t)mem)
- + & (p->tls.align-1);
- + self->dtv[p->tls_id] = mem;
- + memcpy(mem, p->tls.image, p->tls.len);
- + if (p->tls_id == v[0]) break;
- + }
- + __restore_sigs(&set);
- + return mem + v[1] + DTP_OFFSET;
- +}
- +
- +static void update_tls_size()
- +{
- + libc.tls_cnt = tls_cnt;
- + libc.tls_align = tls_align;
- + libc.tls_size = ALIGN(
- + (1+tls_cnt) * sizeof(void *) +
- + tls_offset +
- + sizeof(struct pthread) +
- + tls_align * 2,
- + tls_align);
- +}
- +
- +/* Stage 1 of the dynamic linker is defined in dlstart.c. It calls the
- + * following stage 2 and stage 3 functions via primitive symbolic lookup
- + * since it does not have access to their addresses to begin with. */
- +
- +/* Stage 2 of the dynamic linker is called after relative relocations
- + * have been processed. It can make function calls to static functions
- + * and access string literals and static data, but cannot use extern
- + * symbols. Its job is to perform symbolic relocations on the dynamic
- + * linker itself, but some of the relocations performed may need to be
- + * replaced later due to copy relocations in the main program. */
- +
- +__attribute__((__visibility__("hidden")))
- +void __dls2(unsigned char *base, size_t *sp)
- +{
- + if (DL_FDPIC) {
- + void *p1 = (void *)sp[-2];
- + void *p2 = (void *)sp[-1];
- + if (!p1) {
- + size_t *auxv, aux[AUX_CNT];
- + for (auxv=sp+1+*sp+1; *auxv; auxv++); auxv++;
- + decode_vec(auxv, aux, AUX_CNT);
- + if (aux[AT_BASE]) ldso.base = (void *)aux[AT_BASE];
- + else ldso.base = (void *)(aux[AT_PHDR] & -4096);
- + }
- + app_loadmap = p2 ? p1 : 0;
- + ldso.loadmap = p2 ? p2 : p1;
- + ldso.base = laddr(&ldso, 0);
- + } else {
- + ldso.base = base;
- + }
- + Ehdr *ehdr = (void *)ldso.base;
- + ldso.name = ldso.shortname = "libc.so";
- + ldso.global = 1;
- + ldso.phnum = ehdr->e_phnum;
- + ldso.phdr = laddr(&ldso, ehdr->e_phoff);
- + ldso.phentsize = ehdr->e_phentsize;
- + kernel_mapped_dso(&ldso);
- + decode_dyn(&ldso);
- +
- + if (DL_FDPIC) makefuncdescs(&ldso);
- +
- + /* Prepare storage for to save clobbered REL addends so they
- + * can be reused in stage 3. There should be very few. If
- + * something goes wrong and there are a huge number, abort
- + * instead of risking stack overflow. */
- + size_t dyn[DYN_CNT];
- + decode_vec(ldso.dynv, dyn, DYN_CNT);
- + size_t *rel = laddr(&ldso, dyn[DT_REL]);
- + size_t rel_size = dyn[DT_RELSZ];
- + size_t symbolic_rel_cnt = 0;
- + apply_addends_to = rel;
- + for (; rel_size; rel+=2, rel_size-=2*sizeof(size_t))
- + if (!IS_RELATIVE(rel[1], ldso.syms)) symbolic_rel_cnt++;
- + if (symbolic_rel_cnt >= ADDEND_LIMIT) a_crash();
- + size_t addends[symbolic_rel_cnt+1];
- + saved_addends = addends;
- +
- + head = &ldso;
- + reloc_all(&ldso);
- +
- + ldso.relocated = 0;
- +
- + /* Call dynamic linker stage-3, __dls3, looking it up
- + * symbolically as a barrier against moving the address
- + * load across the above relocation processing. */
- + struct symdef dls3_def = find_sym(&ldso, "__dls3", 0);
- + if (DL_FDPIC) ((stage3_func)&ldso.funcdescs[dls3_def.sym-ldso.syms])(sp);
- + else ((stage3_func)laddr(&ldso, dls3_def.sym->st_value))(sp);
- +}
- +
- +/* Stage 3 of the dynamic linker is called with the dynamic linker/libc
- + * fully functional. Its job is to load (if not already loaded) and
- + * process dependencies and relocations for the main application and
- + * transfer control to its entry point. */
- +
- +_Noreturn void __dls3(size_t *sp)
- +{
- + static struct dso app, vdso;
- + size_t aux[AUX_CNT], *auxv;
- + size_t i;
- + char *env_preload=0;
- + size_t vdso_base;
- + int argc = *sp;
- + char **argv = (void *)(sp+1);
- + char **argv_orig = argv;
- + char **envp = argv+argc+1;
- +
- + /* Find aux vector just past environ[] and use it to initialize
- + * global data that may be needed before we can make syscalls. */
- + __environ = envp;
- + for (i=argc+1; argv[i]; i++);
- + libc.auxv = auxv = (void *)(argv+i+1);
- + decode_vec(auxv, aux, AUX_CNT);
- + __hwcap = aux[AT_HWCAP];
- + libc.page_size = aux[AT_PAGESZ];
- + libc.secure = ((aux[0]&0x7800)!=0x7800 || aux[AT_UID]!=aux[AT_EUID]
- + || aux[AT_GID]!=aux[AT_EGID] || aux[AT_SECURE]);
- +
- + /* Setup early thread pointer in builtin_tls for ldso/libc itself to
- + * use during dynamic linking. If possible it will also serve as the
- + * thread pointer at runtime. */
- + libc.tls_size = sizeof builtin_tls;
- + libc.tls_align = tls_align;
- + if (__init_tp(__copy_tls((void *)builtin_tls)) < 0) {
- + a_crash();
- + }
- +
- + /* Only trust user/env if kernel says we're not suid/sgid */
- + if (!libc.secure) {
- + env_path = getenv("LD_LIBRARY_PATH");
- + env_preload = getenv("LD_PRELOAD");
- + }
- +
- + /* If the main program was already loaded by the kernel,
- + * AT_PHDR will point to some location other than the dynamic
- + * linker's program headers. */
- + if (aux[AT_PHDR] != (size_t)ldso.phdr) {
- + size_t interp_off = 0;
- + size_t tls_image = 0;
- + /* Find load address of the main program, via AT_PHDR vs PT_PHDR. */
- + Phdr *phdr = app.phdr = (void *)aux[AT_PHDR];
- + app.phnum = aux[AT_PHNUM];
- + app.phentsize = aux[AT_PHENT];
- + for (i=aux[AT_PHNUM]; i; i--, phdr=(void *)((char *)phdr + aux[AT_PHENT])) {
- + if (phdr->p_type == PT_PHDR)
- + app.base = (void *)(aux[AT_PHDR] - phdr->p_vaddr);
- + else if (phdr->p_type == PT_INTERP)
- + interp_off = (size_t)phdr->p_vaddr;
- + else if (phdr->p_type == PT_TLS) {
- + tls_image = phdr->p_vaddr;
- + app.tls.len = phdr->p_filesz;
- + app.tls.size = phdr->p_memsz;
- + app.tls.align = phdr->p_align;
- + }
- + }
- + if (DL_FDPIC) app.loadmap = app_loadmap;
- + if (app.tls.size) app.tls.image = laddr(&app, tls_image);
- + if (interp_off) ldso.name = laddr(&app, interp_off);
- + if ((aux[0] & (1UL<<AT_EXECFN))
- + && strncmp((char *)aux[AT_EXECFN], "/proc/", 6))
- + app.name = (char *)aux[AT_EXECFN];
- + else
- + app.name = argv[0];
- + kernel_mapped_dso(&app);
- + } else {
- + int fd;
- + char *ldname = argv[0];
- + size_t l = strlen(ldname);
- + if (l >= 3 && !strcmp(ldname+l-3, "ldd")) ldd_mode = 1;
- + argv++;
- + while (argv[0] && argv[0][0]=='-' && argv[0][1]=='-') {
- + char *opt = argv[0]+2;
- + *argv++ = (void *)-1;
- + if (!*opt) {
- + break;
- + } else if (!memcmp(opt, "list", 5)) {
- + ldd_mode = 1;
- + } else if (!memcmp(opt, "library-path", 12)) {
- + if (opt[12]=='=') env_path = opt+13;
- + else if (opt[12]) *argv = 0;
- + else if (*argv) env_path = *argv++;
- + } else if (!memcmp(opt, "preload", 7)) {
- + if (opt[7]=='=') env_preload = opt+8;
- + else if (opt[7]) *argv = 0;
- + else if (*argv) env_preload = *argv++;
- + } else {
- + argv[0] = 0;
- + }
- + }
- + argv[-1] = (void *)(argc - (argv-argv_orig));
- + if (!argv[0]) {
- + dprintf(2, "musl libc (" LDSO_ARCH ")\n"
- + "Version %s\n"
- + "Dynamic Program Loader\n"
- + "Usage: %s [options] [--] pathname%s\n",
- + __libc_get_version(), ldname,
- + ldd_mode ? "" : " [args]");
- + _exit(1);
- + }
- + fd = open(argv[0], O_RDONLY);
- + if (fd < 0) {
- + dprintf(2, "%s: cannot load %s: %s\n", ldname, argv[0], strerror(errno));
- + _exit(1);
- + }
- + runtime = 1;
- + Ehdr *ehdr = (void *)map_library(fd, &app);
- + if (!ehdr) {
- + dprintf(2, "%s: %s: Not a valid dynamic program\n", ldname, argv[0]);
- + _exit(1);
- + }
- + runtime = 0;
- + close(fd);
- + ldso.name = ldname;
- + app.name = argv[0];
- + aux[AT_ENTRY] = (size_t)laddr(&app, ehdr->e_entry);
- + /* Find the name that would have been used for the dynamic
- + * linker had ldd not taken its place. */
- + if (ldd_mode) {
- + for (i=0; i<app.phnum; i++) {
- + if (app.phdr[i].p_type == PT_INTERP)
- + ldso.name = laddr(&app, app.phdr[i].p_vaddr);
- + }
- + dprintf(1, "\t%s (%p)\n", ldso.name, ldso.base);
- + }
- + }
- + if (app.tls.size) {
- + libc.tls_head = tls_tail = &app.tls;
- + app.tls_id = tls_cnt = 1;
- +#ifdef TLS_ABOVE_TP
- + app.tls.offset = 0;
- + tls_offset = app.tls.size
- + + ( -((uintptr_t)app.tls.image + app.tls.size)
- + & (app.tls.align-1) );
- +#else
- + tls_offset = app.tls.offset = app.tls.size
- + + ( -((uintptr_t)app.tls.image + app.tls.size)
- + & (app.tls.align-1) );
- +#endif
- + tls_align = MAXP2(tls_align, app.tls.align);
- + }
- + app.global = 1;
- + decode_dyn(&app);
- + if (DL_FDPIC) {
- + makefuncdescs(&app);
- + if (!app.loadmap) {
- + app.loadmap = (void *)&app_dummy_loadmap;
- + app.loadmap->nsegs = 1;
- + app.loadmap->segs[0].addr = (size_t)app.map;
- + app.loadmap->segs[0].p_vaddr = (size_t)app.map
- + - (size_t)app.base;
- + app.loadmap->segs[0].p_memsz = app.map_len;
- + }
- + argv[-3] = (void *)app.loadmap;
- + }
- +
- + /* Attach to vdso, if provided by the kernel */
- + if (search_vec(auxv, &vdso_base, AT_SYSINFO_EHDR)) {
- + Ehdr *ehdr = (void *)vdso_base;
- + Phdr *phdr = vdso.phdr = (void *)(vdso_base + ehdr->e_phoff);
- + vdso.phnum = ehdr->e_phnum;
- + vdso.phentsize = ehdr->e_phentsize;
- + for (i=ehdr->e_phnum; i; i--, phdr=(void *)((char *)phdr + ehdr->e_phentsize)) {
- + if (phdr->p_type == PT_DYNAMIC)
- + vdso.dynv = (void *)(vdso_base + phdr->p_offset);
- + if (phdr->p_type == PT_LOAD)
- + vdso.base = (void *)(vdso_base - phdr->p_vaddr + phdr->p_offset);
- + }
- + vdso.name = "";
- + vdso.shortname = "linux-gate.so.1";
- + vdso.global = 1;
- + vdso.relocated = 1;
- + decode_dyn(&vdso);
- + vdso.prev = &ldso;
- + ldso.next = &vdso;
- + }
- +
- + /* Initial dso chain consists only of the app. */
- + head = tail = &app;
- +
- + /* Donate unused parts of app and library mapping to malloc */
- + reclaim_gaps(&app);
- + reclaim_gaps(&ldso);
- +
- + /* Load preload/needed libraries, add their symbols to the global
- + * namespace, and perform all remaining relocations. */
- + if (env_preload) load_preload(env_preload);
- + load_deps(&app);
- + make_global(&app);
- +
- +#ifndef DYNAMIC_IS_RO
- + for (i=0; app.dynv[i]; i+=2)
- + if (app.dynv[i]==DT_DEBUG)
- + app.dynv[i+1] = (size_t)&debug;
- +#endif
- +
- + /* The main program must be relocated LAST since it may contin
- + * copy relocations which depend on libraries' relocations. */
- + reloc_all(app.next);
- + reloc_all(&app);
- +
- + update_tls_size();
- + if (libc.tls_size > sizeof builtin_tls || tls_align > MIN_TLS_ALIGN) {
- + void *initial_tls = calloc(libc.tls_size, 1);
- + if (!initial_tls) {
- + dprintf(2, "%s: Error getting %zu bytes thread-local storage: %m\n",
- + argv[0], libc.tls_size);
- + _exit(127);
- + }
- + if (__init_tp(__copy_tls(initial_tls)) < 0) {
- + a_crash();
- + }
- + } else {
- + size_t tmp_tls_size = libc.tls_size;
- + pthread_t self = __pthread_self();
- + /* Temporarily set the tls size to the full size of
- + * builtin_tls so that __copy_tls will use the same layout
- + * as it did for before. Then check, just to be safe. */
- + libc.tls_size = sizeof builtin_tls;
- + if (__copy_tls((void*)builtin_tls) != self) a_crash();
- + libc.tls_size = tmp_tls_size;
- + }
- + static_tls_cnt = tls_cnt;
- +
- + if (ldso_fail) _exit(127);
- + if (ldd_mode) _exit(0);
- +
- + /* Switch to runtime mode: any further failures in the dynamic
- + * linker are a reportable failure rather than a fatal startup
- + * error. */
- + runtime = 1;
- +
- + debug.ver = 1;
- + debug.bp = dl_debug_state;
- + debug.head = head;
- + debug.base = ldso.base;
- + debug.state = 0;
- + _dl_debug_state();
- +
- + errno = 0;
- +
- + CRTJMP((void *)aux[AT_ENTRY], argv-1);
- + for(;;);
- +}
- +
- +void *dlopen(const char *file, int mode)
- +{
- + struct dso *volatile p, *orig_tail, *next;
- + struct tls_module *orig_tls_tail;
- + size_t orig_tls_cnt, orig_tls_offset, orig_tls_align;
- + size_t i;
- + int cs;
- + jmp_buf jb;
- +
- + if (!file) return head;
- +
- + pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
- + pthread_rwlock_wrlock(&lock);
- + __inhibit_ptc();
- +
- + p = 0;
- + orig_tls_tail = tls_tail;
- + orig_tls_cnt = tls_cnt;
- + orig_tls_offset = tls_offset;
- + orig_tls_align = tls_align;
- + orig_tail = tail;
- + noload = mode & RTLD_NOLOAD;
- +
- + rtld_fail = &jb;
- + if (setjmp(*rtld_fail)) {
- + /* Clean up anything new that was (partially) loaded */
- + if (p && p->deps) for (i=0; p->deps[i]; i++)
- + if (p->deps[i]->global < 0)
- + p->deps[i]->global = 0;
- + for (p=orig_tail->next; p; p=next) {
- + next = p->next;
- + while (p->td_index) {
- + void *tmp = p->td_index->next;
- + free(p->td_index);
- + p->td_index = tmp;
- + }
- + free(p->funcdescs);
- + if (p->rpath != p->rpath_orig)
- + free(p->rpath);
- + free(p->deps);
- + unmap_library(p);
- + free(p);
- + }
- + if (!orig_tls_tail) libc.tls_head = 0;
- + tls_tail = orig_tls_tail;
- + tls_cnt = orig_tls_cnt;
- + tls_offset = orig_tls_offset;
- + tls_align = orig_tls_align;
- + tail = orig_tail;
- + tail->next = 0;
- + p = 0;
- + goto end;
- + } else p = load_library(file, head);
- +
- + if (!p) {
- + error(noload ?
- + "Library %s is not already loaded" :
- + "Error loading shared library %s: %m",
- + file);
- + goto end;
- + }
- +
- + /* First load handling */
- + if (!p->deps) {
- + load_deps(p);
- + if (p->deps) for (i=0; p->deps[i]; i++)
- + if (!p->deps[i]->global)
- + p->deps[i]->global = -1;
- + if (!p->global) p->global = -1;
- + reloc_all(p);
- + if (p->deps) for (i=0; p->deps[i]; i++)
- + if (p->deps[i]->global < 0)
- + p->deps[i]->global = 0;
- + if (p->global < 0) p->global = 0;
- + }
- +
- + if (mode & RTLD_GLOBAL) {
- + if (p->deps) for (i=0; p->deps[i]; i++)
- + p->deps[i]->global = 1;
- + p->global = 1;
- + }
- +
- + update_tls_size();
- + _dl_debug_state();
- + orig_tail = tail;
- +end:
- + __release_ptc();
- + if (p) gencnt++;
- + pthread_rwlock_unlock(&lock);
- + if (p) do_init_fini(orig_tail);
- + pthread_setcancelstate(cs, 0);
- + return p;
- +}
- +
- +__attribute__((__visibility__("hidden")))
- +int __dl_invalid_handle(void *h)
- +{
- + struct dso *p;
- + for (p=head; p; p=p->next) if (h==p) return 0;
- + error("Invalid library handle %p", (void *)h);
- + return 1;
- +}
- +
- +static void *addr2dso(size_t a)
- +{
- + struct dso *p;
- + size_t i;
- + if (DL_FDPIC) for (p=head; p; p=p->next) {
- + i = count_syms(p);
- + if (a-(size_t)p->funcdescs < i*sizeof(*p->funcdescs))
- + return p;
- + }
- + for (p=head; p; p=p->next) {
- + if (DL_FDPIC && p->loadmap) {
- + for (i=0; i<p->loadmap->nsegs; i++) {
- + if (a-p->loadmap->segs[i].p_vaddr
- + < p->loadmap->segs[i].p_memsz)
- + return p;
- + }
- + } else {
- + if (a-(size_t)p->map < p->map_len)
- + return p;
- + }
- + }
- + return 0;
- +}
- +
- +void *__tls_get_addr(size_t *);
- +
- +static void *do_dlsym(struct dso *p, const char *s, void *ra)
- +{
- + size_t i;
- + uint32_t h = 0, gh = 0, *ght;
- + Sym *sym;
- + if (p == head || p == RTLD_DEFAULT || p == RTLD_NEXT) {
- + if (p == RTLD_DEFAULT) {
- + p = head;
- + } else if (p == RTLD_NEXT) {
- + p = addr2dso((size_t)ra);
- + if (!p) p=head;
- + p = p->next;
- + }
- + struct symdef def = find_sym(p, s, 0);
- + if (!def.sym) goto failed;
- + if ((def.sym->st_info&0xf) == STT_TLS)
- + return __tls_get_addr((size_t []){def.dso->tls_id, def.sym->st_value});
- + if (DL_FDPIC && (def.sym->st_info&0xf) == STT_FUNC)
- + return def.dso->funcdescs + (def.sym - def.dso->syms);
- + return laddr(def.dso, def.sym->st_value);
- + }
- + if (__dl_invalid_handle(p))
- + return 0;
- + if ((ght = p->ghashtab)) {
- + gh = gnu_hash(s);
- + sym = gnu_lookup(gh, ght, p, s);
- + } else {
- + h = sysv_hash(s);
- + sym = sysv_lookup(s, h, p);
- + }
- + if (sym && (sym->st_info&0xf) == STT_TLS)
- + return __tls_get_addr((size_t []){p->tls_id, sym->st_value});
- + if (DL_FDPIC && sym && sym->st_shndx && (sym->st_info&0xf) == STT_FUNC)
- + return p->funcdescs + (sym - p->syms);
- + if (sym && sym->st_value && (1<<(sym->st_info&0xf) & OK_TYPES))
- + return laddr(p, sym->st_value);
- + if (p->deps) for (i=0; p->deps[i]; i++) {
- + if ((ght = p->deps[i]->ghashtab)) {
- + if (!gh) gh = gnu_hash(s);
- + sym = gnu_lookup(gh, ght, p->deps[i], s);
- + } else {
- + if (!h) h = sysv_hash(s);
- + sym = sysv_lookup(s, h, p->deps[i]);
- + }
- + if (sym && (sym->st_info&0xf) == STT_TLS)
- + return __tls_get_addr((size_t []){p->deps[i]->tls_id, sym->st_value});
- + if (DL_FDPIC && sym && sym->st_shndx && (sym->st_info&0xf) == STT_FUNC)
- + return p->deps[i]->funcdescs + (sym - p->deps[i]->syms);
- + if (sym && sym->st_value && (1<<(sym->st_info&0xf) & OK_TYPES))
- + return laddr(p->deps[i], sym->st_value);
- + }
- +failed:
- + error("Symbol not found: %s", s);
- + return 0;
- +}
- +
- +int dladdr(const void *addr, Dl_info *info)
- +{
- + struct dso *p;
- + Sym *sym, *bestsym;
- + uint32_t nsym;
- + char *strings;
- + void *best = 0;
- +
- + pthread_rwlock_rdlock(&lock);
- + p = addr2dso((size_t)addr);
- + pthread_rwlock_unlock(&lock);
- +
- + if (!p) return 0;
- +
- + sym = p->syms;
- + strings = p->strings;
- + nsym = count_syms(p);
- +
- + if (DL_FDPIC) {
- + size_t idx = ((size_t)addr-(size_t)p->funcdescs)
- + / sizeof(*p->funcdescs);
- + if (idx < nsym && (sym[idx].st_info&0xf) == STT_FUNC) {
- + best = p->funcdescs + idx;
- + bestsym = sym + idx;
- + }
- + }
- +
- + if (!best) for (; nsym; nsym--, sym++) {
- + if (sym->st_value
- + && (1<<(sym->st_info&0xf) & OK_TYPES)
- + && (1<<(sym->st_info>>4) & OK_BINDS)) {
- + void *symaddr = laddr(p, sym->st_value);
- + if (symaddr > addr || symaddr < best)
- + continue;
- + best = symaddr;
- + bestsym = sym;
- + if (addr == symaddr)
- + break;
- + }
- + }
- +
- + if (!best) return 0;
- +
- + if (DL_FDPIC && (bestsym->st_info&0xf) == STT_FUNC)
- + best = p->funcdescs + (bestsym - p->syms);
- +
- + info->dli_fname = p->name;
- + info->dli_fbase = p->base;
- + info->dli_sname = strings + bestsym->st_name;
- + info->dli_saddr = best;
- +
- + return 1;
- +}
- +
- +__attribute__((__visibility__("hidden")))
- +void *__dlsym(void *restrict p, const char *restrict s, void *restrict ra)
- +{
- + void *res;
- + pthread_rwlock_rdlock(&lock);
- + res = do_dlsym(p, s, ra);
- + pthread_rwlock_unlock(&lock);
- + return res;
- +}
- +
- +int dl_iterate_phdr(int(*callback)(struct dl_phdr_info *info, size_t size, void *data), void *data)
- +{
- + struct dso *current;
- + struct dl_phdr_info info;
- + int ret = 0;
- + for(current = head; current;) {
- + info.dlpi_addr = (uintptr_t)current->base;
- + info.dlpi_name = current->name;
- + info.dlpi_phdr = current->phdr;
- + info.dlpi_phnum = current->phnum;
- + info.dlpi_adds = gencnt;
- + info.dlpi_subs = 0;
- + info.dlpi_tls_modid = current->tls_id;
- + info.dlpi_tls_data = current->tls.image;
- +
- + ret = (callback)(&info, sizeof (info), data);
- +
- + if (ret != 0) break;
- +
- + pthread_rwlock_rdlock(&lock);
- + current = current->next;
- + pthread_rwlock_unlock(&lock);
- + }
- + return ret;
- +}
- +
- +__attribute__((__visibility__("hidden")))
- +void __dl_vseterr(const char *, va_list);
- +
- +static void error(const char *fmt, ...)
- +{
- + va_list ap;
- + va_start(ap, fmt);
- + if (!runtime) {
- + vdprintf(2, fmt, ap);
- + dprintf(2, "\n");
- + ldso_fail = 1;
- + va_end(ap);
- + return;
- + }
- + __dl_vseterr(fmt, ap);
- + va_end(ap);
- +}
- --- a/src/env/__init_tls.c
- +++ b/src/env/__init_tls.c
- @@ -8,9 +8,6 @@
- #include "atomic.h"
- #include "syscall.h"
-
- -#ifndef SHARED
- -static
- -#endif
- int __init_tp(void *p)
- {
- pthread_t td = p;
- @@ -24,8 +21,6 @@ int __init_tp(void *p)
- return 0;
- }
-
- -#ifndef SHARED
- -
- static struct builtin_tls {
- char c;
- struct pthread pt;
- @@ -33,33 +28,40 @@ static struct builtin_tls {
- } builtin_tls[1];
- #define MIN_TLS_ALIGN offsetof(struct builtin_tls, pt)
-
- -struct tls_image {
- - void *image;
- - size_t len, size, align;
- -} __static_tls;
- -
- -#define T __static_tls
- +static struct tls_module main_tls;
-
- void *__copy_tls(unsigned char *mem)
- {
- pthread_t td;
- - if (!T.image) return mem;
- - void **dtv = (void *)mem;
- - dtv[0] = (void *)1;
- + struct tls_module *p;
- + size_t i;
- + void **dtv;
- +
- #ifdef TLS_ABOVE_TP
- - mem += sizeof(void *) * 2;
- - mem += -((uintptr_t)mem + sizeof(struct pthread)) & (T.align-1);
- + dtv = (void **)(mem + libc.tls_size) - (libc.tls_cnt + 1);
- +
- + mem += -((uintptr_t)mem + sizeof(struct pthread)) & (libc.tls_align-1);
- td = (pthread_t)mem;
- mem += sizeof(struct pthread);
- +
- + for (i=1, p=libc.tls_head; p; i++, p=p->next) {
- + dtv[i] = mem + p->offset;
- + memcpy(dtv[i], p->image, p->len);
- + }
- #else
- + dtv = (void **)mem;
- +
- mem += libc.tls_size - sizeof(struct pthread);
- - mem -= (uintptr_t)mem & (T.align-1);
- + mem -= (uintptr_t)mem & (libc.tls_align-1);
- td = (pthread_t)mem;
- - mem -= T.size;
- +
- + for (i=1, p=libc.tls_head; p; i++, p=p->next) {
- + dtv[i] = mem - p->offset;
- + memcpy(dtv[i], p->image, p->len);
- + }
- #endif
- + dtv[0] = (void *)libc.tls_cnt;
- td->dtv = td->dtv_copy = dtv;
- - dtv[1] = mem;
- - memcpy(mem, T.image, T.len);
- return td;
- }
-
- @@ -69,7 +71,7 @@ typedef Elf32_Phdr Phdr;
- typedef Elf64_Phdr Phdr;
- #endif
-
- -void __init_tls(size_t *aux)
- +static void static_init_tls(size_t *aux)
- {
- unsigned char *p;
- size_t n;
- @@ -86,16 +88,24 @@ void __init_tls(size_t *aux)
- }
-
- if (tls_phdr) {
- - T.image = (void *)(base + tls_phdr->p_vaddr);
- - T.len = tls_phdr->p_filesz;
- - T.size = tls_phdr->p_memsz;
- - T.align = tls_phdr->p_align;
- + main_tls.image = (void *)(base + tls_phdr->p_vaddr);
- + main_tls.len = tls_phdr->p_filesz;
- + main_tls.size = tls_phdr->p_memsz;
- + main_tls.align = tls_phdr->p_align;
- + libc.tls_cnt = 1;
- + libc.tls_head = &main_tls;
- }
-
- - T.size += (-T.size - (uintptr_t)T.image) & (T.align-1);
- - if (T.align < MIN_TLS_ALIGN) T.align = MIN_TLS_ALIGN;
- + main_tls.size += (-main_tls.size - (uintptr_t)main_tls.image)
- + & (main_tls.align-1);
- + if (main_tls.align < MIN_TLS_ALIGN) main_tls.align = MIN_TLS_ALIGN;
- +#ifndef TLS_ABOVE_TP
- + main_tls.offset = main_tls.size;
- +#endif
-
- - libc.tls_size = 2*sizeof(void *)+T.size+T.align+sizeof(struct pthread)
- + libc.tls_align = main_tls.align;
- + libc.tls_size = 2*sizeof(void *) + sizeof(struct pthread)
- + + main_tls.size + main_tls.align
- + MIN_TLS_ALIGN-1 & -MIN_TLS_ALIGN;
-
- if (libc.tls_size > sizeof builtin_tls) {
- @@ -117,6 +127,5 @@ void __init_tls(size_t *aux)
- if (__init_tp(__copy_tls(mem)) < 0)
- a_crash();
- }
- -#else
- -void __init_tls(size_t *auxv) { }
- -#endif
- +
- +weak_alias(static_init_tls, __init_tls);
- --- a/src/env/__libc_start_main.c
- +++ b/src/env/__libc_start_main.c
- @@ -8,21 +8,17 @@
-
- void __init_tls(size_t *);
-
- -#ifndef SHARED
- -static void dummy() {}
- +static void dummy(void) {}
- weak_alias(dummy, _init);
- -extern void (*const __init_array_start)() __attribute__((weak));
- -extern void (*const __init_array_end)() __attribute__((weak));
- -#endif
- +
- +__attribute__((__weak__, __visibility__("hidden")))
- +extern void (*const __init_array_start)(void), (*const __init_array_end)(void);
-
- static void dummy1(void *p) {}
- weak_alias(dummy1, __init_ssp);
-
- #define AUX_CNT 38
-
- -#ifndef SHARED
- -static
- -#endif
- void __init_libc(char **envp, char *pn)
- {
- size_t i, *auxv, aux[AUX_CNT] = { 0 };
- @@ -57,20 +53,22 @@ void __init_libc(char **envp, char *pn)
- libc.secure = 1;
- }
-
- -int __libc_start_main(int (*main)(int,char **,char **), int argc, char **argv)
- +static void libc_start_init(void)
- {
- - char **envp = argv+argc+1;
- -
- -#ifndef SHARED
- - __init_libc(envp, argv[0]);
- _init();
- uintptr_t a = (uintptr_t)&__init_array_start;
- for (; a<(uintptr_t)&__init_array_end; a+=sizeof(void(*)()))
- (*(void (**)())a)();
- -#else
- - void __libc_start_init(void);
- +}
- +
- +weak_alias(libc_start_init, __libc_start_init);
- +
- +int __libc_start_main(int (*main)(int,char **,char **), int argc, char **argv)
- +{
- + char **envp = argv+argc+1;
- +
- + __init_libc(envp, argv[0]);
- __libc_start_init();
- -#endif
-
- /* Pass control to the application */
- exit(main(argc, argv, envp));
- --- a/src/env/__reset_tls.c
- +++ b/src/env/__reset_tls.c
- @@ -1,21 +1,16 @@
- -#ifndef SHARED
- -
- #include <string.h>
- #include "pthread_impl.h"
- -
- -extern struct tls_image {
- - void *image;
- - size_t len, size, align;
- -} __static_tls;
- -
- -#define T __static_tls
- +#include "libc.h"
-
- void __reset_tls()
- {
- - if (!T.size) return;
- pthread_t self = __pthread_self();
- - memcpy(self->dtv[1], T.image, T.len);
- - memset((char *)self->dtv[1]+T.len, 0, T.size-T.len);
- + struct tls_module *p;
- + size_t i, n = (size_t)self->dtv[0];
- + if (n) for (p=libc.tls_head, i=1; i<=n; i++, p=p->next) {
- + if (!self->dtv[i]) continue;
- + memcpy(self->dtv[i], p->image, p->len);
- + memset((char *)self->dtv[i]+p->len, 0,
- + p->size - p->len);
- + }
- }
- -
- -#endif
- --- a/src/env/__stack_chk_fail.c
- +++ b/src/env/__stack_chk_fail.c
- @@ -17,16 +17,7 @@ void __stack_chk_fail(void)
- a_crash();
- }
-
- -#ifdef SHARED
- -
- __attribute__((__visibility__("hidden")))
- -void __stack_chk_fail_local(void)
- -{
- - a_crash();
- -}
- -
- -#else
- +void __stack_chk_fail_local(void);
-
- weak_alias(__stack_chk_fail, __stack_chk_fail_local);
- -
- -#endif
- --- /dev/null
- +++ b/src/exit/arm/__aeabi_atexit.c
- @@ -0,0 +1,6 @@
- +int __cxa_atexit(void (*func)(void *), void *arg, void *dso);
- +
- +int __aeabi_atexit (void *obj, void (*func) (void *), void *d)
- +{
- + return __cxa_atexit (func, obj, d);
- +}
- --- a/src/exit/exit.c
- +++ b/src/exit/exit.c
- @@ -10,25 +10,25 @@ static void dummy()
- * as a consequence of linking either __toread.c or __towrite.c. */
- weak_alias(dummy, __funcs_on_exit);
- weak_alias(dummy, __stdio_exit);
- -
- -#ifndef SHARED
- weak_alias(dummy, _fini);
- -extern void (*const __fini_array_start)() __attribute__((weak));
- -extern void (*const __fini_array_end)() __attribute__((weak));
- -#endif
-
- -_Noreturn void exit(int code)
- -{
- - __funcs_on_exit();
- +__attribute__((__weak__, __visibility__("hidden")))
- +extern void (*const __fini_array_start)(void), (*const __fini_array_end)(void);
-
- -#ifndef SHARED
- +static void libc_exit_fini(void)
- +{
- uintptr_t a = (uintptr_t)&__fini_array_end;
- for (; a>(uintptr_t)&__fini_array_start; a-=sizeof(void(*)()))
- (*(void (**)())(a-sizeof(void(*)())))();
- _fini();
- -#endif
- +}
-
- - __stdio_exit();
- +weak_alias(libc_exit_fini, __libc_exit_fini);
-
- +_Noreturn void exit(int code)
- +{
- + __funcs_on_exit();
- + __libc_exit_fini();
- + __stdio_exit();
- _Exit(code);
- }
- --- /dev/null
- +++ b/src/fenv/arm/fenv-hf.S
- @@ -0,0 +1,69 @@
- +#if __ARM_PCS_VFP
- +
- +.syntax unified
- +.fpu vfp
- +
- +.global fegetround
- +.type fegetround,%function
- +fegetround:
- + fmrx r0, fpscr
- + and r0, r0, #0xc00000
- + bx lr
- +
- +.global __fesetround
- +.type __fesetround,%function
- +__fesetround:
- + fmrx r3, fpscr
- + bic r3, r3, #0xc00000
- + orr r3, r3, r0
- + fmxr fpscr, r3
- + mov r0, #0
- + bx lr
- +
- +.global fetestexcept
- +.type fetestexcept,%function
- +fetestexcept:
- + and r0, r0, #0x1f
- + fmrx r3, fpscr
- + and r0, r0, r3
- + bx lr
- +
- +.global feclearexcept
- +.type feclearexcept,%function
- +feclearexcept:
- + and r0, r0, #0x1f
- + fmrx r3, fpscr
- + bic r3, r3, r0
- + fmxr fpscr, r3
- + mov r0, #0
- + bx lr
- +
- +.global feraiseexcept
- +.type feraiseexcept,%function
- +feraiseexcept:
- + and r0, r0, #0x1f
- + fmrx r3, fpscr
- + orr r3, r3, r0
- + fmxr fpscr, r3
- + mov r0, #0
- + bx lr
- +
- +.global fegetenv
- +.type fegetenv,%function
- +fegetenv:
- + fmrx r3, fpscr
- + str r3, [r0]
- + mov r0, #0
- + bx lr
- +
- +.global fesetenv
- +.type fesetenv,%function
- +fesetenv:
- + cmn r0, #1
- + moveq r3, #0
- + ldrne r3, [r0]
- + fmxr fpscr, r3
- + mov r0, #0
- + bx lr
- +
- +#endif
- --- /dev/null
- +++ b/src/fenv/arm/fenv.c
- @@ -0,0 +1,3 @@
- +#if !__ARM_PCS_VFP
- +#include "../fenv.c"
- +#endif
- --- a/src/fenv/armebhf/fenv.sub
- +++ /dev/null
- @@ -1 +0,0 @@
- -../armhf/fenv.s
- --- a/src/fenv/armhf/fenv.s
- +++ /dev/null
- @@ -1,64 +0,0 @@
- -.fpu vfp
- -
- -.global fegetround
- -.type fegetround,%function
- -fegetround:
- - mrc p10, 7, r0, cr1, cr0, 0
- - and r0, r0, #0xc00000
- - bx lr
- -
- -.global __fesetround
- -.type __fesetround,%function
- -__fesetround:
- - mrc p10, 7, r3, cr1, cr0, 0
- - bic r3, r3, #0xc00000
- - orr r3, r3, r0
- - mcr p10, 7, r3, cr1, cr0, 0
- - mov r0, #0
- - bx lr
- -
- -.global fetestexcept
- -.type fetestexcept,%function
- -fetestexcept:
- - and r0, r0, #0x1f
- - mrc p10, 7, r3, cr1, cr0, 0
- - and r0, r0, r3
- - bx lr
- -
- -.global feclearexcept
- -.type feclearexcept,%function
- -feclearexcept:
- - and r0, r0, #0x1f
- - mrc p10, 7, r3, cr1, cr0, 0
- - bic r3, r3, r0
- - mcr p10, 7, r3, cr1, cr0, 0
- - mov r0, #0
- - bx lr
- -
- -.global feraiseexcept
- -.type feraiseexcept,%function
- -feraiseexcept:
- - and r0, r0, #0x1f
- - mrc p10, 7, r3, cr1, cr0, 0
- - orr r3, r3, r0
- - mcr p10, 7, r3, cr1, cr0, 0
- - mov r0, #0
- - bx lr
- -
- -.global fegetenv
- -.type fegetenv,%function
- -fegetenv:
- - mrc p10, 7, r3, cr1, cr0, 0
- - str r3, [r0]
- - mov r0, #0
- - bx lr
- -
- -.global fesetenv
- -.type fesetenv,%function
- -fesetenv:
- - cmn r0, #1
- - moveq r3, #0
- - ldrne r3, [r0]
- - mcr p10, 7, r3, cr1, cr0, 0
- - mov r0, #0
- - bx lr
- --- a/src/fenv/armhf/fenv.sub
- +++ /dev/null
- @@ -1 +0,0 @@
- -fenv.s
- --- a/src/fenv/mips-sf/fenv.sub
- +++ /dev/null
- @@ -1 +0,0 @@
- -../fenv.c
- --- /dev/null
- +++ b/src/fenv/mips/fenv-sf.c
- @@ -0,0 +1,3 @@
- +#ifdef __mips_soft_float
- +#include "../fenv.c"
- +#endif
- --- /dev/null
- +++ b/src/fenv/mips/fenv.S
- @@ -0,0 +1,71 @@
- +#ifndef __mips_soft_float
- +
- +.set noreorder
- +
- +.global feclearexcept
- +.type feclearexcept,@function
- +feclearexcept:
- + and $4, $4, 0x7c
- + cfc1 $5, $31
- + or $5, $5, $4
- + xor $5, $5, $4
- + ctc1 $5, $31
- + jr $ra
- + li $2, 0
- +
- +.global feraiseexcept
- +.type feraiseexcept,@function
- +feraiseexcept:
- + and $4, $4, 0x7c
- + cfc1 $5, $31
- + or $5, $5, $4
- + ctc1 $5, $31
- + jr $ra
- + li $2, 0
- +
- +.global fetestexcept
- +.type fetestexcept,@function
- +fetestexcept:
- + and $4, $4, 0x7c
- + cfc1 $2, $31
- + jr $ra
- + and $2, $2, $4
- +
- +.global fegetround
- +.type fegetround,@function
- +fegetround:
- + cfc1 $2, $31
- + jr $ra
- + andi $2, $2, 3
- +
- +.global __fesetround
- +.type __fesetround,@function
- +__fesetround:
- + cfc1 $5, $31
- + li $6, -4
- + and $5, $5, $6
- + or $5, $5, $4
- + ctc1 $5, $31
- + jr $ra
- + li $2, 0
- +
- +.global fegetenv
- +.type fegetenv,@function
- +fegetenv:
- + cfc1 $5, $31
- + sw $5, 0($4)
- + jr $ra
- + li $2, 0
- +
- +.global fesetenv
- +.type fesetenv,@function
- +fesetenv:
- + addiu $5, $4, 1
- + beq $5, $0, 1f
- + nop
- + lw $5, 0($4)
- +1: ctc1 $5, $31
- + jr $ra
- + li $2, 0
- +
- +#endif
- --- a/src/fenv/mips/fenv.s
- +++ /dev/null
- @@ -1,67 +0,0 @@
- -.set noreorder
- -
- -.global feclearexcept
- -.type feclearexcept,@function
- -feclearexcept:
- - and $4, $4, 0x7c
- - cfc1 $5, $31
- - or $5, $5, $4
- - xor $5, $5, $4
- - ctc1 $5, $31
- - jr $ra
- - li $2, 0
- -
- -.global feraiseexcept
- -.type feraiseexcept,@function
- -feraiseexcept:
- - and $4, $4, 0x7c
- - cfc1 $5, $31
- - or $5, $5, $4
- - ctc1 $5, $31
- - jr $ra
- - li $2, 0
- -
- -.global fetestexcept
- -.type fetestexcept,@function
- -fetestexcept:
- - and $4, $4, 0x7c
- - cfc1 $2, $31
- - jr $ra
- - and $2, $2, $4
- -
- -.global fegetround
- -.type fegetround,@function
- -fegetround:
- - cfc1 $2, $31
- - jr $ra
- - andi $2, $2, 3
- -
- -.global __fesetround
- -.type __fesetround,@function
- -__fesetround:
- - cfc1 $5, $31
- - li $6, -4
- - and $5, $5, $6
- - or $5, $5, $4
- - ctc1 $5, $31
- - jr $ra
- - li $2, 0
- -
- -.global fegetenv
- -.type fegetenv,@function
- -fegetenv:
- - cfc1 $5, $31
- - sw $5, 0($4)
- - jr $ra
- - li $2, 0
- -
- -.global fesetenv
- -.type fesetenv,@function
- -fesetenv:
- - addiu $5, $4, 1
- - beq $5, $0, 1f
- - nop
- - lw $5, 0($4)
- -1: ctc1 $5, $31
- - jr $ra
- - li $2, 0
- --- a/src/fenv/mipsel-sf/fenv.sub
- +++ /dev/null
- @@ -1 +0,0 @@
- -../fenv.c
- --- a/src/fenv/sh-nofpu/fenv.sub
- +++ /dev/null
- @@ -1 +0,0 @@
- -../fenv.c
- --- /dev/null
- +++ b/src/fenv/sh/fenv-nofpu.c
- @@ -0,0 +1,3 @@
- +#if !__SH_FPU_ANY__ && !__SH4__
- +#include "../fenv.c"
- +#endif
- --- /dev/null
- +++ b/src/fenv/sh/fenv.S
- @@ -0,0 +1,78 @@
- +#if __SH_FPU_ANY__ || __SH4__
- +
- +.global fegetround
- +.type fegetround, @function
- +fegetround:
- + sts fpscr, r0
- + rts
- + and #3, r0
- +
- +.global __fesetround
- +.type __fesetround, @function
- +__fesetround:
- + sts fpscr, r0
- + or r4, r0
- + lds r0, fpscr
- + rts
- + mov #0, r0
- +
- +.global fetestexcept
- +.type fetestexcept, @function
- +fetestexcept:
- + sts fpscr, r0
- + and r4, r0
- + rts
- + and #0x7c, r0
- +
- +.global feclearexcept
- +.type feclearexcept, @function
- +feclearexcept:
- + mov r4, r0
- + and #0x7c, r0
- + not r0, r4
- + sts fpscr, r0
- + and r4, r0
- + lds r0, fpscr
- + rts
- + mov #0, r0
- +
- +.global feraiseexcept
- +.type feraiseexcept, @function
- +feraiseexcept:
- + mov r4, r0
- + and #0x7c, r0
- + sts fpscr, r4
- + or r4, r0
- + lds r0, fpscr
- + rts
- + mov #0, r0
- +
- +.global fegetenv
- +.type fegetenv, @function
- +fegetenv:
- + sts fpscr, r0
- + mov.l r0, @r4
- + rts
- + mov #0, r0
- +
- +.global fesetenv
- +.type fesetenv, @function
- +fesetenv:
- + mov r4, r0
- + cmp/eq #-1, r0
- + bf 1f
- +
- + ! the default environment is complicated by the fact that we need to
- + ! preserve the current precision bit, which we do not know a priori
- + sts fpscr, r0
- + mov #8, r1
- + swap.w r1, r1
- + bra 2f
- + and r1, r0
- +
- +1: mov.l @r4, r0 ! non-default environment
- +2: lds r0, fpscr
- + rts
- + mov #0, r0
- +
- +#endif
- --- a/src/fenv/sh/fenv.s
- +++ /dev/null
- @@ -1,74 +0,0 @@
- -.global fegetround
- -.type fegetround, @function
- -fegetround:
- - sts fpscr, r0
- - rts
- - and #3, r0
- -
- -.global __fesetround
- -.type __fesetround, @function
- -__fesetround:
- - sts fpscr, r0
- - or r4, r0
- - lds r0, fpscr
- - rts
- - mov #0, r0
- -
- -.global fetestexcept
- -.type fetestexcept, @function
- -fetestexcept:
- - sts fpscr, r0
- - and r4, r0
- - rts
- - and #0x7c, r0
- -
- -.global feclearexcept
- -.type feclearexcept, @function
- -feclearexcept:
- - mov r4, r0
- - and #0x7c, r0
- - not r0, r4
- - sts fpscr, r0
- - and r4, r0
- - lds r0, fpscr
- - rts
- - mov #0, r0
- -
- -.global feraiseexcept
- -.type feraiseexcept, @function
- -feraiseexcept:
- - mov r4, r0
- - and #0x7c, r0
- - sts fpscr, r4
- - or r4, r0
- - lds r0, fpscr
- - rts
- - mov #0, r0
- -
- -.global fegetenv
- -.type fegetenv, @function
- -fegetenv:
- - sts fpscr, r0
- - mov.l r0, @r4
- - rts
- - mov #0, r0
- -
- -.global fesetenv
- -.type fesetenv, @function
- -fesetenv:
- - mov r4, r0
- - cmp/eq #-1, r0
- - bf 1f
- -
- - ! the default environment is complicated by the fact that we need to
- - ! preserve the current precision bit, which we do not know a priori
- - sts fpscr, r0
- - mov #8, r1
- - swap.w r1, r1
- - bra 2f
- - and r1, r0
- -
- -1: mov.l @r4, r0 ! non-default environment
- -2: lds r0, fpscr
- - rts
- - mov #0, r0
- --- a/src/fenv/sheb-nofpu/fenv.sub
- +++ /dev/null
- @@ -1 +0,0 @@
- -../fenv.c
- --- a/src/internal/arm/syscall.s
- +++ b/src/internal/arm/syscall.s
- @@ -1,3 +1,4 @@
- +.syntax unified
- .global __syscall
- .hidden __syscall
- .type __syscall,%function
- @@ -11,6 +12,4 @@ __syscall:
- ldmfd ip,{r3,r4,r5,r6}
- svc 0
- ldmfd sp!,{r4,r5,r6,r7}
- - tst lr,#1
- - moveq pc,lr
- bx lr
- --- /dev/null
- +++ b/src/internal/atomic.h
- @@ -0,0 +1,275 @@
- +#ifndef _ATOMIC_H
- +#define _ATOMIC_H
- +
- +#include <stdint.h>
- +
- +#include "atomic_arch.h"
- +
- +#ifdef a_ll
- +
- +#ifndef a_pre_llsc
- +#define a_pre_llsc()
- +#endif
- +
- +#ifndef a_post_llsc
- +#define a_post_llsc()
- +#endif
- +
- +#ifndef a_cas
- +#define a_cas a_cas
- +static inline int a_cas(volatile int *p, int t, int s)
- +{
- + int old;
- + a_pre_llsc();
- + do old = a_ll(p);
- + while (old==t && !a_sc(p, s));
- + a_post_llsc();
- + return old;
- +}
- +#endif
- +
- +#ifndef a_swap
- +#define a_swap a_swap
- +static inline int a_swap(volatile int *p, int v)
- +{
- + int old;
- + a_pre_llsc();
- + do old = a_ll(p);
- + while (!a_sc(p, v));
- + a_post_llsc();
- + return old;
- +}
- +#endif
- +
- +#ifndef a_fetch_add
- +#define a_fetch_add a_fetch_add
- +static inline int a_fetch_add(volatile int *p, int v)
- +{
- + int old;
- + a_pre_llsc();
- + do old = a_ll(p);
- + while (!a_sc(p, (unsigned)old + v));
- + a_post_llsc();
- + return old;
- +}
- +#endif
- +
- +#ifndef a_fetch_and
- +#define a_fetch_and a_fetch_and
- +static inline int a_fetch_and(volatile int *p, int v)
- +{
- + int old;
- + a_pre_llsc();
- + do old = a_ll(p);
- + while (!a_sc(p, old & v));
- + a_post_llsc();
- + return old;
- +}
- +#endif
- +
- +#ifndef a_fetch_or
- +#define a_fetch_or a_fetch_or
- +static inline int a_fetch_or(volatile int *p, int v)
- +{
- + int old;
- + a_pre_llsc();
- + do old = a_ll(p);
- + while (!a_sc(p, old | v));
- + a_post_llsc();
- + return old;
- +}
- +#endif
- +
- +#endif
- +
- +#ifndef a_cas
- +#error missing definition of a_cas
- +#endif
- +
- +#ifndef a_swap
- +#define a_swap a_swap
- +static inline int a_swap(volatile int *p, int v)
- +{
- + int old;
- + do old = *p;
- + while (a_cas(p, old, v) != old);
- + return old;
- +}
- +#endif
- +
- +#ifndef a_fetch_add
- +#define a_fetch_add a_fetch_add
- +static inline int a_fetch_add(volatile int *p, int v)
- +{
- + int old;
- + do old = *p;
- + while (a_cas(p, old, (unsigned)old+v) != old);
- + return old;
- +}
- +#endif
- +
- +#ifndef a_fetch_and
- +#define a_fetch_and a_fetch_and
- +static inline int a_fetch_and(volatile int *p, int v)
- +{
- + int old;
- + do old = *p;
- + while (a_cas(p, old, old&v) != old);
- + return old;
- +}
- +#endif
- +#ifndef a_fetch_or
- +#define a_fetch_or a_fetch_or
- +static inline int a_fetch_or(volatile int *p, int v)
- +{
- + int old;
- + do old = *p;
- + while (a_cas(p, old, old|v) != old);
- + return old;
- +}
- +#endif
- +
- +#ifndef a_and
- +#define a_and a_and
- +static inline void a_and(volatile int *p, int v)
- +{
- + a_fetch_and(p, v);
- +}
- +#endif
- +
- +#ifndef a_or
- +#define a_or a_or
- +static inline void a_or(volatile int *p, int v)
- +{
- + a_fetch_or(p, v);
- +}
- +#endif
- +
- +#ifndef a_inc
- +#define a_inc a_inc
- +static inline void a_inc(volatile int *p)
- +{
- + a_fetch_add(p, 1);
- +}
- +#endif
- +
- +#ifndef a_dec
- +#define a_dec a_dec
- +static inline void a_dec(volatile int *p)
- +{
- + a_fetch_add(p, -1);
- +}
- +#endif
- +
- +#ifndef a_store
- +#define a_store a_store
- +static inline void a_store(volatile int *p, int v)
- +{
- +#ifdef a_barrier
- + a_barrier();
- + *p = v;
- + a_barrier();
- +#else
- + a_swap(p, v);
- +#endif
- +}
- +#endif
- +
- +#ifndef a_barrier
- +#define a_barrier a_barrier
- +static void a_barrier()
- +{
- + volatile int tmp = 0;
- + a_cas(&tmp, 0, 0);
- +}
- +#endif
- +
- +#ifndef a_spin
- +#define a_spin a_barrier
- +#endif
- +
- +#ifndef a_and_64
- +#define a_and_64 a_and_64
- +static inline void a_and_64(volatile uint64_t *p, uint64_t v)
- +{
- + union { uint64_t v; uint32_t r[2]; } u = { v };
- + if (u.r[0]+1) a_and((int *)p, u.r[0]);
- + if (u.r[1]+1) a_and((int *)p+1, u.r[1]);
- +}
- +#endif
- +
- +#ifndef a_or_64
- +#define a_or_64 a_or_64
- +static inline void a_or_64(volatile uint64_t *p, uint64_t v)
- +{
- + union { uint64_t v; uint32_t r[2]; } u = { v };
- + if (u.r[0]) a_or((int *)p, u.r[0]);
- + if (u.r[1]) a_or((int *)p+1, u.r[1]);
- +}
- +#endif
- +
- +#ifndef a_cas_p
- +#define a_cas_p a_cas_p
- +static inline void *a_cas_p(volatile void *p, void *t, void *s)
- +{
- + return (void *)a_cas((volatile int *)p, (int)t, (int)s);
- +}
- +#endif
- +
- +#ifndef a_or_l
- +#define a_or_l a_or_l
- +static inline void a_or_l(volatile void *p, long v)
- +{
- + if (sizeof(long) == sizeof(int)) a_or(p, v);
- + else a_or_64(p, v);
- +}
- +#endif
- +
- +#ifndef a_crash
- +#define a_crash a_crash
- +static inline void a_crash()
- +{
- + *(volatile char *)0=0;
- +}
- +#endif
- +
- +#ifndef a_ctz_64
- +#define a_ctz_64 a_ctz_64
- +static inline int a_ctz_64(uint64_t x)
- +{
- + static const char debruijn64[64] = {
- + 0, 1, 2, 53, 3, 7, 54, 27, 4, 38, 41, 8, 34, 55, 48, 28,
- + 62, 5, 39, 46, 44, 42, 22, 9, 24, 35, 59, 56, 49, 18, 29, 11,
- + 63, 52, 6, 26, 37, 40, 33, 47, 61, 45, 43, 21, 23, 58, 17, 10,
- + 51, 25, 36, 32, 60, 20, 57, 16, 50, 31, 19, 15, 30, 14, 13, 12
- + };
- + static const char debruijn32[32] = {
- + 0, 1, 23, 2, 29, 24, 19, 3, 30, 27, 25, 11, 20, 8, 4, 13,
- + 31, 22, 28, 18, 26, 10, 7, 12, 21, 17, 9, 6, 16, 5, 15, 14
- + };
- + if (sizeof(long) < 8) {
- + uint32_t y = x;
- + if (!y) {
- + y = x>>32;
- + return 32 + debruijn32[(y&-y)*0x076be629 >> 27];
- + }
- + return debruijn32[(y&-y)*0x076be629 >> 27];
- + }
- + return debruijn64[(x&-x)*0x022fdd63cc95386dull >> 58];
- +}
- +#endif
- +
- +#ifndef a_ctz_l
- +#define a_ctz_l a_ctz_l
- +static inline int a_ctz_l(unsigned long x)
- +{
- + static const char debruijn32[32] = {
- + 0, 1, 23, 2, 29, 24, 19, 3, 30, 27, 25, 11, 20, 8, 4, 13,
- + 31, 22, 28, 18, 26, 10, 7, 12, 21, 17, 9, 6, 16, 5, 15, 14
- + };
- + if (sizeof(long) == 8) return a_ctz_64(x);
- + return debruijn32[(x&-x)*0x076be629 >> 27];
- +}
- +#endif
- +
- +#endif
- --- a/src/internal/dynlink.h
- +++ b/src/internal/dynlink.h
- @@ -64,6 +64,10 @@ struct fdpic_dummy_loadmap {
- #define DL_FDPIC 0
- #endif
-
- +#ifndef DL_NOMMU_SUPPORT
- +#define DL_NOMMU_SUPPORT 0
- +#endif
- +
- #if !DL_FDPIC
- #define IS_RELATIVE(x,s) ( \
- (R_TYPE(x) == REL_RELATIVE) || \
- --- a/src/internal/libc.h
- +++ b/src/internal/libc.h
- @@ -11,13 +11,20 @@ struct __locale_struct {
- const struct __locale_map *volatile cat[6];
- };
-
- +struct tls_module {
- + struct tls_module *next;
- + void *image;
- + size_t len, size, align, offset;
- +};
- +
- struct __libc {
- int can_do_threads;
- int threaded;
- int secure;
- volatile int threads_minus_1;
- size_t *auxv;
- - size_t tls_size;
- + struct tls_module *tls_head;
- + size_t tls_size, tls_align, tls_cnt;
- size_t page_size;
- struct __locale_struct global_locale;
- };
- --- /dev/null
- +++ b/src/internal/sh/__shcall.c
- @@ -0,0 +1,5 @@
- +__attribute__((__visibility__("hidden")))
- +int __shcall(void *arg, int (*func)(void *))
- +{
- + return func(arg);
- +}
- --- a/src/internal/syscall.h
- +++ b/src/internal/syscall.h
- @@ -17,9 +17,7 @@
- typedef long syscall_arg_t;
- #endif
-
- -#ifdef SHARED
- __attribute__((visibility("hidden")))
- -#endif
- long __syscall_ret(unsigned long), __syscall(syscall_arg_t, ...),
- __syscall_cp(syscall_arg_t, syscall_arg_t, syscall_arg_t, syscall_arg_t,
- syscall_arg_t, syscall_arg_t, syscall_arg_t);
- @@ -65,7 +63,7 @@ long __syscall_ret(unsigned long), __sys
- #define __syscall_cp(...) __SYSCALL_DISP(__syscall_cp,__VA_ARGS__)
- #define syscall_cp(...) __syscall_ret(__syscall_cp(__VA_ARGS__))
-
- -#ifdef SYS_socket
- +#ifndef SYSCALL_USE_SOCKETCALL
- #define __socketcall(nm,a,b,c,d,e,f) syscall(SYS_##nm, a, b, c, d, e, f)
- #define __socketcall_cp(nm,a,b,c,d,e,f) syscall_cp(SYS_##nm, a, b, c, d, e, f)
- #else
- --- a/src/internal/version.c
- +++ b/src/internal/version.c
- @@ -1,12 +1,9 @@
- -#ifdef SHARED
- -
- #include "version.h"
-
- static const char version[] = VERSION;
-
- +__attribute__((__visibility__("hidden")))
- const char *__libc_get_version()
- {
- return version;
- }
- -
- -#endif
- --- a/src/internal/vis.h
- +++ b/src/internal/vis.h
- @@ -4,10 +4,9 @@
- * override default visibilities to reduce the size and performance costs
- * of position-independent code. */
-
- -#ifndef CRT
- -#ifdef SHARED
- +#if !defined(CRT) && !defined(__ASSEMBLER__)
-
- -/* For shared libc.so, all symbols should be protected, but some toolchains
- +/* Conceptually, all symbols should be protected, but some toolchains
- * fail to support copy relocations for protected data, so exclude all
- * exported data symbols. */
-
- @@ -25,16 +24,4 @@ extern char *optarg, **environ, **__envi
-
- #pragma GCC visibility push(protected)
-
- -#elif defined(__PIC__)
- -
- -/* If building static libc.a as position-independent code, try to make
- - * everything hidden except possibly-undefined weak references. */
- -
- -__attribute__((__visibility__("default")))
- -extern void (*const __init_array_start)(), (*const __init_array_end)(),
- - (*const __fini_array_start)(), (*const __fini_array_end)();
- -
- -#pragma GCC visibility push(hidden)
- -
- -#endif
- #endif
- --- /dev/null
- +++ b/src/ldso/__dlsym.c
- @@ -0,0 +1,13 @@
- +#include <dlfcn.h>
- +#include "libc.h"
- +
- +__attribute__((__visibility__("hidden")))
- +void __dl_seterr(const char *, ...);
- +
- +static void *stub_dlsym(void *restrict p, const char *restrict s, void *restrict ra)
- +{
- + __dl_seterr("Symbol not found: %s", s);
- + return 0;
- +}
- +
- +weak_alias(stub_dlsym, __dlsym);
- --- a/src/ldso/arm/dlsym.s
- +++ b/src/ldso/arm/dlsym.s
- @@ -1,3 +1,4 @@
- +.syntax unified
- .text
- .global dlsym
- .hidden __dlsym
- --- /dev/null
- +++ b/src/ldso/arm/find_exidx.c
- @@ -0,0 +1,42 @@
- +#define _GNU_SOURCE
- +#include <link.h>
- +#include <stdint.h>
- +
- +struct find_exidx_data {
- + uintptr_t pc, exidx_start;
- + int exidx_len;
- +};
- +
- +static int find_exidx(struct dl_phdr_info *info, size_t size, void *ptr)
- +{
- + struct find_exidx_data *data = ptr;
- + const ElfW(Phdr) *phdr = info->dlpi_phdr;
- + uintptr_t addr, exidx_start = 0;
- + int i, match = 0, exidx_len = 0;
- +
- + for (i = info->dlpi_phnum; i > 0; i--, phdr++) {
- + addr = info->dlpi_addr + phdr->p_vaddr;
- + switch (phdr->p_type) {
- + case PT_LOAD:
- + match |= data->pc >= addr && data->pc < addr + phdr->p_memsz;
- + break;
- + case PT_ARM_EXIDX:
- + exidx_start = addr;
- + exidx_len = phdr->p_memsz;
- + break;
- + }
- + }
- + data->exidx_start = exidx_start;
- + data->exidx_len = exidx_len;
- + return match;
- +}
- +
- +uintptr_t __gnu_Unwind_Find_exidx(uintptr_t pc, int *pcount)
- +{
- + struct find_exidx_data data;
- + data.pc = pc;
- + if (dl_iterate_phdr(find_exidx, &data) <= 0)
- + return 0;
- + *pcount = data.exidx_len / 8;
- + return data.exidx_start;
- +}
- --- a/src/ldso/dl_iterate_phdr.c
- +++ b/src/ldso/dl_iterate_phdr.c
- @@ -1,12 +1,10 @@
- -#ifndef SHARED
- -
- #include <elf.h>
- #include <link.h>
- #include "libc.h"
-
- #define AUX_CNT 38
-
- -int dl_iterate_phdr(int(*callback)(struct dl_phdr_info *info, size_t size, void *data), void *data)
- +static int static_dl_iterate_phdr(int(*callback)(struct dl_phdr_info *info, size_t size, void *data), void *data)
- {
- unsigned char *p;
- ElfW(Phdr) *phdr, *tls_phdr=0;
- @@ -40,4 +38,5 @@ int dl_iterate_phdr(int(*callback)(struc
- }
- return (callback)(&info, sizeof (info), data);
- }
- -#endif
- +
- +weak_alias(static_dl_iterate_phdr, dl_iterate_phdr);
- --- a/src/ldso/dladdr.c
- +++ b/src/ldso/dladdr.c
- @@ -1,9 +1,10 @@
- #define _GNU_SOURCE
- #include <dlfcn.h>
- +#include "libc.h"
-
- -int __dladdr(const void *, Dl_info *);
- -
- -int dladdr(const void *addr, Dl_info *info)
- +static int stub_dladdr(const void *addr, Dl_info *info)
- {
- - return __dladdr(addr, info);
- + return 0;
- }
- +
- +weak_alias(stub_dladdr, dladdr);
- --- /dev/null
- +++ b/src/ldso/dlclose.c
- @@ -0,0 +1,9 @@
- +#include <dlfcn.h>
- +
- +__attribute__((__visibility__("hidden")))
- +int __dl_invalid_handle(void *);
- +
- +int dlclose(void *p)
- +{
- + return __dl_invalid_handle(p);
- +}
- --- /dev/null
- +++ b/src/ldso/dlerror.c
- @@ -0,0 +1,64 @@
- +#include <dlfcn.h>
- +#include <stdlib.h>
- +#include <stdarg.h>
- +#include "pthread_impl.h"
- +#include "libc.h"
- +
- +char *dlerror()
- +{
- + pthread_t self = __pthread_self();
- + if (!self->dlerror_flag) return 0;
- + self->dlerror_flag = 0;
- + char *s = self->dlerror_buf;
- + if (s == (void *)-1)
- + return "Dynamic linker failed to allocate memory for error message";
- + else
- + return s;
- +}
- +
- +void __dl_thread_cleanup(void)
- +{
- + pthread_t self = __pthread_self();
- + if (self->dlerror_buf != (void *)-1)
- + free(self->dlerror_buf);
- +}
- +
- +__attribute__((__visibility__("hidden")))
- +void __dl_vseterr(const char *fmt, va_list ap)
- +{
- + va_list ap2;
- + va_copy(ap2, ap);
- + pthread_t self = __pthread_self();
- + if (self->dlerror_buf != (void *)-1)
- + free(self->dlerror_buf);
- + size_t len = vsnprintf(0, 0, fmt, ap2);
- + va_end(ap2);
- + char *buf = malloc(len+1);
- + if (buf) {
- + vsnprintf(buf, len+1, fmt, ap);
- + } else {
- + buf = (void *)-1;
- + }
- + self->dlerror_buf = buf;
- + self->dlerror_flag = 1;
- +}
- +
- +__attribute__((__visibility__("hidden")))
- +void __dl_seterr(const char *fmt, ...)
- +{
- + va_list ap;
- + va_start(ap, fmt);
- + __dl_vseterr(fmt, ap);
- + va_end(ap);
- +}
- +
- +__attribute__((__visibility__("hidden")))
- +int __dl_invalid_handle(void *);
- +
- +static int stub_invalid_handle(void *h)
- +{
- + __dl_seterr("Invalid library handle %p", (void *)h);
- + return 1;
- +}
- +
- +weak_alias(stub_invalid_handle, __dl_invalid_handle);
- --- a/src/ldso/dlinfo.c
- +++ b/src/ldso/dlinfo.c
- @@ -1,9 +1,19 @@
- #define _GNU_SOURCE
- #include <dlfcn.h>
-
- -int __dlinfo(void *, int, void *);
- +__attribute__((__visibility__("hidden")))
- +int __dl_invalid_handle(void *);
- +
- +__attribute__((__visibility__("hidden")))
- +void __dl_seterr(const char *, ...);
-
- int dlinfo(void *dso, int req, void *res)
- {
- - return __dlinfo(dso, req, res);
- + if (__dl_invalid_handle(dso)) return -1;
- + if (req != RTLD_DI_LINKMAP) {
- + __dl_seterr("Unsupported request %d", req);
- + return -1;
- + }
- + *(struct link_map **)res = dso;
- + return 0;
- }
- --- /dev/null
- +++ b/src/ldso/dlopen.c
- @@ -0,0 +1,13 @@
- +#include <dlfcn.h>
- +#include "libc.h"
- +
- +__attribute__((__visibility__("hidden")))
- +void __dl_seterr(const char *, ...);
- +
- +static void *stub_dlopen(const char *file, int mode)
- +{
- + __dl_seterr("Dynamic loading not supported");
- + return 0;
- +}
- +
- +weak_alias(stub_dlopen, dlopen);
- --- a/src/ldso/dlstart.c
- +++ /dev/null
- @@ -1,150 +0,0 @@
- -#include <stddef.h>
- -#include "dynlink.h"
- -
- -#ifdef SHARED
- -
- -#ifndef START
- -#define START "_dlstart"
- -#endif
- -
- -#include "crt_arch.h"
- -
- -#ifndef GETFUNCSYM
- -#define GETFUNCSYM(fp, sym, got) do { \
- - __attribute__((__visibility__("hidden"))) void sym(); \
- - static void (*static_func_ptr)() = sym; \
- - __asm__ __volatile__ ( "" : "+m"(static_func_ptr) : : "memory"); \
- - *(fp) = static_func_ptr; } while(0)
- -#endif
- -
- -__attribute__((__visibility__("hidden")))
- -void _dlstart_c(size_t *sp, size_t *dynv)
- -{
- - size_t i, aux[AUX_CNT], dyn[DYN_CNT];
- - size_t *rel, rel_size, base;
- -
- - int argc = *sp;
- - char **argv = (void *)(sp+1);
- -
- - for (i=argc+1; argv[i]; i++);
- - size_t *auxv = (void *)(argv+i+1);
- -
- - for (i=0; i<AUX_CNT; i++) aux[i] = 0;
- - for (i=0; auxv[i]; i+=2) if (auxv[i]<AUX_CNT)
- - aux[auxv[i]] = auxv[i+1];
- -
- -#if DL_FDPIC
- - struct fdpic_loadseg *segs, fakeseg;
- - size_t j;
- - if (dynv) {
- - /* crt_arch.h entry point asm is responsible for reserving
- - * space and moving the extra fdpic arguments to the stack
- - * vector where they are easily accessible from C. */
- - segs = ((struct fdpic_loadmap *)(sp[-1] ? sp[-1] : sp[-2]))->segs;
- - } else {
- - /* If dynv is null, the entry point was started from loader
- - * that is not fdpic-aware. We can assume normal fixed-
- - * displacement ELF loading was performed, but when ldso was
- - * run as a command, finding the Ehdr is a heursitic: we
- - * have to assume Phdrs start in the first 4k of the file. */
- - base = aux[AT_BASE];
- - if (!base) base = aux[AT_PHDR] & -4096;
- - segs = &fakeseg;
- - segs[0].addr = base;
- - segs[0].p_vaddr = 0;
- - segs[0].p_memsz = -1;
- - Ehdr *eh = (void *)base;
- - Phdr *ph = (void *)(base + eh->e_phoff);
- - size_t phnum = eh->e_phnum;
- - size_t phent = eh->e_phentsize;
- - while (phnum-- && ph->p_type != PT_DYNAMIC)
- - ph = (void *)((size_t)ph + phent);
- - dynv = (void *)(base + ph->p_vaddr);
- - }
- -#endif
- -
- - for (i=0; i<DYN_CNT; i++) dyn[i] = 0;
- - for (i=0; dynv[i]; i+=2) if (dynv[i]<DYN_CNT)
- - dyn[dynv[i]] = dynv[i+1];
- -
- -#if DL_FDPIC
- - for (i=0; i<DYN_CNT; i++) {
- - if (i==DT_RELASZ || i==DT_RELSZ) continue;
- - if (!dyn[i]) continue;
- - for (j=0; dyn[i]-segs[j].p_vaddr >= segs[j].p_memsz; j++);
- - dyn[i] += segs[j].addr - segs[j].p_vaddr;
- - }
- - base = 0;
- -
- - const Sym *syms = (void *)dyn[DT_SYMTAB];
- -
- - rel = (void *)dyn[DT_RELA];
- - rel_size = dyn[DT_RELASZ];
- - for (; rel_size; rel+=3, rel_size-=3*sizeof(size_t)) {
- - if (!IS_RELATIVE(rel[1], syms)) continue;
- - for (j=0; rel[0]-segs[j].p_vaddr >= segs[j].p_memsz; j++);
- - size_t *rel_addr = (void *)
- - (rel[0] + segs[j].addr - segs[j].p_vaddr);
- - if (R_TYPE(rel[1]) == REL_FUNCDESC_VAL) {
- - *rel_addr += segs[rel_addr[1]].addr
- - - segs[rel_addr[1]].p_vaddr
- - + syms[R_SYM(rel[1])].st_value;
- - rel_addr[1] = dyn[DT_PLTGOT];
- - } else {
- - size_t val = syms[R_SYM(rel[1])].st_value;
- - for (j=0; val-segs[j].p_vaddr >= segs[j].p_memsz; j++);
- - *rel_addr = rel[2] + segs[j].addr - segs[j].p_vaddr + val;
- - }
- - }
- -#else
- - /* If the dynamic linker is invoked as a command, its load
- - * address is not available in the aux vector. Instead, compute
- - * the load address as the difference between &_DYNAMIC and the
- - * virtual address in the PT_DYNAMIC program header. */
- - base = aux[AT_BASE];
- - if (!base) {
- - size_t phnum = aux[AT_PHNUM];
- - size_t phentsize = aux[AT_PHENT];
- - Phdr *ph = (void *)aux[AT_PHDR];
- - for (i=phnum; i--; ph = (void *)((char *)ph + phentsize)) {
- - if (ph->p_type == PT_DYNAMIC) {
- - base = (size_t)dynv - ph->p_vaddr;
- - break;
- - }
- - }
- - }
- -
- - /* MIPS uses an ugly packed form for GOT relocations. Since we
- - * can't make function calls yet and the code is tiny anyway,
- - * it's simply inlined here. */
- - if (NEED_MIPS_GOT_RELOCS) {
- - size_t local_cnt = 0;
- - size_t *got = (void *)(base + dyn[DT_PLTGOT]);
- - for (i=0; dynv[i]; i+=2) if (dynv[i]==DT_MIPS_LOCAL_GOTNO)
- - local_cnt = dynv[i+1];
- - for (i=0; i<local_cnt; i++) got[i] += base;
- - }
- -
- - rel = (void *)(base+dyn[DT_REL]);
- - rel_size = dyn[DT_RELSZ];
- - for (; rel_size; rel+=2, rel_size-=2*sizeof(size_t)) {
- - if (!IS_RELATIVE(rel[1], 0)) continue;
- - size_t *rel_addr = (void *)(base + rel[0]);
- - *rel_addr += base;
- - }
- -
- - rel = (void *)(base+dyn[DT_RELA]);
- - rel_size = dyn[DT_RELASZ];
- - for (; rel_size; rel+=3, rel_size-=3*sizeof(size_t)) {
- - if (!IS_RELATIVE(rel[1], 0)) continue;
- - size_t *rel_addr = (void *)(base + rel[0]);
- - *rel_addr = base + rel[2];
- - }
- -#endif
- -
- - stage2_func dls2;
- - GETFUNCSYM(&dls2, __dls2, base+dyn[DT_PLTGOT]);
- - dls2((void *)base, sp);
- -}
- -
- -#endif
- --- a/src/ldso/dynlink.c
- +++ /dev/null
- @@ -1,2000 +0,0 @@
- -#define _GNU_SOURCE
- -#include <stdio.h>
- -#include <stdlib.h>
- -#include <stdarg.h>
- -#include <stddef.h>
- -#include <string.h>
- -#include <unistd.h>
- -#include <stdint.h>
- -#include <elf.h>
- -#include <sys/mman.h>
- -#include <limits.h>
- -#include <fcntl.h>
- -#include <sys/stat.h>
- -#include <errno.h>
- -#include <link.h>
- -#include <setjmp.h>
- -#include <pthread.h>
- -#include <ctype.h>
- -#include <dlfcn.h>
- -#include "pthread_impl.h"
- -#include "libc.h"
- -#include "dynlink.h"
- -
- -static void error(const char *, ...);
- -
- -#ifdef SHARED
- -
- -#define MAXP2(a,b) (-(-(a)&-(b)))
- -#define ALIGN(x,y) ((x)+(y)-1 & -(y))
- -
- -struct debug {
- - int ver;
- - void *head;
- - void (*bp)(void);
- - int state;
- - void *base;
- -};
- -
- -struct td_index {
- - size_t args[2];
- - struct td_index *next;
- -};
- -
- -struct dso {
- -#if DL_FDPIC
- - struct fdpic_loadmap *loadmap;
- -#else
- - unsigned char *base;
- -#endif
- - char *name;
- - size_t *dynv;
- - struct dso *next, *prev;
- -
- - Phdr *phdr;
- - int phnum;
- - size_t phentsize;
- - int refcnt;
- - Sym *syms;
- - uint32_t *hashtab;
- - uint32_t *ghashtab;
- - int16_t *versym;
- - char *strings;
- - unsigned char *map;
- - size_t map_len;
- - dev_t dev;
- - ino_t ino;
- - signed char global;
- - char relocated;
- - char constructed;
- - char kernel_mapped;
- - struct dso **deps, *needed_by;
- - char *rpath_orig, *rpath;
- - void *tls_image;
- - size_t tls_len, tls_size, tls_align, tls_id, tls_offset;
- - size_t relro_start, relro_end;
- - void **new_dtv;
- - unsigned char *new_tls;
- - volatile int new_dtv_idx, new_tls_idx;
- - struct td_index *td_index;
- - struct dso *fini_next;
- - char *shortname;
- -#if DL_FDPIC
- - unsigned char *base;
- -#else
- - struct fdpic_loadmap *loadmap;
- -#endif
- - struct funcdesc {
- - void *addr;
- - size_t *got;
- - } *funcdescs;
- - size_t *got;
- - char buf[];
- -};
- -
- -struct symdef {
- - Sym *sym;
- - struct dso *dso;
- -};
- -
- -int __init_tp(void *);
- -void __init_libc(char **, char *);
- -
- -const char *__libc_get_version(void);
- -
- -static struct builtin_tls {
- - char c;
- - struct pthread pt;
- - void *space[16];
- -} builtin_tls[1];
- -#define MIN_TLS_ALIGN offsetof(struct builtin_tls, pt)
- -
- -#define ADDEND_LIMIT 4096
- -static size_t *saved_addends, *apply_addends_to;
- -
- -static struct dso ldso;
- -static struct dso *head, *tail, *fini_head;
- -static char *env_path, *sys_path;
- -static unsigned long long gencnt;
- -static int runtime;
- -static int ldd_mode;
- -static int ldso_fail;
- -static int noload;
- -static jmp_buf *rtld_fail;
- -static pthread_rwlock_t lock;
- -static struct debug debug;
- -static size_t tls_cnt, tls_offset, tls_align = MIN_TLS_ALIGN;
- -static size_t static_tls_cnt;
- -static pthread_mutex_t init_fini_lock = { ._m_type = PTHREAD_MUTEX_RECURSIVE };
- -static struct fdpic_loadmap *app_loadmap;
- -static struct fdpic_dummy_loadmap app_dummy_loadmap;
- -
- -struct debug *_dl_debug_addr = &debug;
- -
- -static int dl_strcmp(const char *l, const char *r)
- -{
- - for (; *l==*r && *l; l++, r++);
- - return *(unsigned char *)l - *(unsigned char *)r;
- -}
- -#define strcmp(l,r) dl_strcmp(l,r)
- -
- -/* Compute load address for a virtual address in a given dso. */
- -#if DL_FDPIC
- -static void *laddr(const struct dso *p, size_t v)
- -{
- - size_t j=0;
- - if (!p->loadmap) return p->base + v;
- - for (j=0; v-p->loadmap->segs[j].p_vaddr >= p->loadmap->segs[j].p_memsz; j++);
- - return (void *)(v - p->loadmap->segs[j].p_vaddr + p->loadmap->segs[j].addr);
- -}
- -#define fpaddr(p, v) ((void (*)())&(struct funcdesc){ \
- - laddr(p, v), (p)->got })
- -#else
- -#define laddr(p, v) (void *)((p)->base + (v))
- -#define fpaddr(p, v) ((void (*)())laddr(p, v))
- -#endif
- -
- -static void decode_vec(size_t *v, size_t *a, size_t cnt)
- -{
- - size_t i;
- - for (i=0; i<cnt; i++) a[i] = 0;
- - for (; v[0]; v+=2) if (v[0]-1<cnt-1) {
- - a[0] |= 1UL<<v[0];
- - a[v[0]] = v[1];
- - }
- -}
- -
- -static int search_vec(size_t *v, size_t *r, size_t key)
- -{
- - for (; v[0]!=key; v+=2)
- - if (!v[0]) return 0;
- - *r = v[1];
- - return 1;
- -}
- -
- -static uint32_t sysv_hash(const char *s0)
- -{
- - const unsigned char *s = (void *)s0;
- - uint_fast32_t h = 0;
- - while (*s) {
- - h = 16*h + *s++;
- - h ^= h>>24 & 0xf0;
- - }
- - return h & 0xfffffff;
- -}
- -
- -static uint32_t gnu_hash(const char *s0)
- -{
- - const unsigned char *s = (void *)s0;
- - uint_fast32_t h = 5381;
- - for (; *s; s++)
- - h += h*32 + *s;
- - return h;
- -}
- -
- -static Sym *sysv_lookup(const char *s, uint32_t h, struct dso *dso)
- -{
- - size_t i;
- - Sym *syms = dso->syms;
- - uint32_t *hashtab = dso->hashtab;
- - char *strings = dso->strings;
- - for (i=hashtab[2+h%hashtab[0]]; i; i=hashtab[2+hashtab[0]+i]) {
- - if ((!dso->versym || dso->versym[i] >= 0)
- - && (!strcmp(s, strings+syms[i].st_name)))
- - return syms+i;
- - }
- - return 0;
- -}
- -
- -static Sym *gnu_lookup(uint32_t h1, uint32_t *hashtab, struct dso *dso, const char *s)
- -{
- - uint32_t nbuckets = hashtab[0];
- - uint32_t *buckets = hashtab + 4 + hashtab[2]*(sizeof(size_t)/4);
- - uint32_t i = buckets[h1 % nbuckets];
- -
- - if (!i) return 0;
- -
- - uint32_t *hashval = buckets + nbuckets + (i - hashtab[1]);
- -
- - for (h1 |= 1; ; i++) {
- - uint32_t h2 = *hashval++;
- - if ((h1 == (h2|1)) && (!dso->versym || dso->versym[i] >= 0)
- - && !strcmp(s, dso->strings + dso->syms[i].st_name))
- - return dso->syms+i;
- - if (h2 & 1) break;
- - }
- -
- - return 0;
- -}
- -
- -static Sym *gnu_lookup_filtered(uint32_t h1, uint32_t *hashtab, struct dso *dso, const char *s, uint32_t fofs, size_t fmask)
- -{
- - const size_t *bloomwords = (const void *)(hashtab+4);
- - size_t f = bloomwords[fofs & (hashtab[2]-1)];
- - if (!(f & fmask)) return 0;
- -
- - f >>= (h1 >> hashtab[3]) % (8 * sizeof f);
- - if (!(f & 1)) return 0;
- -
- - return gnu_lookup(h1, hashtab, dso, s);
- -}
- -
- -#define OK_TYPES (1<<STT_NOTYPE | 1<<STT_OBJECT | 1<<STT_FUNC | 1<<STT_COMMON | 1<<STT_TLS)
- -#define OK_BINDS (1<<STB_GLOBAL | 1<<STB_WEAK | 1<<STB_GNU_UNIQUE)
- -
- -#ifndef ARCH_SYM_REJECT_UND
- -#define ARCH_SYM_REJECT_UND(s) 0
- -#endif
- -
- -static struct symdef find_sym(struct dso *dso, const char *s, int need_def)
- -{
- - uint32_t h = 0, gh, gho, *ght;
- - size_t ghm = 0;
- - struct symdef def = {0};
- - for (; dso; dso=dso->next) {
- - Sym *sym;
- - if (!dso->global) continue;
- - if ((ght = dso->ghashtab)) {
- - if (!ghm) {
- - gh = gnu_hash(s);
- - int maskbits = 8 * sizeof ghm;
- - gho = gh / maskbits;
- - ghm = 1ul << gh % maskbits;
- - }
- - sym = gnu_lookup_filtered(gh, ght, dso, s, gho, ghm);
- - } else {
- - if (!h) h = sysv_hash(s);
- - sym = sysv_lookup(s, h, dso);
- - }
- - if (!sym) continue;
- - if (!sym->st_shndx)
- - if (need_def || (sym->st_info&0xf) == STT_TLS
- - || ARCH_SYM_REJECT_UND(sym))
- - continue;
- - if (!sym->st_value)
- - if ((sym->st_info&0xf) != STT_TLS)
- - continue;
- - if (!(1<<(sym->st_info&0xf) & OK_TYPES)) continue;
- - if (!(1<<(sym->st_info>>4) & OK_BINDS)) continue;
- -
- - if (def.sym && sym->st_info>>4 == STB_WEAK) continue;
- - def.sym = sym;
- - def.dso = dso;
- - if (sym->st_info>>4 == STB_GLOBAL) break;
- - }
- - return def;
- -}
- -
- -__attribute__((__visibility__("hidden")))
- -ptrdiff_t __tlsdesc_static(), __tlsdesc_dynamic();
- -
- -static void do_relocs(struct dso *dso, size_t *rel, size_t rel_size, size_t stride)
- -{
- - unsigned char *base = dso->base;
- - Sym *syms = dso->syms;
- - char *strings = dso->strings;
- - Sym *sym;
- - const char *name;
- - void *ctx;
- - int type;
- - int sym_index;
- - struct symdef def;
- - size_t *reloc_addr;
- - size_t sym_val;
- - size_t tls_val;
- - size_t addend;
- - int skip_relative = 0, reuse_addends = 0, save_slot = 0;
- -
- - if (dso == &ldso) {
- - /* Only ldso's REL table needs addend saving/reuse. */
- - if (rel == apply_addends_to)
- - reuse_addends = 1;
- - skip_relative = 1;
- - }
- -
- - for (; rel_size; rel+=stride, rel_size-=stride*sizeof(size_t)) {
- - if (skip_relative && IS_RELATIVE(rel[1], dso->syms)) continue;
- - type = R_TYPE(rel[1]);
- - if (type == REL_NONE) continue;
- - sym_index = R_SYM(rel[1]);
- - reloc_addr = laddr(dso, rel[0]);
- - if (sym_index) {
- - sym = syms + sym_index;
- - name = strings + sym->st_name;
- - ctx = type==REL_COPY ? head->next : head;
- - def = (sym->st_info&0xf) == STT_SECTION
- - ? (struct symdef){ .dso = dso, .sym = sym }
- - : find_sym(ctx, name, type==REL_PLT);
- - if (!def.sym && (sym->st_shndx != SHN_UNDEF
- - || sym->st_info>>4 != STB_WEAK)) {
- - error("Error relocating %s: %s: symbol not found",
- - dso->name, name);
- - if (runtime) longjmp(*rtld_fail, 1);
- - continue;
- - }
- - } else {
- - sym = 0;
- - def.sym = 0;
- - def.dso = dso;
- - }
- -
- - if (stride > 2) {
- - addend = rel[2];
- - } else if (type==REL_GOT || type==REL_PLT|| type==REL_COPY) {
- - addend = 0;
- - } else if (reuse_addends) {
- - /* Save original addend in stage 2 where the dso
- - * chain consists of just ldso; otherwise read back
- - * saved addend since the inline one was clobbered. */
- - if (head==&ldso)
- - saved_addends[save_slot] = *reloc_addr;
- - addend = saved_addends[save_slot++];
- - } else {
- - addend = *reloc_addr;
- - }
- -
- - sym_val = def.sym ? (size_t)laddr(def.dso, def.sym->st_value) : 0;
- - tls_val = def.sym ? def.sym->st_value : 0;
- -
- - switch(type) {
- - case REL_NONE:
- - break;
- - case REL_OFFSET:
- - addend -= (size_t)reloc_addr;
- - case REL_SYMBOLIC:
- - case REL_GOT:
- - case REL_PLT:
- - *reloc_addr = sym_val + addend;
- - break;
- - case REL_RELATIVE:
- - *reloc_addr = (size_t)base + addend;
- - break;
- - case REL_SYM_OR_REL:
- - if (sym) *reloc_addr = sym_val + addend;
- - else *reloc_addr = (size_t)base + addend;
- - break;
- - case REL_COPY:
- - memcpy(reloc_addr, (void *)sym_val, sym->st_size);
- - break;
- - case REL_OFFSET32:
- - *(uint32_t *)reloc_addr = sym_val + addend
- - - (size_t)reloc_addr;
- - break;
- - case REL_FUNCDESC:
- - *reloc_addr = def.sym ? (size_t)(def.dso->funcdescs
- - + (def.sym - def.dso->syms)) : 0;
- - break;
- - case REL_FUNCDESC_VAL:
- - if ((sym->st_info&0xf) == STT_SECTION) *reloc_addr += sym_val;
- - else *reloc_addr = sym_val;
- - reloc_addr[1] = def.sym ? (size_t)def.dso->got : 0;
- - break;
- - case REL_DTPMOD:
- - *reloc_addr = def.dso->tls_id;
- - break;
- - case REL_DTPOFF:
- - *reloc_addr = tls_val + addend - DTP_OFFSET;
- - break;
- -#ifdef TLS_ABOVE_TP
- - case REL_TPOFF:
- - *reloc_addr = tls_val + def.dso->tls_offset + TPOFF_K + addend;
- - break;
- -#else
- - case REL_TPOFF:
- - *reloc_addr = tls_val - def.dso->tls_offset + addend;
- - break;
- - case REL_TPOFF_NEG:
- - *reloc_addr = def.dso->tls_offset - tls_val + addend;
- - break;
- -#endif
- - case REL_TLSDESC:
- - if (stride<3) addend = reloc_addr[1];
- - if (runtime && def.dso->tls_id >= static_tls_cnt) {
- - struct td_index *new = malloc(sizeof *new);
- - if (!new) {
- - error(
- - "Error relocating %s: cannot allocate TLSDESC for %s",
- - dso->name, sym ? name : "(local)" );
- - longjmp(*rtld_fail, 1);
- - }
- - new->next = dso->td_index;
- - dso->td_index = new;
- - new->args[0] = def.dso->tls_id;
- - new->args[1] = tls_val + addend;
- - reloc_addr[0] = (size_t)__tlsdesc_dynamic;
- - reloc_addr[1] = (size_t)new;
- - } else {
- - reloc_addr[0] = (size_t)__tlsdesc_static;
- -#ifdef TLS_ABOVE_TP
- - reloc_addr[1] = tls_val + def.dso->tls_offset
- - + TPOFF_K + addend;
- -#else
- - reloc_addr[1] = tls_val - def.dso->tls_offset
- - + addend;
- -#endif
- - }
- - break;
- - default:
- - error("Error relocating %s: unsupported relocation type %d",
- - dso->name, type);
- - if (runtime) longjmp(*rtld_fail, 1);
- - continue;
- - }
- - }
- -}
- -
- -/* A huge hack: to make up for the wastefulness of shared libraries
- - * needing at least a page of dirty memory even if they have no global
- - * data, we reclaim the gaps at the beginning and end of writable maps
- - * and "donate" them to the heap by setting up minimal malloc
- - * structures and then freeing them. */
- -
- -static void reclaim(struct dso *dso, size_t start, size_t end)
- -{
- - size_t *a, *z;
- - if (start >= dso->relro_start && start < dso->relro_end) start = dso->relro_end;
- - if (end >= dso->relro_start && end < dso->relro_end) end = dso->relro_start;
- - start = start + 6*sizeof(size_t)-1 & -4*sizeof(size_t);
- - end = (end & -4*sizeof(size_t)) - 2*sizeof(size_t);
- - if (start>end || end-start < 4*sizeof(size_t)) return;
- - a = laddr(dso, start);
- - z = laddr(dso, end);
- - a[-2] = 1;
- - a[-1] = z[0] = end-start + 2*sizeof(size_t) | 1;
- - z[1] = 1;
- - free(a);
- -}
- -
- -static void reclaim_gaps(struct dso *dso)
- -{
- - Phdr *ph = dso->phdr;
- - size_t phcnt = dso->phnum;
- -
- - if (DL_FDPIC) return; // FIXME
- - for (; phcnt--; ph=(void *)((char *)ph+dso->phentsize)) {
- - if (ph->p_type!=PT_LOAD) continue;
- - if ((ph->p_flags&(PF_R|PF_W))!=(PF_R|PF_W)) continue;
- - reclaim(dso, ph->p_vaddr & -PAGE_SIZE, ph->p_vaddr);
- - reclaim(dso, ph->p_vaddr+ph->p_memsz,
- - ph->p_vaddr+ph->p_memsz+PAGE_SIZE-1 & -PAGE_SIZE);
- - }
- -}
- -
- -static void *mmap_fixed(void *p, size_t n, int prot, int flags, int fd, off_t off)
- -{
- - char *q = mmap(p, n, prot, flags, fd, off);
- - if (q != MAP_FAILED || errno != EINVAL) return q;
- - /* Fallbacks for MAP_FIXED failure on NOMMU kernels. */
- - if (flags & MAP_ANONYMOUS) {
- - memset(p, 0, n);
- - return p;
- - }
- - ssize_t r;
- - if (lseek(fd, off, SEEK_SET) < 0) return MAP_FAILED;
- - for (q=p; n; q+=r, off+=r, n-=r) {
- - r = read(fd, q, n);
- - if (r < 0 && errno != EINTR) return MAP_FAILED;
- - if (!r) {
- - memset(q, 0, n);
- - break;
- - }
- - }
- - return p;
- -}
- -
- -static void unmap_library(struct dso *dso)
- -{
- - if (dso->loadmap) {
- - size_t i;
- - for (i=0; i<dso->loadmap->nsegs; i++) {
- - if (!dso->loadmap->segs[i].p_memsz)
- - continue;
- - munmap((void *)dso->loadmap->segs[i].addr,
- - dso->loadmap->segs[i].p_memsz);
- - }
- - free(dso->loadmap);
- - } else if (dso->map && dso->map_len) {
- - munmap(dso->map, dso->map_len);
- - }
- -}
- -
- -static void *map_library(int fd, struct dso *dso)
- -{
- - Ehdr buf[(896+sizeof(Ehdr))/sizeof(Ehdr)];
- - void *allocated_buf=0;
- - size_t phsize;
- - size_t addr_min=SIZE_MAX, addr_max=0, map_len;
- - size_t this_min, this_max;
- - size_t nsegs = 0;
- - off_t off_start;
- - Ehdr *eh;
- - Phdr *ph, *ph0;
- - unsigned prot;
- - unsigned char *map=MAP_FAILED, *base;
- - size_t dyn=0;
- - size_t tls_image=0;
- - size_t i;
- -
- - ssize_t l = read(fd, buf, sizeof buf);
- - eh = buf;
- - if (l<0) return 0;
- - if (l<sizeof *eh || (eh->e_type != ET_DYN && eh->e_type != ET_EXEC))
- - goto noexec;
- - phsize = eh->e_phentsize * eh->e_phnum;
- - if (phsize > sizeof buf - sizeof *eh) {
- - allocated_buf = malloc(phsize);
- - if (!allocated_buf) return 0;
- - l = pread(fd, allocated_buf, phsize, eh->e_phoff);
- - if (l < 0) goto error;
- - if (l != phsize) goto noexec;
- - ph = ph0 = allocated_buf;
- - } else if (eh->e_phoff + phsize > l) {
- - l = pread(fd, buf+1, phsize, eh->e_phoff);
- - if (l < 0) goto error;
- - if (l != phsize) goto noexec;
- - ph = ph0 = (void *)(buf + 1);
- - } else {
- - ph = ph0 = (void *)((char *)buf + eh->e_phoff);
- - }
- - for (i=eh->e_phnum; i; i--, ph=(void *)((char *)ph+eh->e_phentsize)) {
- - if (ph->p_type == PT_DYNAMIC) {
- - dyn = ph->p_vaddr;
- - } else if (ph->p_type == PT_TLS) {
- - tls_image = ph->p_vaddr;
- - dso->tls_align = ph->p_align;
- - dso->tls_len = ph->p_filesz;
- - dso->tls_size = ph->p_memsz;
- - } else if (ph->p_type == PT_GNU_RELRO) {
- - dso->relro_start = ph->p_vaddr & -PAGE_SIZE;
- - dso->relro_end = (ph->p_vaddr + ph->p_memsz) & -PAGE_SIZE;
- - }
- - if (ph->p_type != PT_LOAD) continue;
- - nsegs++;
- - if (ph->p_vaddr < addr_min) {
- - addr_min = ph->p_vaddr;
- - off_start = ph->p_offset;
- - prot = (((ph->p_flags&PF_R) ? PROT_READ : 0) |
- - ((ph->p_flags&PF_W) ? PROT_WRITE: 0) |
- - ((ph->p_flags&PF_X) ? PROT_EXEC : 0));
- - }
- - if (ph->p_vaddr+ph->p_memsz > addr_max) {
- - addr_max = ph->p_vaddr+ph->p_memsz;
- - }
- - }
- - if (!dyn) goto noexec;
- - if (DL_FDPIC && !(eh->e_flags & FDPIC_CONSTDISP_FLAG)) {
- - dso->loadmap = calloc(1, sizeof *dso->loadmap
- - + nsegs * sizeof *dso->loadmap->segs);
- - if (!dso->loadmap) goto error;
- - dso->loadmap->nsegs = nsegs;
- - for (ph=ph0, i=0; i<nsegs; ph=(void *)((char *)ph+eh->e_phentsize)) {
- - if (ph->p_type != PT_LOAD) continue;
- - prot = (((ph->p_flags&PF_R) ? PROT_READ : 0) |
- - ((ph->p_flags&PF_W) ? PROT_WRITE: 0) |
- - ((ph->p_flags&PF_X) ? PROT_EXEC : 0));
- - map = mmap(0, ph->p_memsz + (ph->p_vaddr & PAGE_SIZE-1),
- - prot, (prot&PROT_WRITE) ? MAP_PRIVATE : MAP_SHARED,
- - fd, ph->p_offset & -PAGE_SIZE);
- - if (map == MAP_FAILED) {
- - unmap_library(dso);
- - goto error;
- - }
- - dso->loadmap->segs[i].addr = (size_t)map +
- - (ph->p_vaddr & PAGE_SIZE-1);
- - dso->loadmap->segs[i].p_vaddr = ph->p_vaddr;
- - dso->loadmap->segs[i].p_memsz = ph->p_memsz;
- - i++;
- - }
- - map = (void *)dso->loadmap->segs[0].addr;
- - map_len = 0;
- - goto done_mapping;
- - }
- - addr_max += PAGE_SIZE-1;
- - addr_max &= -PAGE_SIZE;
- - addr_min &= -PAGE_SIZE;
- - off_start &= -PAGE_SIZE;
- - map_len = addr_max - addr_min + off_start;
- - /* The first time, we map too much, possibly even more than
- - * the length of the file. This is okay because we will not
- - * use the invalid part; we just need to reserve the right
- - * amount of virtual address space to map over later. */
- - map = mmap((void *)addr_min, map_len, prot, MAP_PRIVATE, fd, off_start);
- - if (map==MAP_FAILED) goto error;
- - dso->map = map;
- - dso->map_len = map_len;
- - /* If the loaded file is not relocatable and the requested address is
- - * not available, then the load operation must fail. */
- - if (eh->e_type != ET_DYN && addr_min && map!=(void *)addr_min) {
- - errno = EBUSY;
- - goto error;
- - }
- - base = map - addr_min;
- - dso->phdr = 0;
- - dso->phnum = 0;
- - for (ph=ph0, i=eh->e_phnum; i; i--, ph=(void *)((char *)ph+eh->e_phentsize)) {
- - if (ph->p_type != PT_LOAD) continue;
- - /* Check if the programs headers are in this load segment, and
- - * if so, record the address for use by dl_iterate_phdr. */
- - if (!dso->phdr && eh->e_phoff >= ph->p_offset
- - && eh->e_phoff+phsize <= ph->p_offset+ph->p_filesz) {
- - dso->phdr = (void *)(base + ph->p_vaddr
- - + (eh->e_phoff-ph->p_offset));
- - dso->phnum = eh->e_phnum;
- - dso->phentsize = eh->e_phentsize;
- - }
- - /* Reuse the existing mapping for the lowest-address LOAD */
- - if ((ph->p_vaddr & -PAGE_SIZE) == addr_min) continue;
- - this_min = ph->p_vaddr & -PAGE_SIZE;
- - this_max = ph->p_vaddr+ph->p_memsz+PAGE_SIZE-1 & -PAGE_SIZE;
- - off_start = ph->p_offset & -PAGE_SIZE;
- - prot = (((ph->p_flags&PF_R) ? PROT_READ : 0) |
- - ((ph->p_flags&PF_W) ? PROT_WRITE: 0) |
- - ((ph->p_flags&PF_X) ? PROT_EXEC : 0));
- - if (mmap_fixed(base+this_min, this_max-this_min, prot, MAP_PRIVATE|MAP_FIXED, fd, off_start) == MAP_FAILED)
- - goto error;
- - if (ph->p_memsz > ph->p_filesz) {
- - size_t brk = (size_t)base+ph->p_vaddr+ph->p_filesz;
- - size_t pgbrk = brk+PAGE_SIZE-1 & -PAGE_SIZE;
- - memset((void *)brk, 0, pgbrk-brk & PAGE_SIZE-1);
- - if (pgbrk-(size_t)base < this_max && mmap_fixed((void *)pgbrk, (size_t)base+this_max-pgbrk, prot, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) == MAP_FAILED)
- - goto error;
- - }
- - }
- - for (i=0; ((size_t *)(base+dyn))[i]; i+=2)
- - if (((size_t *)(base+dyn))[i]==DT_TEXTREL) {
- - if (mprotect(map, map_len, PROT_READ|PROT_WRITE|PROT_EXEC)
- - && errno != ENOSYS)
- - goto error;
- - break;
- - }
- -done_mapping:
- - dso->base = base;
- - dso->dynv = laddr(dso, dyn);
- - if (dso->tls_size) dso->tls_image = laddr(dso, tls_image);
- - if (!runtime) reclaim_gaps(dso);
- - free(allocated_buf);
- - return map;
- -noexec:
- - errno = ENOEXEC;
- -error:
- - if (map!=MAP_FAILED) unmap_library(dso);
- - free(allocated_buf);
- - return 0;
- -}
- -
- -static int path_open(const char *name, const char *s, char *buf, size_t buf_size)
- -{
- - size_t l;
- - int fd;
- - for (;;) {
- - s += strspn(s, ":\n");
- - l = strcspn(s, ":\n");
- - if (l-1 >= INT_MAX) return -1;
- - if (snprintf(buf, buf_size, "%.*s/%s", (int)l, s, name) < buf_size) {
- - if ((fd = open(buf, O_RDONLY|O_CLOEXEC))>=0) return fd;
- - switch (errno) {
- - case ENOENT:
- - case ENOTDIR:
- - case EACCES:
- - case ENAMETOOLONG:
- - break;
- - default:
- - /* Any negative value but -1 will inhibit
- - * futher path search. */
- - return -2;
- - }
- - }
- - s += l;
- - }
- -}
- -
- -static int fixup_rpath(struct dso *p, char *buf, size_t buf_size)
- -{
- - size_t n, l;
- - const char *s, *t, *origin;
- - char *d;
- - if (p->rpath || !p->rpath_orig) return 0;
- - if (!strchr(p->rpath_orig, '$')) {
- - p->rpath = p->rpath_orig;
- - return 0;
- - }
- - n = 0;
- - s = p->rpath_orig;
- - while ((t=strchr(s, '$'))) {
- - if (strncmp(t, "$ORIGIN", 7) && strncmp(t, "${ORIGIN}", 9))
- - return 0;
- - s = t+1;
- - n++;
- - }
- - if (n > SSIZE_MAX/PATH_MAX) return 0;
- -
- - if (p->kernel_mapped) {
- - /* $ORIGIN searches cannot be performed for the main program
- - * when it is suid/sgid/AT_SECURE. This is because the
- - * pathname is under the control of the caller of execve.
- - * For libraries, however, $ORIGIN can be processed safely
- - * since the library's pathname came from a trusted source
- - * (either system paths or a call to dlopen). */
- - if (libc.secure)
- - return 0;
- - l = readlink("/proc/self/exe", buf, buf_size);
- - if (l == -1) switch (errno) {
- - case ENOENT:
- - case ENOTDIR:
- - case EACCES:
- - break;
- - default:
- - return -1;
- - }
- - if (l >= buf_size)
- - return 0;
- - buf[l] = 0;
- - origin = buf;
- - } else {
- - origin = p->name;
- - }
- - t = strrchr(origin, '/');
- - l = t ? t-origin : 0;
- - p->rpath = malloc(strlen(p->rpath_orig) + n*l + 1);
- - if (!p->rpath) return -1;
- -
- - d = p->rpath;
- - s = p->rpath_orig;
- - while ((t=strchr(s, '$'))) {
- - memcpy(d, s, t-s);
- - d += t-s;
- - memcpy(d, origin, l);
- - d += l;
- - /* It was determined previously that the '$' is followed
- - * either by "ORIGIN" or "{ORIGIN}". */
- - s = t + 7 + 2*(t[1]=='{');
- - }
- - strcpy(d, s);
- - return 0;
- -}
- -
- -static void decode_dyn(struct dso *p)
- -{
- - size_t dyn[DYN_CNT];
- - decode_vec(p->dynv, dyn, DYN_CNT);
- - p->syms = laddr(p, dyn[DT_SYMTAB]);
- - p->strings = laddr(p, dyn[DT_STRTAB]);
- - if (dyn[0]&(1<<DT_HASH))
- - p->hashtab = laddr(p, dyn[DT_HASH]);
- - if (dyn[0]&(1<<DT_RPATH))
- - p->rpath_orig = p->strings + dyn[DT_RPATH];
- - if (dyn[0]&(1<<DT_RUNPATH))
- - p->rpath_orig = p->strings + dyn[DT_RUNPATH];
- - if (dyn[0]&(1<<DT_PLTGOT))
- - p->got = laddr(p, dyn[DT_PLTGOT]);
- - if (search_vec(p->dynv, dyn, DT_GNU_HASH))
- - p->ghashtab = laddr(p, *dyn);
- - if (search_vec(p->dynv, dyn, DT_VERSYM))
- - p->versym = laddr(p, *dyn);
- -}
- -
- -static size_t count_syms(struct dso *p)
- -{
- - if (p->hashtab) return p->hashtab[1];
- -
- - size_t nsym, i;
- - uint32_t *buckets = p->ghashtab + 4 + (p->ghashtab[2]*sizeof(size_t)/4);
- - uint32_t *hashval;
- - for (i = nsym = 0; i < p->ghashtab[0]; i++) {
- - if (buckets[i] > nsym)
- - nsym = buckets[i];
- - }
- - if (nsym) {
- - hashval = buckets + p->ghashtab[0] + (nsym - p->ghashtab[1]);
- - do nsym++;
- - while (!(*hashval++ & 1));
- - }
- - return nsym;
- -}
- -
- -static void *dl_mmap(size_t n)
- -{
- - void *p;
- - int prot = PROT_READ|PROT_WRITE, flags = MAP_ANONYMOUS|MAP_PRIVATE;
- -#ifdef SYS_mmap2
- - p = (void *)__syscall(SYS_mmap2, 0, n, prot, flags, -1, 0);
- -#else
- - p = (void *)__syscall(SYS_mmap, 0, n, prot, flags, -1, 0);
- -#endif
- - return p == MAP_FAILED ? 0 : p;
- -}
- -
- -static void makefuncdescs(struct dso *p)
- -{
- - static int self_done;
- - size_t nsym = count_syms(p);
- - size_t i, size = nsym * sizeof(*p->funcdescs);
- -
- - if (!self_done) {
- - p->funcdescs = dl_mmap(size);
- - self_done = 1;
- - } else {
- - p->funcdescs = malloc(size);
- - }
- - if (!p->funcdescs) {
- - if (!runtime) a_crash();
- - error("Error allocating function descriptors for %s", p->name);
- - longjmp(*rtld_fail, 1);
- - }
- - for (i=0; i<nsym; i++) {
- - if ((p->syms[i].st_info&0xf)==STT_FUNC && p->syms[i].st_shndx) {
- - p->funcdescs[i].addr = laddr(p, p->syms[i].st_value);
- - p->funcdescs[i].got = p->got;
- - } else {
- - p->funcdescs[i].addr = 0;
- - p->funcdescs[i].got = 0;
- - }
- - }
- -}
- -
- -static struct dso *load_library(const char *name, struct dso *needed_by)
- -{
- - char buf[2*NAME_MAX+2];
- - const char *pathname;
- - unsigned char *map;
- - struct dso *p, temp_dso = {0};
- - int fd;
- - struct stat st;
- - size_t alloc_size;
- - int n_th = 0;
- - int is_self = 0;
- -
- - if (!*name) {
- - errno = EINVAL;
- - return 0;
- - }
- -
- - /* Catch and block attempts to reload the implementation itself */
- - if (name[0]=='l' && name[1]=='i' && name[2]=='b') {
- - static const char *rp, reserved[] =
- - "c\0pthread\0rt\0m\0dl\0util\0xnet\0";
- - char *z = strchr(name, '.');
- - if (z) {
- - size_t l = z-name;
- - for (rp=reserved; *rp && strncmp(name+3, rp, l-3); rp+=strlen(rp)+1);
- - if (*rp) {
- - if (ldd_mode) {
- - /* Track which names have been resolved
- - * and only report each one once. */
- - static unsigned reported;
- - unsigned mask = 1U<<(rp-reserved);
- - if (!(reported & mask)) {
- - reported |= mask;
- - dprintf(1, "\t%s => %s (%p)\n",
- - name, ldso.name,
- - ldso.base);
- - }
- - }
- - is_self = 1;
- - }
- - }
- - }
- - if (!strcmp(name, ldso.name)) is_self = 1;
- - if (is_self) {
- - if (!ldso.prev) {
- - tail->next = &ldso;
- - ldso.prev = tail;
- - tail = ldso.next ? ldso.next : &ldso;
- - }
- - return &ldso;
- - }
- - if (strchr(name, '/')) {
- - pathname = name;
- - fd = open(name, O_RDONLY|O_CLOEXEC);
- - } else {
- - /* Search for the name to see if it's already loaded */
- - for (p=head->next; p; p=p->next) {
- - if (p->shortname && !strcmp(p->shortname, name)) {
- - p->refcnt++;
- - return p;
- - }
- - }
- - if (strlen(name) > NAME_MAX) return 0;
- - fd = -1;
- - if (env_path) fd = path_open(name, env_path, buf, sizeof buf);
- - for (p=needed_by; fd == -1 && p; p=p->needed_by) {
- - if (fixup_rpath(p, buf, sizeof buf) < 0)
- - fd = -2; /* Inhibit further search. */
- - if (p->rpath)
- - fd = path_open(name, p->rpath, buf, sizeof buf);
- - }
- - if (fd == -1) {
- - if (!sys_path) {
- - char *prefix = 0;
- - size_t prefix_len;
- - if (ldso.name[0]=='/') {
- - char *s, *t, *z;
- - for (s=t=z=ldso.name; *s; s++)
- - if (*s=='/') z=t, t=s;
- - prefix_len = z-ldso.name;
- - if (prefix_len < PATH_MAX)
- - prefix = ldso.name;
- - }
- - if (!prefix) {
- - prefix = "";
- - prefix_len = 0;
- - }
- - char etc_ldso_path[prefix_len + 1
- - + sizeof "/etc/ld-musl-" LDSO_ARCH ".path"];
- - snprintf(etc_ldso_path, sizeof etc_ldso_path,
- - "%.*s/etc/ld-musl-" LDSO_ARCH ".path",
- - (int)prefix_len, prefix);
- - FILE *f = fopen(etc_ldso_path, "rbe");
- - if (f) {
- - if (getdelim(&sys_path, (size_t[1]){0}, 0, f) <= 0) {
- - free(sys_path);
- - sys_path = "";
- - }
- - fclose(f);
- - } else if (errno != ENOENT) {
- - sys_path = "";
- - }
- - }
- - if (!sys_path) sys_path = "/lib:/usr/local/lib:/usr/lib";
- - fd = path_open(name, sys_path, buf, sizeof buf);
- - }
- - pathname = buf;
- - }
- - if (fd < 0) return 0;
- - if (fstat(fd, &st) < 0) {
- - close(fd);
- - return 0;
- - }
- - for (p=head->next; p; p=p->next) {
- - if (p->dev == st.st_dev && p->ino == st.st_ino) {
- - /* If this library was previously loaded with a
- - * pathname but a search found the same inode,
- - * setup its shortname so it can be found by name. */
- - if (!p->shortname && pathname != name)
- - p->shortname = strrchr(p->name, '/')+1;
- - close(fd);
- - p->refcnt++;
- - return p;
- - }
- - }
- - map = noload ? 0 : map_library(fd, &temp_dso);
- - close(fd);
- - if (!map) return 0;
- -
- - /* Allocate storage for the new DSO. When there is TLS, this
- - * storage must include a reservation for all pre-existing
- - * threads to obtain copies of both the new TLS, and an
- - * extended DTV capable of storing an additional slot for
- - * the newly-loaded DSO. */
- - alloc_size = sizeof *p + strlen(pathname) + 1;
- - if (runtime && temp_dso.tls_image) {
- - size_t per_th = temp_dso.tls_size + temp_dso.tls_align
- - + sizeof(void *) * (tls_cnt+3);
- - n_th = libc.threads_minus_1 + 1;
- - if (n_th > SSIZE_MAX / per_th) alloc_size = SIZE_MAX;
- - else alloc_size += n_th * per_th;
- - }
- - p = calloc(1, alloc_size);
- - if (!p) {
- - unmap_library(&temp_dso);
- - return 0;
- - }
- - memcpy(p, &temp_dso, sizeof temp_dso);
- - decode_dyn(p);
- - p->dev = st.st_dev;
- - p->ino = st.st_ino;
- - p->refcnt = 1;
- - p->needed_by = needed_by;
- - p->name = p->buf;
- - strcpy(p->name, pathname);
- - /* Add a shortname only if name arg was not an explicit pathname. */
- - if (pathname != name) p->shortname = strrchr(p->name, '/')+1;
- - if (p->tls_image) {
- - p->tls_id = ++tls_cnt;
- - tls_align = MAXP2(tls_align, p->tls_align);
- -#ifdef TLS_ABOVE_TP
- - p->tls_offset = tls_offset + ( (tls_align-1) &
- - -(tls_offset + (uintptr_t)p->tls_image) );
- - tls_offset += p->tls_size;
- -#else
- - tls_offset += p->tls_size + p->tls_align - 1;
- - tls_offset -= (tls_offset + (uintptr_t)p->tls_image)
- - & (p->tls_align-1);
- - p->tls_offset = tls_offset;
- -#endif
- - p->new_dtv = (void *)(-sizeof(size_t) &
- - (uintptr_t)(p->name+strlen(p->name)+sizeof(size_t)));
- - p->new_tls = (void *)(p->new_dtv + n_th*(tls_cnt+1));
- - }
- -
- - tail->next = p;
- - p->prev = tail;
- - tail = p;
- -
- - if (DL_FDPIC) makefuncdescs(p);
- -
- - if (ldd_mode) dprintf(1, "\t%s => %s (%p)\n", name, pathname, p->base);
- -
- - return p;
- -}
- -
- -static void load_deps(struct dso *p)
- -{
- - size_t i, ndeps=0;
- - struct dso ***deps = &p->deps, **tmp, *dep;
- - for (; p; p=p->next) {
- - for (i=0; p->dynv[i]; i+=2) {
- - if (p->dynv[i] != DT_NEEDED) continue;
- - dep = load_library(p->strings + p->dynv[i+1], p);
- - if (!dep) {
- - error("Error loading shared library %s: %m (needed by %s)",
- - p->strings + p->dynv[i+1], p->name);
- - if (runtime) longjmp(*rtld_fail, 1);
- - continue;
- - }
- - if (runtime) {
- - tmp = realloc(*deps, sizeof(*tmp)*(ndeps+2));
- - if (!tmp) longjmp(*rtld_fail, 1);
- - tmp[ndeps++] = dep;
- - tmp[ndeps] = 0;
- - *deps = tmp;
- - }
- - }
- - }
- -}
- -
- -static void load_preload(char *s)
- -{
- - int tmp;
- - char *z;
- - for (z=s; *z; s=z) {
- - for ( ; *s && (isspace(*s) || *s==':'); s++);
- - for (z=s; *z && !isspace(*z) && *z!=':'; z++);
- - tmp = *z;
- - *z = 0;
- - load_library(s, 0);
- - *z = tmp;
- - }
- -}
- -
- -static void make_global(struct dso *p)
- -{
- - for (; p; p=p->next) p->global = 1;
- -}
- -
- -static void do_mips_relocs(struct dso *p, size_t *got)
- -{
- - size_t i, j, rel[2];
- - unsigned char *base = p->base;
- - i=0; search_vec(p->dynv, &i, DT_MIPS_LOCAL_GOTNO);
- - if (p==&ldso) {
- - got += i;
- - } else {
- - while (i--) *got++ += (size_t)base;
- - }
- - j=0; search_vec(p->dynv, &j, DT_MIPS_GOTSYM);
- - i=0; search_vec(p->dynv, &i, DT_MIPS_SYMTABNO);
- - Sym *sym = p->syms + j;
- - rel[0] = (unsigned char *)got - base;
- - for (i-=j; i; i--, sym++, rel[0]+=sizeof(size_t)) {
- - rel[1] = sym-p->syms << 8 | R_MIPS_JUMP_SLOT;
- - do_relocs(p, rel, sizeof rel, 2);
- - }
- -}
- -
- -static void reloc_all(struct dso *p)
- -{
- - size_t dyn[DYN_CNT];
- - for (; p; p=p->next) {
- - if (p->relocated) continue;
- - decode_vec(p->dynv, dyn, DYN_CNT);
- - if (NEED_MIPS_GOT_RELOCS)
- - do_mips_relocs(p, laddr(p, dyn[DT_PLTGOT]));
- - do_relocs(p, laddr(p, dyn[DT_JMPREL]), dyn[DT_PLTRELSZ],
- - 2+(dyn[DT_PLTREL]==DT_RELA));
- - do_relocs(p, laddr(p, dyn[DT_REL]), dyn[DT_RELSZ], 2);
- - do_relocs(p, laddr(p, dyn[DT_RELA]), dyn[DT_RELASZ], 3);
- -
- - if (head != &ldso && p->relro_start != p->relro_end &&
- - mprotect(laddr(p, p->relro_start), p->relro_end-p->relro_start, PROT_READ)
- - && errno != ENOSYS) {
- - error("Error relocating %s: RELRO protection failed: %m",
- - p->name);
- - if (runtime) longjmp(*rtld_fail, 1);
- - }
- -
- - p->relocated = 1;
- - }
- -}
- -
- -static void kernel_mapped_dso(struct dso *p)
- -{
- - size_t min_addr = -1, max_addr = 0, cnt;
- - Phdr *ph = p->phdr;
- - for (cnt = p->phnum; cnt--; ph = (void *)((char *)ph + p->phentsize)) {
- - if (ph->p_type == PT_DYNAMIC) {
- - p->dynv = laddr(p, ph->p_vaddr);
- - } else if (ph->p_type == PT_GNU_RELRO) {
- - p->relro_start = ph->p_vaddr & -PAGE_SIZE;
- - p->relro_end = (ph->p_vaddr + ph->p_memsz) & -PAGE_SIZE;
- - }
- - if (ph->p_type != PT_LOAD) continue;
- - if (ph->p_vaddr < min_addr)
- - min_addr = ph->p_vaddr;
- - if (ph->p_vaddr+ph->p_memsz > max_addr)
- - max_addr = ph->p_vaddr+ph->p_memsz;
- - }
- - min_addr &= -PAGE_SIZE;
- - max_addr = (max_addr + PAGE_SIZE-1) & -PAGE_SIZE;
- - p->map = p->base + min_addr;
- - p->map_len = max_addr - min_addr;
- - p->kernel_mapped = 1;
- -}
- -
- -static void do_fini()
- -{
- - struct dso *p;
- - size_t dyn[DYN_CNT];
- - for (p=fini_head; p; p=p->fini_next) {
- - if (!p->constructed) continue;
- - decode_vec(p->dynv, dyn, DYN_CNT);
- - if (dyn[0] & (1<<DT_FINI_ARRAY)) {
- - size_t n = dyn[DT_FINI_ARRAYSZ]/sizeof(size_t);
- - size_t *fn = (size_t *)laddr(p, dyn[DT_FINI_ARRAY])+n;
- - while (n--) ((void (*)(void))*--fn)();
- - }
- -#ifndef NO_LEGACY_INITFINI
- - if ((dyn[0] & (1<<DT_FINI)) && dyn[DT_FINI])
- - fpaddr(p, dyn[DT_FINI])();
- -#endif
- - }
- -}
- -
- -static void do_init_fini(struct dso *p)
- -{
- - size_t dyn[DYN_CNT];
- - int need_locking = libc.threads_minus_1;
- - /* Allow recursive calls that arise when a library calls
- - * dlopen from one of its constructors, but block any
- - * other threads until all ctors have finished. */
- - if (need_locking) pthread_mutex_lock(&init_fini_lock);
- - for (; p; p=p->prev) {
- - if (p->constructed) continue;
- - p->constructed = 1;
- - decode_vec(p->dynv, dyn, DYN_CNT);
- - if (dyn[0] & ((1<<DT_FINI) | (1<<DT_FINI_ARRAY))) {
- - p->fini_next = fini_head;
- - fini_head = p;
- - }
- -#ifndef NO_LEGACY_INITFINI
- - if ((dyn[0] & (1<<DT_INIT)) && dyn[DT_INIT])
- - fpaddr(p, dyn[DT_INIT])();
- -#endif
- - if (dyn[0] & (1<<DT_INIT_ARRAY)) {
- - size_t n = dyn[DT_INIT_ARRAYSZ]/sizeof(size_t);
- - size_t *fn = laddr(p, dyn[DT_INIT_ARRAY]);
- - while (n--) ((void (*)(void))*fn++)();
- - }
- - if (!need_locking && libc.threads_minus_1) {
- - need_locking = 1;
- - pthread_mutex_lock(&init_fini_lock);
- - }
- - }
- - if (need_locking) pthread_mutex_unlock(&init_fini_lock);
- -}
- -
- -void __libc_start_init(void)
- -{
- - do_init_fini(tail);
- -}
- -
- -static void dl_debug_state(void)
- -{
- -}
- -
- -weak_alias(dl_debug_state, _dl_debug_state);
- -
- -void __reset_tls()
- -{
- - pthread_t self = __pthread_self();
- - struct dso *p;
- - for (p=head; p; p=p->next) {
- - if (!p->tls_id || !self->dtv[p->tls_id]) continue;
- - memcpy(self->dtv[p->tls_id], p->tls_image, p->tls_len);
- - memset((char *)self->dtv[p->tls_id]+p->tls_len, 0,
- - p->tls_size - p->tls_len);
- - if (p->tls_id == (size_t)self->dtv[0]) break;
- - }
- -}
- -
- -void *__copy_tls(unsigned char *mem)
- -{
- - pthread_t td;
- - struct dso *p;
- - void **dtv;
- -
- -#ifdef TLS_ABOVE_TP
- - dtv = (void **)(mem + libc.tls_size) - (tls_cnt + 1);
- -
- - mem += -((uintptr_t)mem + sizeof(struct pthread)) & (tls_align-1);
- - td = (pthread_t)mem;
- - mem += sizeof(struct pthread);
- -
- - for (p=head; p; p=p->next) {
- - if (!p->tls_id) continue;
- - dtv[p->tls_id] = mem + p->tls_offset;
- - memcpy(dtv[p->tls_id], p->tls_image, p->tls_len);
- - }
- -#else
- - dtv = (void **)mem;
- -
- - mem += libc.tls_size - sizeof(struct pthread);
- - mem -= (uintptr_t)mem & (tls_align-1);
- - td = (pthread_t)mem;
- -
- - for (p=head; p; p=p->next) {
- - if (!p->tls_id) continue;
- - dtv[p->tls_id] = mem - p->tls_offset;
- - memcpy(dtv[p->tls_id], p->tls_image, p->tls_len);
- - }
- -#endif
- - dtv[0] = (void *)tls_cnt;
- - td->dtv = td->dtv_copy = dtv;
- - return td;
- -}
- -
- -__attribute__((__visibility__("hidden")))
- -void *__tls_get_new(size_t *v)
- -{
- - pthread_t self = __pthread_self();
- -
- - /* Block signals to make accessing new TLS async-signal-safe */
- - sigset_t set;
- - __block_all_sigs(&set);
- - if (v[0]<=(size_t)self->dtv[0]) {
- - __restore_sigs(&set);
- - return (char *)self->dtv[v[0]]+v[1]+DTP_OFFSET;
- - }
- -
- - /* This is safe without any locks held because, if the caller
- - * is able to request the Nth entry of the DTV, the DSO list
- - * must be valid at least that far out and it was synchronized
- - * at program startup or by an already-completed call to dlopen. */
- - struct dso *p;
- - for (p=head; p->tls_id != v[0]; p=p->next);
- -
- - /* Get new DTV space from new DSO if needed */
- - if (v[0] > (size_t)self->dtv[0]) {
- - void **newdtv = p->new_dtv +
- - (v[0]+1)*sizeof(void *)*a_fetch_add(&p->new_dtv_idx,1);
- - memcpy(newdtv, self->dtv,
- - ((size_t)self->dtv[0]+1) * sizeof(void *));
- - newdtv[0] = (void *)v[0];
- - self->dtv = self->dtv_copy = newdtv;
- - }
- -
- - /* Get new TLS memory from all new DSOs up to the requested one */
- - unsigned char *mem;
- - for (p=head; ; p=p->next) {
- - if (!p->tls_id || self->dtv[p->tls_id]) continue;
- - mem = p->new_tls + (p->tls_size + p->tls_align)
- - * a_fetch_add(&p->new_tls_idx,1);
- - mem += ((uintptr_t)p->tls_image - (uintptr_t)mem)
- - & (p->tls_align-1);
- - self->dtv[p->tls_id] = mem;
- - memcpy(mem, p->tls_image, p->tls_len);
- - if (p->tls_id == v[0]) break;
- - }
- - __restore_sigs(&set);
- - return mem + v[1] + DTP_OFFSET;
- -}
- -
- -static void update_tls_size()
- -{
- - libc.tls_size = ALIGN(
- - (1+tls_cnt) * sizeof(void *) +
- - tls_offset +
- - sizeof(struct pthread) +
- - tls_align * 2,
- - tls_align);
- -}
- -
- -/* Stage 1 of the dynamic linker is defined in dlstart.c. It calls the
- - * following stage 2 and stage 3 functions via primitive symbolic lookup
- - * since it does not have access to their addresses to begin with. */
- -
- -/* Stage 2 of the dynamic linker is called after relative relocations
- - * have been processed. It can make function calls to static functions
- - * and access string literals and static data, but cannot use extern
- - * symbols. Its job is to perform symbolic relocations on the dynamic
- - * linker itself, but some of the relocations performed may need to be
- - * replaced later due to copy relocations in the main program. */
- -
- -__attribute__((__visibility__("hidden")))
- -void __dls2(unsigned char *base, size_t *sp)
- -{
- - if (DL_FDPIC) {
- - void *p1 = (void *)sp[-2];
- - void *p2 = (void *)sp[-1];
- - if (!p1) {
- - size_t *auxv, aux[AUX_CNT];
- - for (auxv=sp+1+*sp+1; *auxv; auxv++); auxv++;
- - decode_vec(auxv, aux, AUX_CNT);
- - if (aux[AT_BASE]) ldso.base = (void *)aux[AT_BASE];
- - else ldso.base = (void *)(aux[AT_PHDR] & -4096);
- - }
- - app_loadmap = p2 ? p1 : 0;
- - ldso.loadmap = p2 ? p2 : p1;
- - ldso.base = laddr(&ldso, 0);
- - } else {
- - ldso.base = base;
- - }
- - Ehdr *ehdr = (void *)ldso.base;
- - ldso.name = ldso.shortname = "libc.so";
- - ldso.global = 1;
- - ldso.phnum = ehdr->e_phnum;
- - ldso.phdr = laddr(&ldso, ehdr->e_phoff);
- - ldso.phentsize = ehdr->e_phentsize;
- - kernel_mapped_dso(&ldso);
- - decode_dyn(&ldso);
- -
- - if (DL_FDPIC) makefuncdescs(&ldso);
- -
- - /* Prepare storage for to save clobbered REL addends so they
- - * can be reused in stage 3. There should be very few. If
- - * something goes wrong and there are a huge number, abort
- - * instead of risking stack overflow. */
- - size_t dyn[DYN_CNT];
- - decode_vec(ldso.dynv, dyn, DYN_CNT);
- - size_t *rel = laddr(&ldso, dyn[DT_REL]);
- - size_t rel_size = dyn[DT_RELSZ];
- - size_t symbolic_rel_cnt = 0;
- - apply_addends_to = rel;
- - for (; rel_size; rel+=2, rel_size-=2*sizeof(size_t))
- - if (!IS_RELATIVE(rel[1], ldso.syms)) symbolic_rel_cnt++;
- - if (symbolic_rel_cnt >= ADDEND_LIMIT) a_crash();
- - size_t addends[symbolic_rel_cnt+1];
- - saved_addends = addends;
- -
- - head = &ldso;
- - reloc_all(&ldso);
- -
- - ldso.relocated = 0;
- -
- - /* Call dynamic linker stage-3, __dls3, looking it up
- - * symbolically as a barrier against moving the address
- - * load across the above relocation processing. */
- - struct symdef dls3_def = find_sym(&ldso, "__dls3", 0);
- - if (DL_FDPIC) ((stage3_func)&ldso.funcdescs[dls3_def.sym-ldso.syms])(sp);
- - else ((stage3_func)laddr(&ldso, dls3_def.sym->st_value))(sp);
- -}
- -
- -/* Stage 3 of the dynamic linker is called with the dynamic linker/libc
- - * fully functional. Its job is to load (if not already loaded) and
- - * process dependencies and relocations for the main application and
- - * transfer control to its entry point. */
- -
- -_Noreturn void __dls3(size_t *sp)
- -{
- - static struct dso app, vdso;
- - size_t aux[AUX_CNT], *auxv;
- - size_t i;
- - char *env_preload=0;
- - size_t vdso_base;
- - int argc = *sp;
- - char **argv = (void *)(sp+1);
- - char **argv_orig = argv;
- - char **envp = argv+argc+1;
- -
- - /* Find aux vector just past environ[] and use it to initialize
- - * global data that may be needed before we can make syscalls. */
- - __environ = envp;
- - for (i=argc+1; argv[i]; i++);
- - libc.auxv = auxv = (void *)(argv+i+1);
- - decode_vec(auxv, aux, AUX_CNT);
- - __hwcap = aux[AT_HWCAP];
- - libc.page_size = aux[AT_PAGESZ];
- - libc.secure = ((aux[0]&0x7800)!=0x7800 || aux[AT_UID]!=aux[AT_EUID]
- - || aux[AT_GID]!=aux[AT_EGID] || aux[AT_SECURE]);
- -
- - /* Setup early thread pointer in builtin_tls for ldso/libc itself to
- - * use during dynamic linking. If possible it will also serve as the
- - * thread pointer at runtime. */
- - libc.tls_size = sizeof builtin_tls;
- - if (__init_tp(__copy_tls((void *)builtin_tls)) < 0) {
- - a_crash();
- - }
- -
- - /* Only trust user/env if kernel says we're not suid/sgid */
- - if (!libc.secure) {
- - env_path = getenv("LD_LIBRARY_PATH");
- - env_preload = getenv("LD_PRELOAD");
- - }
- -
- - /* If the main program was already loaded by the kernel,
- - * AT_PHDR will point to some location other than the dynamic
- - * linker's program headers. */
- - if (aux[AT_PHDR] != (size_t)ldso.phdr) {
- - size_t interp_off = 0;
- - size_t tls_image = 0;
- - /* Find load address of the main program, via AT_PHDR vs PT_PHDR. */
- - Phdr *phdr = app.phdr = (void *)aux[AT_PHDR];
- - app.phnum = aux[AT_PHNUM];
- - app.phentsize = aux[AT_PHENT];
- - for (i=aux[AT_PHNUM]; i; i--, phdr=(void *)((char *)phdr + aux[AT_PHENT])) {
- - if (phdr->p_type == PT_PHDR)
- - app.base = (void *)(aux[AT_PHDR] - phdr->p_vaddr);
- - else if (phdr->p_type == PT_INTERP)
- - interp_off = (size_t)phdr->p_vaddr;
- - else if (phdr->p_type == PT_TLS) {
- - tls_image = phdr->p_vaddr;
- - app.tls_len = phdr->p_filesz;
- - app.tls_size = phdr->p_memsz;
- - app.tls_align = phdr->p_align;
- - }
- - }
- - if (DL_FDPIC) app.loadmap = app_loadmap;
- - if (app.tls_size) app.tls_image = laddr(&app, tls_image);
- - if (interp_off) ldso.name = laddr(&app, interp_off);
- - if ((aux[0] & (1UL<<AT_EXECFN))
- - && strncmp((char *)aux[AT_EXECFN], "/proc/", 6))
- - app.name = (char *)aux[AT_EXECFN];
- - else
- - app.name = argv[0];
- - kernel_mapped_dso(&app);
- - } else {
- - int fd;
- - char *ldname = argv[0];
- - size_t l = strlen(ldname);
- - if (l >= 3 && !strcmp(ldname+l-3, "ldd")) ldd_mode = 1;
- - argv++;
- - while (argv[0] && argv[0][0]=='-' && argv[0][1]=='-') {
- - char *opt = argv[0]+2;
- - *argv++ = (void *)-1;
- - if (!*opt) {
- - break;
- - } else if (!memcmp(opt, "list", 5)) {
- - ldd_mode = 1;
- - } else if (!memcmp(opt, "library-path", 12)) {
- - if (opt[12]=='=') env_path = opt+13;
- - else if (opt[12]) *argv = 0;
- - else if (*argv) env_path = *argv++;
- - } else if (!memcmp(opt, "preload", 7)) {
- - if (opt[7]=='=') env_preload = opt+8;
- - else if (opt[7]) *argv = 0;
- - else if (*argv) env_preload = *argv++;
- - } else {
- - argv[0] = 0;
- - }
- - }
- - argv[-1] = (void *)(argc - (argv-argv_orig));
- - if (!argv[0]) {
- - dprintf(2, "musl libc\n"
- - "Version %s\n"
- - "Dynamic Program Loader\n"
- - "Usage: %s [options] [--] pathname%s\n",
- - __libc_get_version(), ldname,
- - ldd_mode ? "" : " [args]");
- - _exit(1);
- - }
- - fd = open(argv[0], O_RDONLY);
- - if (fd < 0) {
- - dprintf(2, "%s: cannot load %s: %s\n", ldname, argv[0], strerror(errno));
- - _exit(1);
- - }
- - runtime = 1;
- - Ehdr *ehdr = (void *)map_library(fd, &app);
- - if (!ehdr) {
- - dprintf(2, "%s: %s: Not a valid dynamic program\n", ldname, argv[0]);
- - _exit(1);
- - }
- - runtime = 0;
- - close(fd);
- - ldso.name = ldname;
- - app.name = argv[0];
- - aux[AT_ENTRY] = (size_t)laddr(&app, ehdr->e_entry);
- - /* Find the name that would have been used for the dynamic
- - * linker had ldd not taken its place. */
- - if (ldd_mode) {
- - for (i=0; i<app.phnum; i++) {
- - if (app.phdr[i].p_type == PT_INTERP)
- - ldso.name = laddr(&app, app.phdr[i].p_vaddr);
- - }
- - dprintf(1, "\t%s (%p)\n", ldso.name, ldso.base);
- - }
- - }
- - if (app.tls_size) {
- - app.tls_id = tls_cnt = 1;
- -#ifdef TLS_ABOVE_TP
- - app.tls_offset = 0;
- - tls_offset = app.tls_size
- - + ( -((uintptr_t)app.tls_image + app.tls_size)
- - & (app.tls_align-1) );
- -#else
- - tls_offset = app.tls_offset = app.tls_size
- - + ( -((uintptr_t)app.tls_image + app.tls_size)
- - & (app.tls_align-1) );
- -#endif
- - tls_align = MAXP2(tls_align, app.tls_align);
- - }
- - app.global = 1;
- - decode_dyn(&app);
- - if (DL_FDPIC) {
- - makefuncdescs(&app);
- - if (!app.loadmap) {
- - app.loadmap = (void *)&app_dummy_loadmap;
- - app.loadmap->nsegs = 1;
- - app.loadmap->segs[0].addr = (size_t)app.map;
- - app.loadmap->segs[0].p_vaddr = (size_t)app.map
- - - (size_t)app.base;
- - app.loadmap->segs[0].p_memsz = app.map_len;
- - }
- - argv[-3] = (void *)app.loadmap;
- - }
- -
- - /* Attach to vdso, if provided by the kernel */
- - if (search_vec(auxv, &vdso_base, AT_SYSINFO_EHDR)) {
- - Ehdr *ehdr = (void *)vdso_base;
- - Phdr *phdr = vdso.phdr = (void *)(vdso_base + ehdr->e_phoff);
- - vdso.phnum = ehdr->e_phnum;
- - vdso.phentsize = ehdr->e_phentsize;
- - for (i=ehdr->e_phnum; i; i--, phdr=(void *)((char *)phdr + ehdr->e_phentsize)) {
- - if (phdr->p_type == PT_DYNAMIC)
- - vdso.dynv = (void *)(vdso_base + phdr->p_offset);
- - if (phdr->p_type == PT_LOAD)
- - vdso.base = (void *)(vdso_base - phdr->p_vaddr + phdr->p_offset);
- - }
- - vdso.name = "";
- - vdso.shortname = "linux-gate.so.1";
- - vdso.global = 1;
- - vdso.relocated = 1;
- - decode_dyn(&vdso);
- - vdso.prev = &ldso;
- - ldso.next = &vdso;
- - }
- -
- - /* Initial dso chain consists only of the app. */
- - head = tail = &app;
- -
- - /* Donate unused parts of app and library mapping to malloc */
- - reclaim_gaps(&app);
- - reclaim_gaps(&ldso);
- -
- - /* Load preload/needed libraries, add their symbols to the global
- - * namespace, and perform all remaining relocations. */
- - if (env_preload) load_preload(env_preload);
- - load_deps(&app);
- - make_global(&app);
- -
- -#ifndef DYNAMIC_IS_RO
- - for (i=0; app.dynv[i]; i+=2)
- - if (app.dynv[i]==DT_DEBUG)
- - app.dynv[i+1] = (size_t)&debug;
- -#endif
- -
- - /* The main program must be relocated LAST since it may contin
- - * copy relocations which depend on libraries' relocations. */
- - reloc_all(app.next);
- - reloc_all(&app);
- -
- - update_tls_size();
- - if (libc.tls_size > sizeof builtin_tls || tls_align > MIN_TLS_ALIGN) {
- - void *initial_tls = calloc(libc.tls_size, 1);
- - if (!initial_tls) {
- - dprintf(2, "%s: Error getting %zu bytes thread-local storage: %m\n",
- - argv[0], libc.tls_size);
- - _exit(127);
- - }
- - if (__init_tp(__copy_tls(initial_tls)) < 0) {
- - a_crash();
- - }
- - } else {
- - size_t tmp_tls_size = libc.tls_size;
- - pthread_t self = __pthread_self();
- - /* Temporarily set the tls size to the full size of
- - * builtin_tls so that __copy_tls will use the same layout
- - * as it did for before. Then check, just to be safe. */
- - libc.tls_size = sizeof builtin_tls;
- - if (__copy_tls((void*)builtin_tls) != self) a_crash();
- - libc.tls_size = tmp_tls_size;
- - }
- - static_tls_cnt = tls_cnt;
- -
- - if (ldso_fail) _exit(127);
- - if (ldd_mode) _exit(0);
- -
- - /* Switch to runtime mode: any further failures in the dynamic
- - * linker are a reportable failure rather than a fatal startup
- - * error. */
- - runtime = 1;
- -
- - debug.ver = 1;
- - debug.bp = dl_debug_state;
- - debug.head = head;
- - debug.base = ldso.base;
- - debug.state = 0;
- - _dl_debug_state();
- -
- - __init_libc(envp, argv[0]);
- - atexit(do_fini);
- - errno = 0;
- -
- - CRTJMP((void *)aux[AT_ENTRY], argv-1);
- - for(;;);
- -}
- -
- -void *dlopen(const char *file, int mode)
- -{
- - struct dso *volatile p, *orig_tail, *next;
- - size_t orig_tls_cnt, orig_tls_offset, orig_tls_align;
- - size_t i;
- - int cs;
- - jmp_buf jb;
- -
- - if (!file) return head;
- -
- - pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
- - pthread_rwlock_wrlock(&lock);
- - __inhibit_ptc();
- -
- - p = 0;
- - orig_tls_cnt = tls_cnt;
- - orig_tls_offset = tls_offset;
- - orig_tls_align = tls_align;
- - orig_tail = tail;
- - noload = mode & RTLD_NOLOAD;
- -
- - rtld_fail = &jb;
- - if (setjmp(*rtld_fail)) {
- - /* Clean up anything new that was (partially) loaded */
- - if (p && p->deps) for (i=0; p->deps[i]; i++)
- - if (p->deps[i]->global < 0)
- - p->deps[i]->global = 0;
- - for (p=orig_tail->next; p; p=next) {
- - next = p->next;
- - while (p->td_index) {
- - void *tmp = p->td_index->next;
- - free(p->td_index);
- - p->td_index = tmp;
- - }
- - free(p->funcdescs);
- - if (p->rpath != p->rpath_orig)
- - free(p->rpath);
- - free(p->deps);
- - unmap_library(p);
- - free(p);
- - }
- - tls_cnt = orig_tls_cnt;
- - tls_offset = orig_tls_offset;
- - tls_align = orig_tls_align;
- - tail = orig_tail;
- - tail->next = 0;
- - p = 0;
- - goto end;
- - } else p = load_library(file, head);
- -
- - if (!p) {
- - error(noload ?
- - "Library %s is not already loaded" :
- - "Error loading shared library %s: %m",
- - file);
- - goto end;
- - }
- -
- - /* First load handling */
- - if (!p->deps) {
- - load_deps(p);
- - if (p->deps) for (i=0; p->deps[i]; i++)
- - if (!p->deps[i]->global)
- - p->deps[i]->global = -1;
- - if (!p->global) p->global = -1;
- - reloc_all(p);
- - if (p->deps) for (i=0; p->deps[i]; i++)
- - if (p->deps[i]->global < 0)
- - p->deps[i]->global = 0;
- - if (p->global < 0) p->global = 0;
- - }
- -
- - if (mode & RTLD_GLOBAL) {
- - if (p->deps) for (i=0; p->deps[i]; i++)
- - p->deps[i]->global = 1;
- - p->global = 1;
- - }
- -
- - update_tls_size();
- - _dl_debug_state();
- - orig_tail = tail;
- -end:
- - __release_ptc();
- - if (p) gencnt++;
- - pthread_rwlock_unlock(&lock);
- - if (p) do_init_fini(orig_tail);
- - pthread_setcancelstate(cs, 0);
- - return p;
- -}
- -
- -static int invalid_dso_handle(void *h)
- -{
- - struct dso *p;
- - for (p=head; p; p=p->next) if (h==p) return 0;
- - error("Invalid library handle %p", (void *)h);
- - return 1;
- -}
- -
- -static void *addr2dso(size_t a)
- -{
- - struct dso *p;
- - size_t i;
- - if (DL_FDPIC) for (p=head; p; p=p->next) {
- - i = count_syms(p);
- - if (a-(size_t)p->funcdescs < i*sizeof(*p->funcdescs))
- - return p;
- - }
- - for (p=head; p; p=p->next) {
- - if (DL_FDPIC && p->loadmap) {
- - for (i=0; i<p->loadmap->nsegs; i++) {
- - if (a-p->loadmap->segs[i].p_vaddr
- - < p->loadmap->segs[i].p_memsz)
- - return p;
- - }
- - } else {
- - if (a-(size_t)p->map < p->map_len)
- - return p;
- - }
- - }
- - return 0;
- -}
- -
- -void *__tls_get_addr(size_t *);
- -
- -static void *do_dlsym(struct dso *p, const char *s, void *ra)
- -{
- - size_t i;
- - uint32_t h = 0, gh = 0, *ght;
- - Sym *sym;
- - if (p == head || p == RTLD_DEFAULT || p == RTLD_NEXT) {
- - if (p == RTLD_DEFAULT) {
- - p = head;
- - } else if (p == RTLD_NEXT) {
- - p = addr2dso((size_t)ra);
- - if (!p) p=head;
- - p = p->next;
- - }
- - struct symdef def = find_sym(p, s, 0);
- - if (!def.sym) goto failed;
- - if ((def.sym->st_info&0xf) == STT_TLS)
- - return __tls_get_addr((size_t []){def.dso->tls_id, def.sym->st_value});
- - if (DL_FDPIC && (def.sym->st_info&0xf) == STT_FUNC)
- - return def.dso->funcdescs + (def.sym - def.dso->syms);
- - return laddr(def.dso, def.sym->st_value);
- - }
- - if (invalid_dso_handle(p))
- - return 0;
- - if ((ght = p->ghashtab)) {
- - gh = gnu_hash(s);
- - sym = gnu_lookup(gh, ght, p, s);
- - } else {
- - h = sysv_hash(s);
- - sym = sysv_lookup(s, h, p);
- - }
- - if (sym && (sym->st_info&0xf) == STT_TLS)
- - return __tls_get_addr((size_t []){p->tls_id, sym->st_value});
- - if (DL_FDPIC && sym && sym->st_shndx && (sym->st_info&0xf) == STT_FUNC)
- - return p->funcdescs + (sym - p->syms);
- - if (sym && sym->st_value && (1<<(sym->st_info&0xf) & OK_TYPES))
- - return laddr(p, sym->st_value);
- - if (p->deps) for (i=0; p->deps[i]; i++) {
- - if ((ght = p->deps[i]->ghashtab)) {
- - if (!gh) gh = gnu_hash(s);
- - sym = gnu_lookup(gh, ght, p->deps[i], s);
- - } else {
- - if (!h) h = sysv_hash(s);
- - sym = sysv_lookup(s, h, p->deps[i]);
- - }
- - if (sym && (sym->st_info&0xf) == STT_TLS)
- - return __tls_get_addr((size_t []){p->deps[i]->tls_id, sym->st_value});
- - if (DL_FDPIC && sym && sym->st_shndx && (sym->st_info&0xf) == STT_FUNC)
- - return p->deps[i]->funcdescs + (sym - p->deps[i]->syms);
- - if (sym && sym->st_value && (1<<(sym->st_info&0xf) & OK_TYPES))
- - return laddr(p->deps[i], sym->st_value);
- - }
- -failed:
- - error("Symbol not found: %s", s);
- - return 0;
- -}
- -
- -int __dladdr(const void *addr, Dl_info *info)
- -{
- - struct dso *p;
- - Sym *sym, *bestsym;
- - uint32_t nsym;
- - char *strings;
- - void *best = 0;
- -
- - pthread_rwlock_rdlock(&lock);
- - p = addr2dso((size_t)addr);
- - pthread_rwlock_unlock(&lock);
- -
- - if (!p) return 0;
- -
- - sym = p->syms;
- - strings = p->strings;
- - nsym = count_syms(p);
- -
- - if (DL_FDPIC) {
- - size_t idx = ((size_t)addr-(size_t)p->funcdescs)
- - / sizeof(*p->funcdescs);
- - if (idx < nsym && (sym[idx].st_info&0xf) == STT_FUNC) {
- - best = p->funcdescs + idx;
- - bestsym = sym + idx;
- - }
- - }
- -
- - if (!best) for (; nsym; nsym--, sym++) {
- - if (sym->st_value
- - && (1<<(sym->st_info&0xf) & OK_TYPES)
- - && (1<<(sym->st_info>>4) & OK_BINDS)) {
- - void *symaddr = laddr(p, sym->st_value);
- - if (symaddr > addr || symaddr < best)
- - continue;
- - best = symaddr;
- - bestsym = sym;
- - if (addr == symaddr)
- - break;
- - }
- - }
- -
- - if (!best) return 0;
- -
- - if (DL_FDPIC && (bestsym->st_info&0xf) == STT_FUNC)
- - best = p->funcdescs + (bestsym - p->syms);
- -
- - info->dli_fname = p->name;
- - info->dli_fbase = p->base;
- - info->dli_sname = strings + bestsym->st_name;
- - info->dli_saddr = best;
- -
- - return 1;
- -}
- -
- -__attribute__((__visibility__("hidden")))
- -void *__dlsym(void *restrict p, const char *restrict s, void *restrict ra)
- -{
- - void *res;
- - pthread_rwlock_rdlock(&lock);
- - res = do_dlsym(p, s, ra);
- - pthread_rwlock_unlock(&lock);
- - return res;
- -}
- -
- -int dl_iterate_phdr(int(*callback)(struct dl_phdr_info *info, size_t size, void *data), void *data)
- -{
- - struct dso *current;
- - struct dl_phdr_info info;
- - int ret = 0;
- - for(current = head; current;) {
- - info.dlpi_addr = (uintptr_t)current->base;
- - info.dlpi_name = current->name;
- - info.dlpi_phdr = current->phdr;
- - info.dlpi_phnum = current->phnum;
- - info.dlpi_adds = gencnt;
- - info.dlpi_subs = 0;
- - info.dlpi_tls_modid = current->tls_id;
- - info.dlpi_tls_data = current->tls_image;
- -
- - ret = (callback)(&info, sizeof (info), data);
- -
- - if (ret != 0) break;
- -
- - pthread_rwlock_rdlock(&lock);
- - current = current->next;
- - pthread_rwlock_unlock(&lock);
- - }
- - return ret;
- -}
- -#else
- -static int invalid_dso_handle(void *h)
- -{
- - error("Invalid library handle %p", (void *)h);
- - return 1;
- -}
- -void *dlopen(const char *file, int mode)
- -{
- - error("Dynamic loading not supported");
- - return 0;
- -}
- -void *__dlsym(void *restrict p, const char *restrict s, void *restrict ra)
- -{
- - error("Symbol not found: %s", s);
- - return 0;
- -}
- -int __dladdr (const void *addr, Dl_info *info)
- -{
- - return 0;
- -}
- -#endif
- -
- -int __dlinfo(void *dso, int req, void *res)
- -{
- - if (invalid_dso_handle(dso)) return -1;
- - if (req != RTLD_DI_LINKMAP) {
- - error("Unsupported request %d", req);
- - return -1;
- - }
- - *(struct link_map **)res = dso;
- - return 0;
- -}
- -
- -char *dlerror()
- -{
- - pthread_t self = __pthread_self();
- - if (!self->dlerror_flag) return 0;
- - self->dlerror_flag = 0;
- - char *s = self->dlerror_buf;
- - if (s == (void *)-1)
- - return "Dynamic linker failed to allocate memory for error message";
- - else
- - return s;
- -}
- -
- -int dlclose(void *p)
- -{
- - return invalid_dso_handle(p);
- -}
- -
- -void __dl_thread_cleanup(void)
- -{
- - pthread_t self = __pthread_self();
- - if (self->dlerror_buf != (void *)-1)
- - free(self->dlerror_buf);
- -}
- -
- -static void error(const char *fmt, ...)
- -{
- - va_list ap;
- - va_start(ap, fmt);
- -#ifdef SHARED
- - if (!runtime) {
- - vdprintf(2, fmt, ap);
- - dprintf(2, "\n");
- - ldso_fail = 1;
- - va_end(ap);
- - return;
- - }
- -#endif
- - pthread_t self = __pthread_self();
- - if (self->dlerror_buf != (void *)-1)
- - free(self->dlerror_buf);
- - size_t len = vsnprintf(0, 0, fmt, ap);
- - va_end(ap);
- - char *buf = malloc(len+1);
- - if (buf) {
- - va_start(ap, fmt);
- - vsnprintf(buf, len+1, fmt, ap);
- - va_end(ap);
- - } else {
- - buf = (void *)-1;
- - }
- - self->dlerror_buf = buf;
- - self->dlerror_flag = 1;
- -}
- --- a/src/ldso/tlsdesc.c
- +++ b/src/ldso/tlsdesc.c
- @@ -1,5 +1,3 @@
- -#ifdef SHARED
- -
- #include <stddef.h>
- #include "libc.h"
-
- @@ -12,5 +10,3 @@ ptrdiff_t __tlsdesc_static()
- }
-
- weak_alias(__tlsdesc_static, __tlsdesc_dynamic);
- -
- -#endif
- --- a/src/legacy/utmpx.c
- +++ b/src/legacy/utmpx.c
- @@ -1,5 +1,6 @@
- #include <utmpx.h>
- #include <stddef.h>
- +#include <errno.h>
- #include "libc.h"
-
- void endutxent(void)
- @@ -34,6 +35,12 @@ void updwtmpx(const char *f, const struc
- {
- }
-
- +int __utmpxname(const char *f)
- +{
- + errno = ENOTSUP;
- + return -1;
- +}
- +
- weak_alias(endutxent, endutent);
- weak_alias(setutxent, setutent);
- weak_alias(getutxent, getutent);
- @@ -41,3 +48,5 @@ weak_alias(getutxid, getutid);
- weak_alias(getutxline, getutline);
- weak_alias(pututxline, pututline);
- weak_alias(updwtmpx, updwtmp);
- +weak_alias(__utmpxname, utmpname);
- +weak_alias(__utmpxname, utmpxname);
- --- /dev/null
- +++ b/src/linux/x32/sysinfo.c
- @@ -0,0 +1,50 @@
- +#include <sys/sysinfo.h>
- +#include "syscall.h"
- +#include "libc.h"
- +
- +#define klong long long
- +#define kulong unsigned long long
- +
- +struct kernel_sysinfo {
- + klong uptime;
- + kulong loads[3];
- + kulong totalram;
- + kulong freeram;
- + kulong sharedram;
- + kulong bufferram;
- + kulong totalswap;
- + kulong freeswap;
- + short procs;
- + short pad;
- + kulong totalhigh;
- + kulong freehigh;
- + unsigned mem_unit;
- +};
- +
- +int __lsysinfo(struct sysinfo *info)
- +{
- + struct kernel_sysinfo tmp;
- + int ret = syscall(SYS_sysinfo, &tmp);
- + if(ret == -1) return ret;
- + info->uptime = tmp.uptime;
- + info->loads[0] = tmp.loads[0];
- + info->loads[1] = tmp.loads[1];
- + info->loads[2] = tmp.loads[2];
- + kulong shifts;
- + kulong max = tmp.totalram | tmp.totalswap;
- + __asm__("bsr %1,%0" : "=r"(shifts) : "r"(max));
- + shifts = shifts >= 32 ? shifts - 31 : 0;
- + info->totalram = tmp.totalram >> shifts;
- + info->freeram = tmp.freeram >> shifts;
- + info->sharedram = tmp.sharedram >> shifts;
- + info->bufferram = tmp.bufferram >> shifts;
- + info->totalswap = tmp.totalswap >> shifts;
- + info->freeswap = tmp.freeswap >> shifts;
- + info->procs = tmp.procs ;
- + info->totalhigh = tmp.totalhigh >> shifts;
- + info->freehigh = tmp.freehigh >> shifts;
- + info->mem_unit = (tmp.mem_unit ? tmp.mem_unit : 1) << shifts;
- + return ret;
- +}
- +
- +weak_alias(__lsysinfo, sysinfo);
- --- a/src/linux/x32/sysinfo.s
- +++ /dev/null
- @@ -1 +0,0 @@
- -# see arch/x32/src/sysinfo.c
- --- a/src/locale/langinfo.c
- +++ b/src/locale/langinfo.c
- @@ -37,23 +37,23 @@ char *__nl_langinfo_l(nl_item item, loca
-
- switch (cat) {
- case LC_NUMERIC:
- - if (idx > 1) return NULL;
- + if (idx > 1) return "";
- str = c_numeric;
- break;
- case LC_TIME:
- - if (idx > 0x31) return NULL;
- + if (idx > 0x31) return "";
- str = c_time;
- break;
- case LC_MONETARY:
- - if (idx > 0) return NULL;
- + if (idx > 0) return "";
- str = "";
- break;
- case LC_MESSAGES:
- - if (idx > 3) return NULL;
- + if (idx > 3) return "";
- str = c_messages;
- break;
- default:
- - return NULL;
- + return "";
- }
-
- for (; idx; idx--, str++) for (; *str; str++);
- --- a/src/malloc/lite_malloc.c
- +++ b/src/malloc/lite_malloc.c
- @@ -8,7 +8,7 @@
-
- void *__expand_heap(size_t *);
-
- -void *__simple_malloc(size_t n)
- +static void *__simple_malloc(size_t n)
- {
- static char *cur, *end;
- static volatile int lock[2];
- --- a/src/math/__rem_pio2.c
- +++ b/src/math/__rem_pio2.c
- @@ -118,7 +118,7 @@ int __rem_pio2(double x, double *y)
- if (ix < 0x413921fb) { /* |x| ~< 2^20*(pi/2), medium size */
- medium:
- /* rint(x/(pi/2)), Assume round-to-nearest. */
- - fn = x*invpio2 + toint - toint;
- + fn = (double_t)x*invpio2 + toint - toint;
- n = (int32_t)fn;
- r = x - fn*pio2_1;
- w = fn*pio2_1t; /* 1st round, good to 85 bits */
- --- a/src/math/__rem_pio2f.c
- +++ b/src/math/__rem_pio2f.c
- @@ -51,7 +51,7 @@ int __rem_pio2f(float x, double *y)
- /* 25+53 bit pi is good enough for medium size */
- if (ix < 0x4dc90fdb) { /* |x| ~< 2^28*(pi/2), medium size */
- /* Use a specialized rint() to get fn. Assume round-to-nearest. */
- - fn = x*invpio2 + toint - toint;
- + fn = (double_t)x*invpio2 + toint - toint;
- n = (int32_t)fn;
- *y = x - fn*pio2_1 - fn*pio2_1t;
- return n;
- --- /dev/null
- +++ b/src/math/arm/fabs.c
- @@ -0,0 +1,15 @@
- +#include <math.h>
- +
- +#if __ARM_PCS_VFP
- +
- +double fabs(double x)
- +{
- + __asm__ ("vabs.f64 %P0, %P1" : "=w"(x) : "w"(x));
- + return x;
- +}
- +
- +#else
- +
- +#include "../fabs.c"
- +
- +#endif
- --- /dev/null
- +++ b/src/math/arm/fabsf.c
- @@ -0,0 +1,15 @@
- +#include <math.h>
- +
- +#if __ARM_PCS_VFP
- +
- +float fabsf(float x)
- +{
- + __asm__ ("vabs.f32 %0, %1" : "=t"(x) : "t"(x));
- + return x;
- +}
- +
- +#else
- +
- +#include "../fabsf.c"
- +
- +#endif
- --- /dev/null
- +++ b/src/math/arm/sqrt.c
- @@ -0,0 +1,15 @@
- +#include <math.h>
- +
- +#if __VFP_FP__ && !__SOFTFP__
- +
- +double sqrt(double x)
- +{
- + __asm__ ("vsqrt.f64 %P0, %P1" : "=w"(x) : "w"(x));
- + return x;
- +}
- +
- +#else
- +
- +#include "../sqrt.c"
- +
- +#endif
- --- /dev/null
- +++ b/src/math/arm/sqrtf.c
- @@ -0,0 +1,15 @@
- +#include <math.h>
- +
- +#if __VFP_FP__ && !__SOFTFP__
- +
- +float sqrtf(float x)
- +{
- + __asm__ ("vsqrt.f32 %0, %1" : "=t"(x) : "t"(x));
- + return x;
- +}
- +
- +#else
- +
- +#include "../sqrtf.c"
- +
- +#endif
- --- a/src/math/armebhf/fabs.sub
- +++ /dev/null
- @@ -1 +0,0 @@
- -../armhf/fabs.s
- --- a/src/math/armebhf/fabsf.sub
- +++ /dev/null
- @@ -1 +0,0 @@
- -../armhf/fabsf.s
- --- a/src/math/armebhf/sqrt.sub
- +++ /dev/null
- @@ -1 +0,0 @@
- -../armhf/sqrt.s
- --- a/src/math/armebhf/sqrtf.sub
- +++ /dev/null
- @@ -1 +0,0 @@
- -../armhf/sqrtf.s
- --- a/src/math/armhf/fabs.s
- +++ /dev/null
- @@ -1,7 +0,0 @@
- -.fpu vfp
- -.text
- -.global fabs
- -.type fabs,%function
- -fabs:
- - vabs.f64 d0, d0
- - bx lr
- --- a/src/math/armhf/fabs.sub
- +++ /dev/null
- @@ -1 +0,0 @@
- -fabs.s
- --- a/src/math/armhf/fabsf.s
- +++ /dev/null
- @@ -1,7 +0,0 @@
- -.fpu vfp
- -.text
- -.global fabsf
- -.type fabsf,%function
- -fabsf:
- - vabs.f32 s0, s0
- - bx lr
- --- a/src/math/armhf/fabsf.sub
- +++ /dev/null
- @@ -1 +0,0 @@
- -fabsf.s
- --- a/src/math/armhf/sqrt.s
- +++ /dev/null
- @@ -1,7 +0,0 @@
- -.fpu vfp
- -.text
- -.global sqrt
- -.type sqrt,%function
- -sqrt:
- - vsqrt.f64 d0, d0
- - bx lr
- --- a/src/math/armhf/sqrt.sub
- +++ /dev/null
- @@ -1 +0,0 @@
- -sqrt.s
- --- a/src/math/armhf/sqrtf.s
- +++ /dev/null
- @@ -1,7 +0,0 @@
- -.fpu vfp
- -.text
- -.global sqrtf
- -.type sqrtf,%function
- -sqrtf:
- - vsqrt.f32 s0, s0
- - bx lr
- --- a/src/math/armhf/sqrtf.sub
- +++ /dev/null
- @@ -1 +0,0 @@
- -sqrtf.s
- --- a/src/math/hypot.c
- +++ b/src/math/hypot.c
- @@ -12,10 +12,10 @@ static void sq(double_t *hi, double_t *l
- {
- double_t xh, xl, xc;
-
- - xc = x*SPLIT;
- + xc = (double_t)x*SPLIT;
- xh = x - xc + xc;
- xl = x - xh;
- - *hi = x*x;
- + *hi = (double_t)x*x;
- *lo = xh*xh - *hi + 2*xh*xl + xl*xl;
- }
-
- --- a/src/mman/mremap.c
- +++ b/src/mman/mremap.c
- @@ -1,17 +1,31 @@
- +#define _GNU_SOURCE
- #include <unistd.h>
- #include <sys/mman.h>
- +#include <errno.h>
- +#include <stdint.h>
- #include <stdarg.h>
- #include "syscall.h"
- #include "libc.h"
-
- +static void dummy(void) { }
- +weak_alias(dummy, __vm_wait);
- +
- void *__mremap(void *old_addr, size_t old_len, size_t new_len, int flags, ...)
- {
- va_list ap;
- - void *new_addr;
- -
- - va_start(ap, flags);
- - new_addr = va_arg(ap, void *);
- - va_end(ap);
- + void *new_addr = 0;
- +
- + if (new_len >= PTRDIFF_MAX) {
- + errno = ENOMEM;
- + return MAP_FAILED;
- + }
- +
- + if (flags & MREMAP_FIXED) {
- + __vm_wait();
- + va_start(ap, flags);
- + new_addr = va_arg(ap, void *);
- + va_end(ap);
- + }
-
- return (void *)syscall(SYS_mremap, old_addr, old_len, new_len, flags, new_addr);
- }
- --- a/src/network/getifaddrs.c
- +++ b/src/network/getifaddrs.c
- @@ -162,13 +162,26 @@ static int netlink_msg_to_ifaddr(void *p
- for (rta = NLMSG_RTA(h, sizeof(*ifa)); NLMSG_RTAOK(rta, h); rta = RTA_NEXT(rta)) {
- switch (rta->rta_type) {
- case IFA_ADDRESS:
- - copy_addr(&ifs->ifa.ifa_addr, ifa->ifa_family, &ifs->addr, RTA_DATA(rta), RTA_DATALEN(rta), ifa->ifa_index);
- + /* If ifa_addr is already set we, received an IFA_LOCAL before
- + * so treat this as destination address */
- + if (ifs->ifa.ifa_addr)
- + copy_addr(&ifs->ifa.ifa_dstaddr, ifa->ifa_family, &ifs->ifu, RTA_DATA(rta), RTA_DATALEN(rta), ifa->ifa_index);
- + else
- + copy_addr(&ifs->ifa.ifa_addr, ifa->ifa_family, &ifs->addr, RTA_DATA(rta), RTA_DATALEN(rta), ifa->ifa_index);
- break;
- case IFA_BROADCAST:
- - /* For point-to-point links this is peer, but ifa_broadaddr
- - * and ifa_dstaddr are union, so this works for both. */
- copy_addr(&ifs->ifa.ifa_broadaddr, ifa->ifa_family, &ifs->ifu, RTA_DATA(rta), RTA_DATALEN(rta), ifa->ifa_index);
- break;
- + case IFA_LOCAL:
- + /* If ifa_addr is set and we get IFA_LOCAL, assume we have
- + * a point-to-point network. Move address to correct field. */
- + if (ifs->ifa.ifa_addr) {
- + ifs->ifu = ifs->addr;
- + ifs->ifa.ifa_dstaddr = &ifs->ifu.sa;
- + memset(&ifs->addr, 0, sizeof(ifs->addr));
- + }
- + copy_addr(&ifs->ifa.ifa_addr, ifa->ifa_family, &ifs->addr, RTA_DATA(rta), RTA_DATALEN(rta), ifa->ifa_index);
- + break;
- case IFA_LABEL:
- if (RTA_DATALEN(rta) < sizeof(ifs->name)) {
- memcpy(ifs->name, RTA_DATA(rta), RTA_DATALEN(rta));
- --- a/src/network/getnameinfo.c
- +++ b/src/network/getnameinfo.c
- @@ -135,13 +135,13 @@ int getnameinfo(const struct sockaddr *r
- switch (af) {
- case AF_INET:
- a = (void *)&((struct sockaddr_in *)sa)->sin_addr;
- - if (sl != sizeof(struct sockaddr_in)) return EAI_FAMILY;
- + if (sl < sizeof(struct sockaddr_in)) return EAI_FAMILY;
- mkptr4(ptr, a);
- scopeid = 0;
- break;
- case AF_INET6:
- a = (void *)&((struct sockaddr_in6 *)sa)->sin6_addr;
- - if (sl != sizeof(struct sockaddr_in6)) return EAI_FAMILY;
- + if (sl < sizeof(struct sockaddr_in6)) return EAI_FAMILY;
- if (memcmp(a, "\0\0\0\0\0\0\0\0\0\0\xff\xff", 12))
- mkptr6(ptr, a);
- else
- --- a/src/network/if_nametoindex.c
- +++ b/src/network/if_nametoindex.c
- @@ -10,7 +10,7 @@ unsigned if_nametoindex(const char *name
- struct ifreq ifr;
- int fd, r;
-
- - if ((fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0)) < 0) return -1;
- + if ((fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0)) < 0) return 0;
- strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name);
- r = ioctl(fd, SIOCGIFINDEX, &ifr);
- __syscall(SYS_close, fd);
- --- a/src/network/lookup.h
- +++ b/src/network/lookup.h
- @@ -2,6 +2,7 @@
- #define LOOKUP_H
-
- #include <stdint.h>
- +#include <stddef.h>
-
- struct address {
- int family;
- @@ -15,6 +16,14 @@ struct service {
- unsigned char proto, socktype;
- };
-
- +#define MAXNS 3
- +
- +struct resolvconf {
- + struct address ns[MAXNS];
- + unsigned nns, attempts, ndots;
- + unsigned timeout;
- +};
- +
- /* The limit of 48 results is a non-sharp bound on the number of addresses
- * that can fit in one 512-byte DNS packet full of v4 results and a second
- * packet full of v6 results. Due to headers, the actual limit is lower. */
- @@ -25,4 +34,6 @@ int __lookup_serv(struct service buf[sta
- int __lookup_name(struct address buf[static MAXADDRS], char canon[static 256], const char *name, int family, int flags);
- int __lookup_ipliteral(struct address buf[static 1], const char *name, int family);
-
- +int __get_resolv_conf(struct resolvconf *, char *, size_t);
- +
- #endif
- --- a/src/network/lookup_name.c
- +++ b/src/network/lookup_name.c
- @@ -9,6 +9,7 @@
- #include <fcntl.h>
- #include <unistd.h>
- #include <pthread.h>
- +#include <errno.h>
- #include "lookup.h"
- #include "stdio_impl.h"
- #include "syscall.h"
- @@ -51,7 +52,14 @@ static int name_from_hosts(struct addres
- int cnt = 0;
- unsigned char _buf[1032];
- FILE _f, *f = __fopen_rb_ca("/etc/hosts", &_f, _buf, sizeof _buf);
- - if (!f) return 0;
- + if (!f) switch (errno) {
- + case ENOENT:
- + case ENOTDIR:
- + case EACCES:
- + return 0;
- + default:
- + return EAI_SYSTEM;
- + }
- while (fgets(line, sizeof line, f) && cnt < MAXADDRS) {
- char *p, *z;
-
- @@ -85,7 +93,7 @@ struct dpc_ctx {
- int __dns_parse(const unsigned char *, int, int (*)(void *, int, const void *, int, const void *), void *);
- int __dn_expand(const unsigned char *, const unsigned char *, const unsigned char *, char *, int);
- int __res_mkquery(int, const char *, int, int, const unsigned char *, int, const unsigned char*, unsigned char *, int);
- -int __res_msend(int, const unsigned char *const *, const int *, unsigned char *const *, int *, int);
- +int __res_msend_rc(int, const unsigned char *const *, const int *, unsigned char *const *, int *, int, const struct resolvconf *);
-
- #define RR_A 1
- #define RR_CNAME 5
- @@ -117,7 +125,7 @@ static int dns_parse_callback(void *c, i
- return 0;
- }
-
- -static int name_from_dns(struct address buf[static MAXADDRS], char canon[static 256], const char *name, int family)
- +static int name_from_dns(struct address buf[static MAXADDRS], char canon[static 256], const char *name, int family, const struct resolvconf *conf)
- {
- unsigned char qbuf[2][280], abuf[2][512];
- const unsigned char *qp[2] = { qbuf[0], qbuf[1] };
- @@ -137,17 +145,59 @@ static int name_from_dns(struct address
- nq++;
- }
-
- - if (__res_msend(nq, qp, qlens, ap, alens, sizeof *abuf) < 0) return EAI_SYSTEM;
- + if (__res_msend_rc(nq, qp, qlens, ap, alens, sizeof *abuf, conf) < 0)
- + return EAI_SYSTEM;
-
- for (i=0; i<nq; i++)
- __dns_parse(abuf[i], alens[i], dns_parse_callback, &ctx);
-
- if (ctx.cnt) return ctx.cnt;
- if (alens[0] < 4 || (abuf[0][3] & 15) == 2) return EAI_AGAIN;
- - if ((abuf[0][3] & 15) == 3) return EAI_NONAME;
- + if ((abuf[0][3] & 15) == 0) return EAI_NONAME;
- + if ((abuf[0][3] & 15) == 3) return 0;
- return EAI_FAIL;
- }
-
- +static int name_from_dns_search(struct address buf[static MAXADDRS], char canon[static 256], const char *name, int family)
- +{
- + char search[256];
- + struct resolvconf conf;
- + size_t l, dots;
- + char *p, *z;
- +
- + if (__get_resolv_conf(&conf, search, sizeof search) < 0) return -1;
- +
- + /* Count dots, suppress search when >=ndots or name ends in
- + * a dot, which is an explicit request for global scope. */
- + for (dots=l=0; name[l]; l++) if (name[l]=='.') dots++;
- + if (dots >= conf.ndots || name[l-1]=='.') *search = 0;
- +
- + /* This can never happen; the caller already checked length. */
- + if (l >= 256) return EAI_NONAME;
- +
- + /* Name with search domain appended is setup in canon[]. This both
- + * provides the desired default canonical name (if the requested
- + * name is not a CNAME record) and serves as a buffer for passing
- + * the full requested name to name_from_dns. */
- + memcpy(canon, name, l);
- + canon[l] = '.';
- +
- + for (p=search; *p; p=z) {
- + for (; isspace(*p); p++);
- + for (z=p; *z && !isspace(*z); z++);
- + if (z==p) break;
- + if (z-p < 256 - l - 1) {
- + memcpy(canon+l+1, p, z-p);
- + canon[z-p+1+l] = 0;
- + int cnt = name_from_dns(buf, canon, canon, family, &conf);
- + if (cnt) return cnt;
- + }
- + }
- +
- + canon[l] = 0;
- + return name_from_dns(buf, canon, name, family, &conf);
- +}
- +
- static const struct policy {
- unsigned char addr[16];
- unsigned char len, mask;
- @@ -248,7 +298,7 @@ int __lookup_name(struct address buf[sta
- if (!cnt) cnt = name_from_numeric(buf, name, family);
- if (!cnt && !(flags & AI_NUMERICHOST)) {
- cnt = name_from_hosts(buf, canon, name, family);
- - if (!cnt) cnt = name_from_dns(buf, canon, name, family);
- + if (!cnt) cnt = name_from_dns_search(buf, canon, name, family);
- }
- if (cnt<=0) return cnt ? cnt : EAI_NONAME;
-
- --- a/src/network/lookup_serv.c
- +++ b/src/network/lookup_serv.c
- @@ -4,6 +4,7 @@
- #include <ctype.h>
- #include <string.h>
- #include <fcntl.h>
- +#include <errno.h>
- #include "lookup.h"
- #include "stdio_impl.h"
-
- @@ -69,7 +70,14 @@ int __lookup_serv(struct service buf[sta
-
- unsigned char _buf[1032];
- FILE _f, *f = __fopen_rb_ca("/etc/services", &_f, _buf, sizeof _buf);
- - if (!f) return EAI_SERVICE;
- + if (!f) switch (errno) {
- + case ENOENT:
- + case ENOTDIR:
- + case EACCES:
- + return EAI_SERVICE;
- + default:
- + return EAI_SYSTEM;
- + }
-
- while (fgets(line, sizeof line, f) && cnt < MAXSERVS) {
- if ((p=strchr(line, '#'))) *p++='\n', *p=0;
- --- a/src/network/proto.c
- +++ b/src/network/proto.c
- @@ -9,21 +9,36 @@ static const unsigned char protos[] = {
- "\001icmp\0"
- "\002igmp\0"
- "\003ggp\0"
- + "\004ipencap\0"
- + "\005st\0"
- "\006tcp\0"
- + "\008egp\0"
- "\014pup\0"
- "\021udp\0"
- - "\026idp\0"
- + "\024hmp\0"
- + "\026xns-idp\0"
- + "\033rdp\0"
- + "\035iso-tp4\0"
- + "\044xtp\0"
- + "\045ddp\0"
- + "\046idpr-cmtp\0"
- "\051ipv6\0"
- "\053ipv6-route\0"
- "\054ipv6-frag\0"
- + "\055idrp\0"
- + "\056rsvp\0"
- "\057gre\0"
- "\062esp\0"
- "\063ah\0"
- + "\071skip\0"
- "\072ipv6-icmp\0"
- "\073ipv6-nonxt\0"
- "\074ipv6-opts\0"
- + "\111rspf\0"
- + "\121vmtp\0"
- "\131ospf\0"
- "\136ipip\0"
- + "\142encap\0"
- "\147pim\0"
- "\377raw"
- };
- --- a/src/network/res_msend.c
- +++ b/src/network/res_msend.c
- @@ -27,18 +27,16 @@ static unsigned long mtime()
- + ts.tv_nsec / 1000000;
- }
-
- -int __res_msend(int nqueries, const unsigned char *const *queries,
- - const int *qlens, unsigned char *const *answers, int *alens, int asize)
- +int __res_msend_rc(int nqueries, const unsigned char *const *queries,
- + const int *qlens, unsigned char *const *answers, int *alens, int asize,
- + const struct resolvconf *conf)
- {
- int fd;
- - FILE *f, _f;
- - unsigned char _buf[256];
- - char line[64], *s, *z;
- - int timeout = 5000, attempts = 2, retry_interval, servfail_retry;
- + int timeout, attempts, retry_interval, servfail_retry;
- union {
- struct sockaddr_in sin;
- struct sockaddr_in6 sin6;
- - } sa = {0}, ns[3] = {{0}};
- + } sa = {0}, ns[MAXNS] = {{0}};
- socklen_t sl = sizeof sa.sin;
- int nns = 0;
- int family = AF_INET;
- @@ -48,57 +46,27 @@ int __res_msend(int nqueries, const unsi
- int cs;
- struct pollfd pfd;
- unsigned long t0, t1, t2;
- - struct address iplit;
-
- pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
-
- - /* Get nameservers from resolv.conf, fallback to localhost */
- - f = __fopen_rb_ca("/etc/resolv.conf", &_f, _buf, sizeof _buf);
- - if (f) for (nns=0; nns<3 && fgets(line, sizeof line, f); ) {
- - if (!strncmp(line, "options", 7) && isspace(line[7])) {
- - unsigned long x;
- - char *p, *z;
- - p = strstr(line, "timeout:");
- - if (p && isdigit(p[8])) {
- - p += 8;
- - x = strtoul(p, &z, 10);
- - if (z != p) timeout = x < 30 ? x*1000 : 30000;
- - }
- - p = strstr(line, "attempts:");
- - if (p && isdigit(p[9])) {
- - p += 9;
- - x = strtoul(p, &z, 10);
- - if (z != p) attempts = x < 10 ? x : 10;
- - if (!attempts) attempts = 1;
- - }
- - }
- - if (strncmp(line, "nameserver", 10) || !isspace(line[10]))
- - continue;
- - for (s=line+11; isspace(*s); s++);
- - for (z=s; *z && !isspace(*z); z++);
- - *z=0;
- + timeout = 1000*conf->timeout;
- + attempts = conf->attempts;
-
- - if (__lookup_ipliteral(&iplit, s, AF_UNSPEC)>0) {
- - if (iplit.family == AF_INET) {
- - memcpy(&ns[nns].sin.sin_addr, iplit.addr, 4);
- - ns[nns].sin.sin_port = htons(53);
- - ns[nns++].sin.sin_family = AF_INET;
- - } else {
- - sl = sizeof sa.sin6;
- - memcpy(&ns[nns].sin6.sin6_addr, iplit.addr, 16);
- - ns[nns].sin6.sin6_port = htons(53);
- - ns[nns].sin6.sin6_scope_id = iplit.scopeid;
- - ns[nns++].sin6.sin6_family = family = AF_INET6;
- - }
- + nns = conf->nns;
- + for (nns=0; nns<conf->nns; nns++) {
- + const struct address *iplit = &conf->ns[nns];
- + if (iplit->family == AF_INET) {
- + memcpy(&ns[nns].sin.sin_addr, iplit->addr, 4);
- + ns[nns].sin.sin_port = htons(53);
- + ns[nns].sin.sin_family = AF_INET;
- + } else {
- + sl = sizeof sa.sin6;
- + memcpy(&ns[nns].sin6.sin6_addr, iplit->addr, 16);
- + ns[nns].sin6.sin6_port = htons(53);
- + ns[nns].sin6.sin6_scope_id = iplit->scopeid;
- + ns[nns].sin6.sin6_family = family = AF_INET6;
- }
- }
- - if (f) __fclose_ca(f);
- - if (!nns) {
- - ns[0].sin.sin_family = AF_INET;
- - ns[0].sin.sin_port = htons(53);
- - ns[0].sin.sin_addr.s_addr = htonl(0x7f000001);
- - nns=1;
- - }
-
- /* Get local address and open/bind a socket */
- sa.sin.sin_family = family;
- @@ -207,3 +175,11 @@ out:
-
- return 0;
- }
- +
- +int __res_msend(int nqueries, const unsigned char *const *queries,
- + const int *qlens, unsigned char *const *answers, int *alens, int asize)
- +{
- + struct resolvconf conf;
- + if (__get_resolv_conf(&conf, 0, 0) < 0) return -1;
- + return __res_msend_rc(nqueries, queries, qlens, answers, alens, asize, &conf);
- +}
- --- /dev/null
- +++ b/src/network/resolvconf.c
- @@ -0,0 +1,93 @@
- +#include "lookup.h"
- +#include "stdio_impl.h"
- +#include <ctype.h>
- +#include <errno.h>
- +#include <string.h>
- +#include <netinet/in.h>
- +
- +int __get_resolv_conf(struct resolvconf *conf, char *search, size_t search_sz)
- +{
- + char line[256];
- + unsigned char _buf[256];
- + FILE *f, _f;
- + int nns = 0;
- +
- + conf->ndots = 1;
- + conf->timeout = 5;
- + conf->attempts = 2;
- + if (search) *search = 0;
- +
- + f = __fopen_rb_ca("/etc/resolv.conf", &_f, _buf, sizeof _buf);
- + if (!f) switch (errno) {
- + case ENOENT:
- + case ENOTDIR:
- + case EACCES:
- + goto no_resolv_conf;
- + default:
- + return -1;
- + }
- +
- + while (fgets(line, sizeof line, f)) {
- + char *p, *z;
- + if (!strchr(line, '\n') && !feof(f)) {
- + /* Ignore lines that get truncated rather than
- + * potentially misinterpreting them. */
- + int c;
- + do c = getc(f);
- + while (c != '\n' && c != EOF);
- + continue;
- + }
- + if (!strncmp(line, "options", 7) && isspace(line[7])) {
- + p = strstr(line, "ndots:");
- + if (p && isdigit(p[6])) {
- + p += 6;
- + unsigned long x = strtoul(p, &z, 10);
- + if (z != p) conf->ndots = x > 15 ? 15 : x;
- + }
- + p = strstr(line, "attempts:");
- + if (p && isdigit(p[6])) {
- + p += 6;
- + unsigned long x = strtoul(p, &z, 10);
- + if (z != p) conf->attempts = x > 10 ? 10 : x;
- + }
- + p = strstr(line, "timeout:");
- + if (p && (isdigit(p[8]) || p[8]=='.')) {
- + p += 8;
- + unsigned long x = strtoul(p, &z, 10);
- + if (z != p) conf->timeout = x > 60 ? 60 : x;
- + }
- + continue;
- + }
- + if (!strncmp(line, "nameserver", 10) && isspace(line[10])) {
- + if (nns >= MAXNS) continue;
- + for (p=line+11; isspace(*p); p++);
- + for (z=p; *z && !isspace(*z); z++);
- + *z=0;
- + if (__lookup_ipliteral(conf->ns+nns, p, AF_UNSPEC) > 0)
- + nns++;
- + continue;
- + }
- +
- + if (!search) continue;
- + if ((strncmp(line, "domain", 6) && strncmp(line, "search", 6))
- + || !isspace(line[6]))
- + continue;
- + for (p=line+7; isspace(*p); p++);
- + size_t l = strlen(p);
- + /* This can never happen anyway with chosen buffer sizes. */
- + if (l >= search_sz) continue;
- + memcpy(search, p, l+1);
- + }
- +
- + __fclose_ca(f);
- +
- +no_resolv_conf:
- + if (!nns) {
- + __lookup_ipliteral(conf->ns, "127.0.0.1", AF_UNSPEC);
- + nns = 1;
- + }
- +
- + conf->nns = nns;
- +
- + return 0;
- +}
- --- a/src/search/tsearch_avl.c
- +++ b/src/search/tsearch_avl.c
- @@ -77,38 +77,45 @@ static struct node *find(struct node *n,
- return find(n->right, k, cmp);
- }
-
- -static struct node *insert(struct node **n, const void *k,
- - int (*cmp)(const void *, const void *), int *new)
- +static struct node *insert(struct node *n, const void *k,
- + int (*cmp)(const void *, const void *), struct node **found)
- {
- - struct node *r = *n;
- + struct node *r;
- int c;
-
- - if (!r) {
- - *n = r = malloc(sizeof **n);
- - if (r) {
- - r->key = k;
- - r->left = r->right = 0;
- - r->height = 1;
- + if (!n) {
- + n = malloc(sizeof *n);
- + if (n) {
- + n->key = k;
- + n->left = n->right = 0;
- + n->height = 1;
- }
- - *new = 1;
- - return r;
- + *found = n;
- + return n;
- + }
- + c = cmp(k, n->key);
- + if (c == 0) {
- + *found = n;
- + return 0;
- + }
- + r = insert(c < 0 ? n->left : n->right, k, cmp, found);
- + if (r) {
- + if (c < 0)
- + n->left = r;
- + else
- + n->right = r;
- + r = balance(n);
- }
- - c = cmp(k, r->key);
- - if (c == 0)
- - return r;
- - if (c < 0)
- - r = insert(&r->left, k, cmp, new);
- - else
- - r = insert(&r->right, k, cmp, new);
- - if (*new)
- - *n = balance(*n);
- return r;
- }
-
- -static struct node *movr(struct node *n, struct node *r) {
- - if (!n)
- - return r;
- - n->right = movr(n->right, r);
- +static struct node *remove_rightmost(struct node *n, struct node **rightmost)
- +{
- + if (!n->right) {
- + *rightmost = n;
- + return n->left;
- + }
- + n->right = remove_rightmost(n->right, rightmost);
- return balance(n);
- }
-
- @@ -122,7 +129,13 @@ static struct node *remove(struct node *
- c = cmp(k, (*n)->key);
- if (c == 0) {
- struct node *r = *n;
- - *n = movr(r->left, r->right);
- + if (r->left) {
- + r->left = remove_rightmost(r->left, n);
- + (*n)->left = r->left;
- + (*n)->right = r->right;
- + *n = balance(*n);
- + } else
- + *n = r->right;
- free(r);
- return parent;
- }
- @@ -138,6 +151,8 @@ static struct node *remove(struct node *
- void *tdelete(const void *restrict key, void **restrict rootp,
- int(*compar)(const void *, const void *))
- {
- + if (!rootp)
- + return 0;
- struct node *n = *rootp;
- struct node *ret;
- /* last argument is arbitrary non-null pointer
- @@ -150,17 +165,21 @@ void *tdelete(const void *restrict key,
- void *tfind(const void *key, void *const *rootp,
- int(*compar)(const void *, const void *))
- {
- + if (!rootp)
- + return 0;
- return find(*rootp, key, compar);
- }
-
- void *tsearch(const void *key, void **rootp,
- int (*compar)(const void *, const void *))
- {
- - int new = 0;
- - struct node *n = *rootp;
- + struct node *update;
- struct node *ret;
- - ret = insert(&n, key, compar, &new);
- - *rootp = n;
- + if (!rootp)
- + return 0;
- + update = insert(*rootp, key, compar, &ret);
- + if (update)
- + *rootp = update;
- return ret;
- }
-
- --- a/src/setjmp/arm/longjmp.s
- +++ b/src/setjmp/arm/longjmp.s
- @@ -1,3 +1,4 @@
- +.syntax unified
- .global _longjmp
- .global longjmp
- .type _longjmp,%function
- @@ -20,7 +21,11 @@ longjmp:
- ldc p2, cr4, [ip], #48
- 2: tst r1,#0x40
- beq 2f
- - .word 0xecbc8b10 /* vldmia ip!, {d8-d15} */
- + .fpu vfp
- + vldmia ip!, {d8-d15}
- + .fpu softvfp
- + .eabi_attribute 10, 0
- + .eabi_attribute 27, 0
- 2: tst r1,#0x200
- beq 3f
- ldcl p1, cr10, [ip], #8
- @@ -29,9 +34,7 @@ longjmp:
- ldcl p1, cr13, [ip], #8
- ldcl p1, cr14, [ip], #8
- ldcl p1, cr15, [ip], #8
- -3: tst lr,#1
- - moveq pc,lr
- - bx lr
- +3: bx lr
-
- .hidden __hwcap
- 1: .word __hwcap-1b
- --- a/src/setjmp/arm/setjmp.s
- +++ b/src/setjmp/arm/setjmp.s
- @@ -1,3 +1,4 @@
- +.syntax unified
- .global __setjmp
- .global _setjmp
- .global setjmp
- @@ -22,7 +23,11 @@ setjmp:
- stc p2, cr4, [ip], #48
- 2: tst r1,#0x40
- beq 2f
- - .word 0xecac8b10 /* vstmia ip!, {d8-d15} */
- + .fpu vfp
- + vstmia ip!, {d8-d15}
- + .fpu softvfp
- + .eabi_attribute 10, 0
- + .eabi_attribute 27, 0
- 2: tst r1,#0x200
- beq 3f
- stcl p1, cr10, [ip], #8
- @@ -31,9 +36,7 @@ setjmp:
- stcl p1, cr13, [ip], #8
- stcl p1, cr14, [ip], #8
- stcl p1, cr15, [ip], #8
- -3: tst lr,#1
- - moveq pc,lr
- - bx lr
- +3: bx lr
-
- .hidden __hwcap
- 1: .word __hwcap-1b
- --- a/src/setjmp/mips-sf/longjmp.s
- +++ /dev/null
- @@ -1,25 +0,0 @@
- -.set noreorder
- -
- -.global _longjmp
- -.global longjmp
- -.type _longjmp,@function
- -.type longjmp,@function
- -_longjmp:
- -longjmp:
- - move $2, $5
- - bne $2, $0, 1f
- - nop
- - addu $2, $2, 1
- -1: lw $ra, 0($4)
- - lw $sp, 4($4)
- - lw $16, 8($4)
- - lw $17, 12($4)
- - lw $18, 16($4)
- - lw $19, 20($4)
- - lw $20, 24($4)
- - lw $21, 28($4)
- - lw $22, 32($4)
- - lw $23, 36($4)
- - lw $30, 40($4)
- - jr $ra
- - lw $28, 44($4)
- --- a/src/setjmp/mips-sf/longjmp.sub
- +++ /dev/null
- @@ -1 +0,0 @@
- -longjmp.s
- --- a/src/setjmp/mips-sf/setjmp.s
- +++ /dev/null
- @@ -1,25 +0,0 @@
- -.set noreorder
- -
- -.global __setjmp
- -.global _setjmp
- -.global setjmp
- -.type __setjmp,@function
- -.type _setjmp,@function
- -.type setjmp,@function
- -__setjmp:
- -_setjmp:
- -setjmp:
- - sw $ra, 0($4)
- - sw $sp, 4($4)
- - sw $16, 8($4)
- - sw $17, 12($4)
- - sw $18, 16($4)
- - sw $19, 20($4)
- - sw $20, 24($4)
- - sw $21, 28($4)
- - sw $22, 32($4)
- - sw $23, 36($4)
- - sw $30, 40($4)
- - sw $28, 44($4)
- - jr $ra
- - li $2, 0
- --- a/src/setjmp/mips-sf/setjmp.sub
- +++ /dev/null
- @@ -1 +0,0 @@
- -setjmp.s
- --- /dev/null
- +++ b/src/setjmp/mips/longjmp.S
- @@ -0,0 +1,40 @@
- +.set noreorder
- +
- +.global _longjmp
- +.global longjmp
- +.type _longjmp,@function
- +.type longjmp,@function
- +_longjmp:
- +longjmp:
- + move $2, $5
- + bne $2, $0, 1f
- + nop
- + addu $2, $2, 1
- +1:
- +#ifndef __mips_soft_float
- + lwc1 $20, 56($4)
- + lwc1 $21, 60($4)
- + lwc1 $22, 64($4)
- + lwc1 $23, 68($4)
- + lwc1 $24, 72($4)
- + lwc1 $25, 76($4)
- + lwc1 $26, 80($4)
- + lwc1 $27, 84($4)
- + lwc1 $28, 88($4)
- + lwc1 $29, 92($4)
- + lwc1 $30, 96($4)
- + lwc1 $31, 100($4)
- +#endif
- + lw $ra, 0($4)
- + lw $sp, 4($4)
- + lw $16, 8($4)
- + lw $17, 12($4)
- + lw $18, 16($4)
- + lw $19, 20($4)
- + lw $20, 24($4)
- + lw $21, 28($4)
- + lw $22, 32($4)
- + lw $23, 36($4)
- + lw $30, 40($4)
- + jr $ra
- + lw $28, 44($4)
- --- a/src/setjmp/mips/longjmp.s
- +++ /dev/null
- @@ -1,37 +0,0 @@
- -.set noreorder
- -
- -.global _longjmp
- -.global longjmp
- -.type _longjmp,@function
- -.type longjmp,@function
- -_longjmp:
- -longjmp:
- - move $2, $5
- - bne $2, $0, 1f
- - nop
- - addu $2, $2, 1
- -1: lwc1 $20, 56($4)
- - lwc1 $21, 60($4)
- - lwc1 $22, 64($4)
- - lwc1 $23, 68($4)
- - lwc1 $24, 72($4)
- - lwc1 $25, 76($4)
- - lwc1 $26, 80($4)
- - lwc1 $27, 84($4)
- - lwc1 $28, 88($4)
- - lwc1 $29, 92($4)
- - lwc1 $30, 96($4)
- - lwc1 $31, 100($4)
- - lw $ra, 0($4)
- - lw $sp, 4($4)
- - lw $16, 8($4)
- - lw $17, 12($4)
- - lw $18, 16($4)
- - lw $19, 20($4)
- - lw $20, 24($4)
- - lw $21, 28($4)
- - lw $22, 32($4)
- - lw $23, 36($4)
- - lw $30, 40($4)
- - jr $ra
- - lw $28, 44($4)
- --- /dev/null
- +++ b/src/setjmp/mips/setjmp.S
- @@ -0,0 +1,39 @@
- +.set noreorder
- +
- +.global __setjmp
- +.global _setjmp
- +.global setjmp
- +.type __setjmp,@function
- +.type _setjmp,@function
- +.type setjmp,@function
- +__setjmp:
- +_setjmp:
- +setjmp:
- + sw $ra, 0($4)
- + sw $sp, 4($4)
- + sw $16, 8($4)
- + sw $17, 12($4)
- + sw $18, 16($4)
- + sw $19, 20($4)
- + sw $20, 24($4)
- + sw $21, 28($4)
- + sw $22, 32($4)
- + sw $23, 36($4)
- + sw $30, 40($4)
- + sw $28, 44($4)
- +#ifndef __mips_soft_float
- + swc1 $20, 56($4)
- + swc1 $21, 60($4)
- + swc1 $22, 64($4)
- + swc1 $23, 68($4)
- + swc1 $24, 72($4)
- + swc1 $25, 76($4)
- + swc1 $26, 80($4)
- + swc1 $27, 84($4)
- + swc1 $28, 88($4)
- + swc1 $29, 92($4)
- + swc1 $30, 96($4)
- + swc1 $31, 100($4)
- +#endif
- + jr $ra
- + li $2, 0
- --- a/src/setjmp/mips/setjmp.s
- +++ /dev/null
- @@ -1,37 +0,0 @@
- -.set noreorder
- -
- -.global __setjmp
- -.global _setjmp
- -.global setjmp
- -.type __setjmp,@function
- -.type _setjmp,@function
- -.type setjmp,@function
- -__setjmp:
- -_setjmp:
- -setjmp:
- - sw $ra, 0($4)
- - sw $sp, 4($4)
- - sw $16, 8($4)
- - sw $17, 12($4)
- - sw $18, 16($4)
- - sw $19, 20($4)
- - sw $20, 24($4)
- - sw $21, 28($4)
- - sw $22, 32($4)
- - sw $23, 36($4)
- - sw $30, 40($4)
- - sw $28, 44($4)
- - swc1 $20, 56($4)
- - swc1 $21, 60($4)
- - swc1 $22, 64($4)
- - swc1 $23, 68($4)
- - swc1 $24, 72($4)
- - swc1 $25, 76($4)
- - swc1 $26, 80($4)
- - swc1 $27, 84($4)
- - swc1 $28, 88($4)
- - swc1 $29, 92($4)
- - swc1 $30, 96($4)
- - swc1 $31, 100($4)
- - jr $ra
- - li $2, 0
- --- a/src/setjmp/mipsel-sf/longjmp.sub
- +++ /dev/null
- @@ -1 +0,0 @@
- -../mips-sf/longjmp.s
- --- a/src/setjmp/mipsel-sf/setjmp.sub
- +++ /dev/null
- @@ -1 +0,0 @@
- -../mips-sf/setjmp.s
- --- a/src/setjmp/sh-nofpu/longjmp.s
- +++ /dev/null
- @@ -1,22 +0,0 @@
- -.global _longjmp
- -.global longjmp
- -.type _longjmp, @function
- -.type longjmp, @function
- -_longjmp:
- -longjmp:
- - mov.l @r4+, r8
- - mov.l @r4+, r9
- - mov.l @r4+, r10
- - mov.l @r4+, r11
- - mov.l @r4+, r12
- - mov.l @r4+, r13
- - mov.l @r4+, r14
- - mov.l @r4+, r15
- - lds.l @r4+, pr
- -
- - tst r5, r5
- - movt r0
- - add r5, r0
- -
- - rts
- - nop
- --- a/src/setjmp/sh-nofpu/longjmp.sub
- +++ /dev/null
- @@ -1 +0,0 @@
- -longjmp.s
- --- a/src/setjmp/sh-nofpu/setjmp.s
- +++ /dev/null
- @@ -1,24 +0,0 @@
- -.global ___setjmp
- -.hidden ___setjmp
- -.global __setjmp
- -.global _setjmp
- -.global setjmp
- -.type __setjmp, @function
- -.type _setjmp, @function
- -.type setjmp, @function
- -___setjmp:
- -__setjmp:
- -_setjmp:
- -setjmp:
- - add #36, r4
- - sts.l pr, @-r4
- - mov.l r15 @-r4
- - mov.l r14, @-r4
- - mov.l r13, @-r4
- - mov.l r12, @-r4
- - mov.l r11, @-r4
- - mov.l r10, @-r4
- - mov.l r9, @-r4
- - mov.l r8, @-r4
- - rts
- - mov #0, r0
- --- a/src/setjmp/sh-nofpu/setjmp.sub
- +++ /dev/null
- @@ -1 +0,0 @@
- -setjmp.s
- --- /dev/null
- +++ b/src/setjmp/sh/longjmp.S
- @@ -0,0 +1,28 @@
- +.global _longjmp
- +.global longjmp
- +.type _longjmp, @function
- +.type longjmp, @function
- +_longjmp:
- +longjmp:
- + mov.l @r4+, r8
- + mov.l @r4+, r9
- + mov.l @r4+, r10
- + mov.l @r4+, r11
- + mov.l @r4+, r12
- + mov.l @r4+, r13
- + mov.l @r4+, r14
- + mov.l @r4+, r15
- + lds.l @r4+, pr
- +#if __SH_FPU_ANY__ || __SH4__
- + fmov.s @r4+, fr12
- + fmov.s @r4+, fr13
- + fmov.s @r4+, fr14
- + fmov.s @r4+, fr15
- +#endif
- +
- + tst r5, r5
- + movt r0
- + add r5, r0
- +
- + rts
- + nop
- --- a/src/setjmp/sh/longjmp.s
- +++ /dev/null
- @@ -1,26 +0,0 @@
- -.global _longjmp
- -.global longjmp
- -.type _longjmp, @function
- -.type longjmp, @function
- -_longjmp:
- -longjmp:
- - mov.l @r4+, r8
- - mov.l @r4+, r9
- - mov.l @r4+, r10
- - mov.l @r4+, r11
- - mov.l @r4+, r12
- - mov.l @r4+, r13
- - mov.l @r4+, r14
- - mov.l @r4+, r15
- - lds.l @r4+, pr
- - fmov.s @r4+, fr12
- - fmov.s @r4+, fr13
- - fmov.s @r4+, fr14
- - fmov.s @r4+, fr15
- -
- - tst r5, r5
- - movt r0
- - add r5, r0
- -
- - rts
- - nop
- --- /dev/null
- +++ b/src/setjmp/sh/setjmp.S
- @@ -0,0 +1,32 @@
- +.global ___setjmp
- +.hidden ___setjmp
- +.global __setjmp
- +.global _setjmp
- +.global setjmp
- +.type __setjmp, @function
- +.type _setjmp, @function
- +.type setjmp, @function
- +___setjmp:
- +__setjmp:
- +_setjmp:
- +setjmp:
- +#if __SH_FPU_ANY__ || __SH4__
- + add #52, r4
- + fmov.s fr15, @-r4
- + fmov.s fr14, @-r4
- + fmov.s fr13, @-r4
- + fmov.s fr12, @-r4
- +#else
- + add #36, r4
- +#endif
- + sts.l pr, @-r4
- + mov.l r15, @-r4
- + mov.l r14, @-r4
- + mov.l r13, @-r4
- + mov.l r12, @-r4
- + mov.l r11, @-r4
- + mov.l r10, @-r4
- + mov.l r9, @-r4
- + mov.l r8, @-r4
- + rts
- + mov #0, r0
- --- a/src/setjmp/sh/setjmp.s
- +++ /dev/null
- @@ -1,28 +0,0 @@
- -.global ___setjmp
- -.hidden ___setjmp
- -.global __setjmp
- -.global _setjmp
- -.global setjmp
- -.type __setjmp, @function
- -.type _setjmp, @function
- -.type setjmp, @function
- -___setjmp:
- -__setjmp:
- -_setjmp:
- -setjmp:
- - add #52, r4
- - fmov.s fr15, @-r4
- - fmov.s fr14, @-r4
- - fmov.s fr13, @-r4
- - fmov.s fr12, @-r4
- - sts.l pr, @-r4
- - mov.l r15, @-r4
- - mov.l r14, @-r4
- - mov.l r13, @-r4
- - mov.l r12, @-r4
- - mov.l r11, @-r4
- - mov.l r10, @-r4
- - mov.l r9, @-r4
- - mov.l r8, @-r4
- - rts
- - mov #0, r0
- --- a/src/setjmp/sheb-nofpu/longjmp.sub
- +++ /dev/null
- @@ -1 +0,0 @@
- -../sh-nofpu/longjmp.s
- --- a/src/setjmp/sheb-nofpu/setjmp.sub
- +++ /dev/null
- @@ -1 +0,0 @@
- -../sh-nofpu/setjmp.s
- --- a/src/signal/arm/restore.s
- +++ b/src/signal/arm/restore.s
- @@ -1,3 +1,5 @@
- +.syntax unified
- +
- .global __restore
- .type __restore,%function
- __restore:
- --- a/src/signal/arm/sigsetjmp.s
- +++ b/src/signal/arm/sigsetjmp.s
- @@ -1,3 +1,4 @@
- +.syntax unified
- .global sigsetjmp
- .global __sigsetjmp
- .type sigsetjmp,%function
- --- a/src/signal/sigaction.c
- +++ b/src/signal/sigaction.c
- @@ -17,10 +17,6 @@ void __get_handler_set(sigset_t *set)
- int __libc_sigaction(int sig, const struct sigaction *restrict sa, struct sigaction *restrict old)
- {
- struct k_sigaction ksa, ksa_old;
- - if (sig >= (unsigned)_NSIG) {
- - errno = EINVAL;
- - return -1;
- - }
- if (sa) {
- if ((uintptr_t)sa->sa_handler > 1UL) {
- a_or_l(handler_set+(sig-1)/(8*sizeof(long)),
- @@ -57,7 +53,7 @@ int __libc_sigaction(int sig, const stru
-
- int __sigaction(int sig, const struct sigaction *restrict sa, struct sigaction *restrict old)
- {
- - if (sig-32U < 3) {
- + if (sig-32U < 3 || sig-1U >= _NSIG-1) {
- errno = EINVAL;
- return -1;
- }
- --- a/src/signal/sigsetjmp_tail.c
- +++ b/src/signal/sigsetjmp_tail.c
- @@ -2,9 +2,7 @@
- #include <signal.h>
- #include "syscall.h"
-
- -#ifdef SHARED
- __attribute__((__visibility__("hidden")))
- -#endif
- int __sigsetjmp_tail(sigjmp_buf jb, int ret)
- {
- void *p = jb->__ss;
- --- a/src/stdio/getdelim.c
- +++ b/src/stdio/getdelim.c
- @@ -27,17 +27,18 @@ ssize_t getdelim(char **restrict s, size
- for (;;) {
- z = memchr(f->rpos, delim, f->rend - f->rpos);
- k = z ? z - f->rpos + 1 : f->rend - f->rpos;
- - if (i+k >= *n) {
- + if (i+k+1 >= *n) {
- if (k >= SIZE_MAX/2-i) goto oom;
- - *n = i+k+2;
- - if (*n < SIZE_MAX/4) *n *= 2;
- - tmp = realloc(*s, *n);
- + size_t m = i+k+2;
- + if (!z && m < SIZE_MAX/4) m += m/2;
- + tmp = realloc(*s, m);
- if (!tmp) {
- - *n = i+k+2;
- - tmp = realloc(*s, *n);
- + m = i+k+2;
- + tmp = realloc(*s, m);
- if (!tmp) goto oom;
- }
- *s = tmp;
- + *n = m;
- }
- memcpy(*s+i, f->rpos, k);
- f->rpos += k;
- --- /dev/null
- +++ b/src/string/arm/__aeabi_memclr.c
- @@ -0,0 +1,9 @@
- +#include <string.h>
- +#include "libc.h"
- +
- +void __aeabi_memclr(void *dest, size_t n)
- +{
- + memset(dest, 0, n);
- +}
- +weak_alias(__aeabi_memclr, __aeabi_memclr4);
- +weak_alias(__aeabi_memclr, __aeabi_memclr8);
- --- /dev/null
- +++ b/src/string/arm/__aeabi_memcpy.c
- @@ -0,0 +1,9 @@
- +#include <string.h>
- +#include "libc.h"
- +
- +void __aeabi_memcpy(void *restrict dest, const void *restrict src, size_t n)
- +{
- + memcpy(dest, src, n);
- +}
- +weak_alias(__aeabi_memcpy, __aeabi_memcpy4);
- +weak_alias(__aeabi_memcpy, __aeabi_memcpy8);
- --- /dev/null
- +++ b/src/string/arm/__aeabi_memmove.c
- @@ -0,0 +1,9 @@
- +#include <string.h>
- +#include "libc.h"
- +
- +void __aeabi_memmove(void *dest, const void *src, size_t n)
- +{
- + memmove(dest, src, n);
- +}
- +weak_alias(__aeabi_memmove, __aeabi_memmove4);
- +weak_alias(__aeabi_memmove, __aeabi_memmove8);
- --- /dev/null
- +++ b/src/string/arm/__aeabi_memset.c
- @@ -0,0 +1,9 @@
- +#include <string.h>
- +#include "libc.h"
- +
- +void __aeabi_memset(void *dest, size_t n, int c)
- +{
- + memset(dest, c, n);
- +}
- +weak_alias(__aeabi_memset, __aeabi_memset4);
- +weak_alias(__aeabi_memset, __aeabi_memset8);
- --- /dev/null
- +++ b/src/string/arm/memcpy.c
- @@ -0,0 +1,3 @@
- +#if __ARMEB__
- +#include "../memcpy.c"
- +#endif
- --- /dev/null
- +++ b/src/string/arm/memcpy_le.S
- @@ -0,0 +1,383 @@
- +#ifndef __ARMEB__
- +
- +/*
- + * Copyright (C) 2008 The Android Open Source Project
- + * All rights reserved.
- + *
- + * Redistribution and use in source and binary forms, with or without
- + * modification, are permitted provided that the following conditions
- + * are met:
- + * * Redistributions of source code must retain the above copyright
- + * notice, this list of conditions and the following disclaimer.
- + * * Redistributions in binary form must reproduce the above copyright
- + * notice, this list of conditions and the following disclaimer in
- + * the documentation and/or other materials provided with the
- + * distribution.
- + *
- + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- + * SUCH DAMAGE.
- + */
- +
- +
- +/*
- + * Optimized memcpy() for ARM.
- + *
- + * note that memcpy() always returns the destination pointer,
- + * so we have to preserve R0.
- + */
- +
- +/*
- + * This file has been modified from the original for use in musl libc.
- + * The main changes are: addition of .type memcpy,%function to make the
- + * code safely callable from thumb mode, adjusting the return
- + * instructions to be compatible with pre-thumb ARM cpus, and removal
- + * of prefetch code that is not compatible with older cpus.
- + */
- +
- +.syntax unified
- +
- +.global memcpy
- +.type memcpy,%function
- +memcpy:
- + /* The stack must always be 64-bits aligned to be compliant with the
- + * ARM ABI. Since we have to save R0, we might as well save R4
- + * which we can use for better pipelining of the reads below
- + */
- + .fnstart
- + .save {r0, r4, lr}
- + stmfd sp!, {r0, r4, lr}
- + /* Making room for r5-r11 which will be spilled later */
- + .pad #28
- + sub sp, sp, #28
- +
- + /* it simplifies things to take care of len<4 early */
- + cmp r2, #4
- + blo copy_last_3_and_return
- +
- + /* compute the offset to align the source
- + * offset = (4-(src&3))&3 = -src & 3
- + */
- + rsb r3, r1, #0
- + ands r3, r3, #3
- + beq src_aligned
- +
- + /* align source to 32 bits. We need to insert 2 instructions between
- + * a ldr[b|h] and str[b|h] because byte and half-word instructions
- + * stall 2 cycles.
- + */
- + movs r12, r3, lsl #31
- + sub r2, r2, r3 /* we know that r3 <= r2 because r2 >= 4 */
- + ldrbmi r3, [r1], #1
- + ldrbcs r4, [r1], #1
- + ldrbcs r12,[r1], #1
- + strbmi r3, [r0], #1
- + strbcs r4, [r0], #1
- + strbcs r12,[r0], #1
- +
- +src_aligned:
- +
- + /* see if src and dst are aligned together (congruent) */
- + eor r12, r0, r1
- + tst r12, #3
- + bne non_congruent
- +
- + /* Use post-incriment mode for stm to spill r5-r11 to reserved stack
- + * frame. Don't update sp.
- + */
- + stmea sp, {r5-r11}
- +
- + /* align the destination to a cache-line */
- + rsb r3, r0, #0
- + ands r3, r3, #0x1C
- + beq congruent_aligned32
- + cmp r3, r2
- + andhi r3, r2, #0x1C
- +
- + /* conditionnaly copies 0 to 7 words (length in r3) */
- + movs r12, r3, lsl #28
- + ldmcs r1!, {r4, r5, r6, r7} /* 16 bytes */
- + ldmmi r1!, {r8, r9} /* 8 bytes */
- + stmcs r0!, {r4, r5, r6, r7}
- + stmmi r0!, {r8, r9}
- + tst r3, #0x4
- + ldrne r10,[r1], #4 /* 4 bytes */
- + strne r10,[r0], #4
- + sub r2, r2, r3
- +
- +congruent_aligned32:
- + /*
- + * here source is aligned to 32 bytes.
- + */
- +
- +cached_aligned32:
- + subs r2, r2, #32
- + blo less_than_32_left
- +
- + /*
- + * We preload a cache-line up to 64 bytes ahead. On the 926, this will
- + * stall only until the requested world is fetched, but the linefill
- + * continues in the the background.
- + * While the linefill is going, we write our previous cache-line
- + * into the write-buffer (which should have some free space).
- + * When the linefill is done, the writebuffer will
- + * start dumping its content into memory
- + *
- + * While all this is going, we then load a full cache line into
- + * 8 registers, this cache line should be in the cache by now
- + * (or partly in the cache).
- + *
- + * This code should work well regardless of the source/dest alignment.
- + *
- + */
- +
- + /* Align the preload register to a cache-line because the cpu does
- + * "critical word first" (the first word requested is loaded first).
- + */
- + @ bic r12, r1, #0x1F
- + @ add r12, r12, #64
- +
- +1: ldmia r1!, { r4-r11 }
- + subs r2, r2, #32
- +
- + /*
- + * NOTE: if r12 is more than 64 ahead of r1, the following ldrhi
- + * for ARM9 preload will not be safely guarded by the preceding subs.
- + * When it is safely guarded the only possibility to have SIGSEGV here
- + * is because the caller overstates the length.
- + */
- + @ ldrhi r3, [r12], #32 /* cheap ARM9 preload */
- + stmia r0!, { r4-r11 }
- + bhs 1b
- +
- + add r2, r2, #32
- +
- +less_than_32_left:
- + /*
- + * less than 32 bytes left at this point (length in r2)
- + */
- +
- + /* skip all this if there is nothing to do, which should
- + * be a common case (if not executed the code below takes
- + * about 16 cycles)
- + */
- + tst r2, #0x1F
- + beq 1f
- +
- + /* conditionnaly copies 0 to 31 bytes */
- + movs r12, r2, lsl #28
- + ldmcs r1!, {r4, r5, r6, r7} /* 16 bytes */
- + ldmmi r1!, {r8, r9} /* 8 bytes */
- + stmcs r0!, {r4, r5, r6, r7}
- + stmmi r0!, {r8, r9}
- + movs r12, r2, lsl #30
- + ldrcs r3, [r1], #4 /* 4 bytes */
- + ldrhmi r4, [r1], #2 /* 2 bytes */
- + strcs r3, [r0], #4
- + strhmi r4, [r0], #2
- + tst r2, #0x1
- + ldrbne r3, [r1] /* last byte */
- + strbne r3, [r0]
- +
- + /* we're done! restore everything and return */
- +1: ldmfd sp!, {r5-r11}
- + ldmfd sp!, {r0, r4, lr}
- + bx lr
- +
- + /********************************************************************/
- +
- +non_congruent:
- + /*
- + * here source is aligned to 4 bytes
- + * but destination is not.
- + *
- + * in the code below r2 is the number of bytes read
- + * (the number of bytes written is always smaller, because we have
- + * partial words in the shift queue)
- + */
- + cmp r2, #4
- + blo copy_last_3_and_return
- +
- + /* Use post-incriment mode for stm to spill r5-r11 to reserved stack
- + * frame. Don't update sp.
- + */
- + stmea sp, {r5-r11}
- +
- + /* compute shifts needed to align src to dest */
- + rsb r5, r0, #0
- + and r5, r5, #3 /* r5 = # bytes in partial words */
- + mov r12, r5, lsl #3 /* r12 = right */
- + rsb lr, r12, #32 /* lr = left */
- +
- + /* read the first word */
- + ldr r3, [r1], #4
- + sub r2, r2, #4
- +
- + /* write a partial word (0 to 3 bytes), such that destination
- + * becomes aligned to 32 bits (r5 = nb of words to copy for alignment)
- + */
- + movs r5, r5, lsl #31
- + strbmi r3, [r0], #1
- + movmi r3, r3, lsr #8
- + strbcs r3, [r0], #1
- + movcs r3, r3, lsr #8
- + strbcs r3, [r0], #1
- + movcs r3, r3, lsr #8
- +
- + cmp r2, #4
- + blo partial_word_tail
- +
- + /* Align destination to 32 bytes (cache line boundary) */
- +1: tst r0, #0x1c
- + beq 2f
- + ldr r5, [r1], #4
- + sub r2, r2, #4
- + orr r4, r3, r5, lsl lr
- + mov r3, r5, lsr r12
- + str r4, [r0], #4
- + cmp r2, #4
- + bhs 1b
- + blo partial_word_tail
- +
- + /* copy 32 bytes at a time */
- +2: subs r2, r2, #32
- + blo less_than_thirtytwo
- +
- + /* Use immediate mode for the shifts, because there is an extra cycle
- + * for register shifts, which could account for up to 50% of
- + * performance hit.
- + */
- +
- + cmp r12, #24
- + beq loop24
- + cmp r12, #8
- + beq loop8
- +
- +loop16:
- + ldr r12, [r1], #4
- +1: mov r4, r12
- + ldmia r1!, { r5,r6,r7, r8,r9,r10,r11}
- + subs r2, r2, #32
- + ldrhs r12, [r1], #4
- + orr r3, r3, r4, lsl #16
- + mov r4, r4, lsr #16
- + orr r4, r4, r5, lsl #16
- + mov r5, r5, lsr #16
- + orr r5, r5, r6, lsl #16
- + mov r6, r6, lsr #16
- + orr r6, r6, r7, lsl #16
- + mov r7, r7, lsr #16
- + orr r7, r7, r8, lsl #16
- + mov r8, r8, lsr #16
- + orr r8, r8, r9, lsl #16
- + mov r9, r9, lsr #16
- + orr r9, r9, r10, lsl #16
- + mov r10, r10, lsr #16
- + orr r10, r10, r11, lsl #16
- + stmia r0!, {r3,r4,r5,r6, r7,r8,r9,r10}
- + mov r3, r11, lsr #16
- + bhs 1b
- + b less_than_thirtytwo
- +
- +loop8:
- + ldr r12, [r1], #4
- +1: mov r4, r12
- + ldmia r1!, { r5,r6,r7, r8,r9,r10,r11}
- + subs r2, r2, #32
- + ldrhs r12, [r1], #4
- + orr r3, r3, r4, lsl #24
- + mov r4, r4, lsr #8
- + orr r4, r4, r5, lsl #24
- + mov r5, r5, lsr #8
- + orr r5, r5, r6, lsl #24
- + mov r6, r6, lsr #8
- + orr r6, r6, r7, lsl #24
- + mov r7, r7, lsr #8
- + orr r7, r7, r8, lsl #24
- + mov r8, r8, lsr #8
- + orr r8, r8, r9, lsl #24
- + mov r9, r9, lsr #8
- + orr r9, r9, r10, lsl #24
- + mov r10, r10, lsr #8
- + orr r10, r10, r11, lsl #24
- + stmia r0!, {r3,r4,r5,r6, r7,r8,r9,r10}
- + mov r3, r11, lsr #8
- + bhs 1b
- + b less_than_thirtytwo
- +
- +loop24:
- + ldr r12, [r1], #4
- +1: mov r4, r12
- + ldmia r1!, { r5,r6,r7, r8,r9,r10,r11}
- + subs r2, r2, #32
- + ldrhs r12, [r1], #4
- + orr r3, r3, r4, lsl #8
- + mov r4, r4, lsr #24
- + orr r4, r4, r5, lsl #8
- + mov r5, r5, lsr #24
- + orr r5, r5, r6, lsl #8
- + mov r6, r6, lsr #24
- + orr r6, r6, r7, lsl #8
- + mov r7, r7, lsr #24
- + orr r7, r7, r8, lsl #8
- + mov r8, r8, lsr #24
- + orr r8, r8, r9, lsl #8
- + mov r9, r9, lsr #24
- + orr r9, r9, r10, lsl #8
- + mov r10, r10, lsr #24
- + orr r10, r10, r11, lsl #8
- + stmia r0!, {r3,r4,r5,r6, r7,r8,r9,r10}
- + mov r3, r11, lsr #24
- + bhs 1b
- +
- +less_than_thirtytwo:
- + /* copy the last 0 to 31 bytes of the source */
- + rsb r12, lr, #32 /* we corrupted r12, recompute it */
- + add r2, r2, #32
- + cmp r2, #4
- + blo partial_word_tail
- +
- +1: ldr r5, [r1], #4
- + sub r2, r2, #4
- + orr r4, r3, r5, lsl lr
- + mov r3, r5, lsr r12
- + str r4, [r0], #4
- + cmp r2, #4
- + bhs 1b
- +
- +partial_word_tail:
- + /* we have a partial word in the input buffer */
- + movs r5, lr, lsl #(31-3)
- + strbmi r3, [r0], #1
- + movmi r3, r3, lsr #8
- + strbcs r3, [r0], #1
- + movcs r3, r3, lsr #8
- + strbcs r3, [r0], #1
- +
- + /* Refill spilled registers from the stack. Don't update sp. */
- + ldmfd sp, {r5-r11}
- +
- +copy_last_3_and_return:
- + movs r2, r2, lsl #31 /* copy remaining 0, 1, 2 or 3 bytes */
- + ldrbmi r2, [r1], #1
- + ldrbcs r3, [r1], #1
- + ldrbcs r12,[r1]
- + strbmi r2, [r0], #1
- + strbcs r3, [r0], #1
- + strbcs r12,[r0]
- +
- + /* we're done! restore sp and spilled registers and return */
- + add sp, sp, #28
- + ldmfd sp!, {r0, r4, lr}
- + bx lr
- +
- +#endif
- --- a/src/string/armel/memcpy.s
- +++ /dev/null
- @@ -1,381 +0,0 @@
- -/*
- - * Copyright (C) 2008 The Android Open Source Project
- - * All rights reserved.
- - *
- - * Redistribution and use in source and binary forms, with or without
- - * modification, are permitted provided that the following conditions
- - * are met:
- - * * Redistributions of source code must retain the above copyright
- - * notice, this list of conditions and the following disclaimer.
- - * * Redistributions in binary form must reproduce the above copyright
- - * notice, this list of conditions and the following disclaimer in
- - * the documentation and/or other materials provided with the
- - * distribution.
- - *
- - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- - * SUCH DAMAGE.
- - */
- -
- -
- -/*
- - * Optimized memcpy() for ARM.
- - *
- - * note that memcpy() always returns the destination pointer,
- - * so we have to preserve R0.
- - */
- -
- -/*
- - * This file has been modified from the original for use in musl libc.
- - * The main changes are: addition of .type memcpy,%function to make the
- - * code safely callable from thumb mode, adjusting the return
- - * instructions to be compatible with pre-thumb ARM cpus, and removal
- - * of prefetch code that is not compatible with older cpus.
- - */
- -
- -.global memcpy
- -.type memcpy,%function
- -memcpy:
- - /* The stack must always be 64-bits aligned to be compliant with the
- - * ARM ABI. Since we have to save R0, we might as well save R4
- - * which we can use for better pipelining of the reads below
- - */
- - .fnstart
- - .save {r0, r4, lr}
- - stmfd sp!, {r0, r4, lr}
- - /* Making room for r5-r11 which will be spilled later */
- - .pad #28
- - sub sp, sp, #28
- -
- - /* it simplifies things to take care of len<4 early */
- - cmp r2, #4
- - blo copy_last_3_and_return
- -
- - /* compute the offset to align the source
- - * offset = (4-(src&3))&3 = -src & 3
- - */
- - rsb r3, r1, #0
- - ands r3, r3, #3
- - beq src_aligned
- -
- - /* align source to 32 bits. We need to insert 2 instructions between
- - * a ldr[b|h] and str[b|h] because byte and half-word instructions
- - * stall 2 cycles.
- - */
- - movs r12, r3, lsl #31
- - sub r2, r2, r3 /* we know that r3 <= r2 because r2 >= 4 */
- - .word 0x44d13001 /* ldrbmi r3, [r1], #1 */
- - .word 0x24d14001 /* ldrbcs r4, [r1], #1 */
- - .word 0x24d1c001 /* ldrbcs r12,[r1], #1 */
- - .word 0x44c03001 /* strbmi r3, [r0], #1 */
- - .word 0x24c04001 /* strbcs r4, [r0], #1 */
- - .word 0x24c0c001 /* strbcs r12,[r0], #1 */
- -
- -src_aligned:
- -
- - /* see if src and dst are aligned together (congruent) */
- - eor r12, r0, r1
- - tst r12, #3
- - bne non_congruent
- -
- - /* Use post-incriment mode for stm to spill r5-r11 to reserved stack
- - * frame. Don't update sp.
- - */
- - stmea sp, {r5-r11}
- -
- - /* align the destination to a cache-line */
- - rsb r3, r0, #0
- - ands r3, r3, #0x1C
- - beq congruent_aligned32
- - cmp r3, r2
- - andhi r3, r2, #0x1C
- -
- - /* conditionnaly copies 0 to 7 words (length in r3) */
- - movs r12, r3, lsl #28
- - ldmcs r1!, {r4, r5, r6, r7} /* 16 bytes */
- - ldmmi r1!, {r8, r9} /* 8 bytes */
- - stmcs r0!, {r4, r5, r6, r7}
- - stmmi r0!, {r8, r9}
- - tst r3, #0x4
- - ldrne r10,[r1], #4 /* 4 bytes */
- - strne r10,[r0], #4
- - sub r2, r2, r3
- -
- -congruent_aligned32:
- - /*
- - * here source is aligned to 32 bytes.
- - */
- -
- -cached_aligned32:
- - subs r2, r2, #32
- - blo less_than_32_left
- -
- - /*
- - * We preload a cache-line up to 64 bytes ahead. On the 926, this will
- - * stall only until the requested world is fetched, but the linefill
- - * continues in the the background.
- - * While the linefill is going, we write our previous cache-line
- - * into the write-buffer (which should have some free space).
- - * When the linefill is done, the writebuffer will
- - * start dumping its content into memory
- - *
- - * While all this is going, we then load a full cache line into
- - * 8 registers, this cache line should be in the cache by now
- - * (or partly in the cache).
- - *
- - * This code should work well regardless of the source/dest alignment.
- - *
- - */
- -
- - /* Align the preload register to a cache-line because the cpu does
- - * "critical word first" (the first word requested is loaded first).
- - */
- - @ bic r12, r1, #0x1F
- - @ add r12, r12, #64
- -
- -1: ldmia r1!, { r4-r11 }
- - subs r2, r2, #32
- -
- - /*
- - * NOTE: if r12 is more than 64 ahead of r1, the following ldrhi
- - * for ARM9 preload will not be safely guarded by the preceding subs.
- - * When it is safely guarded the only possibility to have SIGSEGV here
- - * is because the caller overstates the length.
- - */
- - @ ldrhi r3, [r12], #32 /* cheap ARM9 preload */
- - stmia r0!, { r4-r11 }
- - bhs 1b
- -
- - add r2, r2, #32
- -
- -less_than_32_left:
- - /*
- - * less than 32 bytes left at this point (length in r2)
- - */
- -
- - /* skip all this if there is nothing to do, which should
- - * be a common case (if not executed the code below takes
- - * about 16 cycles)
- - */
- - tst r2, #0x1F
- - beq 1f
- -
- - /* conditionnaly copies 0 to 31 bytes */
- - movs r12, r2, lsl #28
- - ldmcs r1!, {r4, r5, r6, r7} /* 16 bytes */
- - ldmmi r1!, {r8, r9} /* 8 bytes */
- - stmcs r0!, {r4, r5, r6, r7}
- - stmmi r0!, {r8, r9}
- - movs r12, r2, lsl #30
- - ldrcs r3, [r1], #4 /* 4 bytes */
- - .word 0x40d140b2 /* ldrhmi r4, [r1], #2 */ /* 2 bytes */
- - strcs r3, [r0], #4
- - .word 0x40c040b2 /* strhmi r4, [r0], #2 */
- - tst r2, #0x1
- - .word 0x15d13000 /* ldrbne r3, [r1] */ /* last byte */
- - .word 0x15c03000 /* strbne r3, [r0] */
- -
- - /* we're done! restore everything and return */
- -1: ldmfd sp!, {r5-r11}
- - ldmfd sp!, {r0, r4, lr}
- - tst lr, #1
- - moveq pc, lr
- - bx lr
- -
- - /********************************************************************/
- -
- -non_congruent:
- - /*
- - * here source is aligned to 4 bytes
- - * but destination is not.
- - *
- - * in the code below r2 is the number of bytes read
- - * (the number of bytes written is always smaller, because we have
- - * partial words in the shift queue)
- - */
- - cmp r2, #4
- - blo copy_last_3_and_return
- -
- - /* Use post-incriment mode for stm to spill r5-r11 to reserved stack
- - * frame. Don't update sp.
- - */
- - stmea sp, {r5-r11}
- -
- - /* compute shifts needed to align src to dest */
- - rsb r5, r0, #0
- - and r5, r5, #3 /* r5 = # bytes in partial words */
- - mov r12, r5, lsl #3 /* r12 = right */
- - rsb lr, r12, #32 /* lr = left */
- -
- - /* read the first word */
- - ldr r3, [r1], #4
- - sub r2, r2, #4
- -
- - /* write a partial word (0 to 3 bytes), such that destination
- - * becomes aligned to 32 bits (r5 = nb of words to copy for alignment)
- - */
- - movs r5, r5, lsl #31
- - .word 0x44c03001 /* strbmi r3, [r0], #1 */
- - movmi r3, r3, lsr #8
- - .word 0x24c03001 /* strbcs r3, [r0], #1 */
- - movcs r3, r3, lsr #8
- - .word 0x24c03001 /* strbcs r3, [r0], #1 */
- - movcs r3, r3, lsr #8
- -
- - cmp r2, #4
- - blo partial_word_tail
- -
- - /* Align destination to 32 bytes (cache line boundary) */
- -1: tst r0, #0x1c
- - beq 2f
- - ldr r5, [r1], #4
- - sub r2, r2, #4
- - orr r4, r3, r5, lsl lr
- - mov r3, r5, lsr r12
- - str r4, [r0], #4
- - cmp r2, #4
- - bhs 1b
- - blo partial_word_tail
- -
- - /* copy 32 bytes at a time */
- -2: subs r2, r2, #32
- - blo less_than_thirtytwo
- -
- - /* Use immediate mode for the shifts, because there is an extra cycle
- - * for register shifts, which could account for up to 50% of
- - * performance hit.
- - */
- -
- - cmp r12, #24
- - beq loop24
- - cmp r12, #8
- - beq loop8
- -
- -loop16:
- - ldr r12, [r1], #4
- -1: mov r4, r12
- - ldmia r1!, { r5,r6,r7, r8,r9,r10,r11}
- - subs r2, r2, #32
- - ldrhs r12, [r1], #4
- - orr r3, r3, r4, lsl #16
- - mov r4, r4, lsr #16
- - orr r4, r4, r5, lsl #16
- - mov r5, r5, lsr #16
- - orr r5, r5, r6, lsl #16
- - mov r6, r6, lsr #16
- - orr r6, r6, r7, lsl #16
- - mov r7, r7, lsr #16
- - orr r7, r7, r8, lsl #16
- - mov r8, r8, lsr #16
- - orr r8, r8, r9, lsl #16
- - mov r9, r9, lsr #16
- - orr r9, r9, r10, lsl #16
- - mov r10, r10, lsr #16
- - orr r10, r10, r11, lsl #16
- - stmia r0!, {r3,r4,r5,r6, r7,r8,r9,r10}
- - mov r3, r11, lsr #16
- - bhs 1b
- - b less_than_thirtytwo
- -
- -loop8:
- - ldr r12, [r1], #4
- -1: mov r4, r12
- - ldmia r1!, { r5,r6,r7, r8,r9,r10,r11}
- - subs r2, r2, #32
- - ldrhs r12, [r1], #4
- - orr r3, r3, r4, lsl #24
- - mov r4, r4, lsr #8
- - orr r4, r4, r5, lsl #24
- - mov r5, r5, lsr #8
- - orr r5, r5, r6, lsl #24
- - mov r6, r6, lsr #8
- - orr r6, r6, r7, lsl #24
- - mov r7, r7, lsr #8
- - orr r7, r7, r8, lsl #24
- - mov r8, r8, lsr #8
- - orr r8, r8, r9, lsl #24
- - mov r9, r9, lsr #8
- - orr r9, r9, r10, lsl #24
- - mov r10, r10, lsr #8
- - orr r10, r10, r11, lsl #24
- - stmia r0!, {r3,r4,r5,r6, r7,r8,r9,r10}
- - mov r3, r11, lsr #8
- - bhs 1b
- - b less_than_thirtytwo
- -
- -loop24:
- - ldr r12, [r1], #4
- -1: mov r4, r12
- - ldmia r1!, { r5,r6,r7, r8,r9,r10,r11}
- - subs r2, r2, #32
- - ldrhs r12, [r1], #4
- - orr r3, r3, r4, lsl #8
- - mov r4, r4, lsr #24
- - orr r4, r4, r5, lsl #8
- - mov r5, r5, lsr #24
- - orr r5, r5, r6, lsl #8
- - mov r6, r6, lsr #24
- - orr r6, r6, r7, lsl #8
- - mov r7, r7, lsr #24
- - orr r7, r7, r8, lsl #8
- - mov r8, r8, lsr #24
- - orr r8, r8, r9, lsl #8
- - mov r9, r9, lsr #24
- - orr r9, r9, r10, lsl #8
- - mov r10, r10, lsr #24
- - orr r10, r10, r11, lsl #8
- - stmia r0!, {r3,r4,r5,r6, r7,r8,r9,r10}
- - mov r3, r11, lsr #24
- - bhs 1b
- -
- -less_than_thirtytwo:
- - /* copy the last 0 to 31 bytes of the source */
- - rsb r12, lr, #32 /* we corrupted r12, recompute it */
- - add r2, r2, #32
- - cmp r2, #4
- - blo partial_word_tail
- -
- -1: ldr r5, [r1], #4
- - sub r2, r2, #4
- - orr r4, r3, r5, lsl lr
- - mov r3, r5, lsr r12
- - str r4, [r0], #4
- - cmp r2, #4
- - bhs 1b
- -
- -partial_word_tail:
- - /* we have a partial word in the input buffer */
- - movs r5, lr, lsl #(31-3)
- - .word 0x44c03001 /* strbmi r3, [r0], #1 */
- - movmi r3, r3, lsr #8
- - .word 0x24c03001 /* strbcs r3, [r0], #1 */
- - movcs r3, r3, lsr #8
- - .word 0x24c03001 /* strbcs r3, [r0], #1 */
- -
- - /* Refill spilled registers from the stack. Don't update sp. */
- - ldmfd sp, {r5-r11}
- -
- -copy_last_3_and_return:
- - movs r2, r2, lsl #31 /* copy remaining 0, 1, 2 or 3 bytes */
- - .word 0x44d12001 /* ldrbmi r2, [r1], #1 */
- - .word 0x24d13001 /* ldrbcs r3, [r1], #1 */
- - .word 0x25d1c000 /* ldrbcs r12,[r1] */
- - .word 0x44c02001 /* strbmi r2, [r0], #1 */
- - .word 0x24c03001 /* strbcs r3, [r0], #1 */
- - .word 0x25c0c000 /* strbcs r12,[r0] */
- -
- - /* we're done! restore sp and spilled registers and return */
- - add sp, sp, #28
- - ldmfd sp!, {r0, r4, lr}
- - tst lr, #1
- - moveq pc, lr
- - bx lr
- --- a/src/string/armel/memcpy.sub
- +++ /dev/null
- @@ -1 +0,0 @@
- -memcpy.s
- --- a/src/string/armhf/memcpy.sub
- +++ /dev/null
- @@ -1 +0,0 @@
- -../armel/memcpy.s
- --- a/src/thread/__syscall_cp.c
- +++ b/src/thread/__syscall_cp.c
- @@ -1,9 +1,7 @@
- #include "pthread_impl.h"
- #include "syscall.h"
-
- -#ifdef SHARED
- __attribute__((__visibility__("hidden")))
- -#endif
- long __syscall_cp_c();
-
- static long sccp(syscall_arg_t nr,
- --- a/src/thread/__tls_get_addr.c
- +++ b/src/thread/__tls_get_addr.c
- @@ -1,16 +1,16 @@
- #include <stddef.h>
- #include "pthread_impl.h"
- +#include "libc.h"
- +
- +__attribute__((__visibility__("hidden")))
- +void *__tls_get_new(size_t *);
-
- void *__tls_get_addr(size_t *v)
- {
- pthread_t self = __pthread_self();
- -#ifdef SHARED
- - __attribute__((__visibility__("hidden")))
- - void *__tls_get_new(size_t *);
- if (v[0]<=(size_t)self->dtv[0])
- return (char *)self->dtv[v[0]]+v[1]+DTP_OFFSET;
- return __tls_get_new(v);
- -#else
- - return (char *)self->dtv[1]+v[1]+DTP_OFFSET;
- -#endif
- }
- +
- +weak_alias(__tls_get_addr, __tls_get_new);
- --- a/src/thread/aarch64/syscall_cp.s
- +++ b/src/thread/aarch64/syscall_cp.s
- @@ -17,7 +17,7 @@
- __syscall_cp_asm:
- __cp_begin:
- ldr w0,[x0]
- - cbnz w0,1f
- + cbnz w0,__cp_cancel
- mov x8,x1
- mov x0,x2
- mov x1,x3
- @@ -28,6 +28,5 @@ __cp_begin:
- svc 0
- __cp_end:
- ret
- -
- - // cbnz might not be able to jump far enough
- -1: b __cancel
- +__cp_cancel:
- + b __cancel
- --- /dev/null
- +++ b/src/thread/arm/__set_thread_area.c
- @@ -0,0 +1,49 @@
- +#include <stdint.h>
- +#include <elf.h>
- +#include "pthread_impl.h"
- +#include "libc.h"
- +
- +#define HWCAP_TLS (1 << 15)
- +
- +extern const unsigned char __attribute__((__visibility__("hidden")))
- + __a_barrier_dummy[], __a_barrier_oldkuser[],
- + __a_barrier_v6[], __a_barrier_v7[],
- + __a_cas_dummy[], __a_cas_v6[], __a_cas_v7[],
- + __a_gettp_dummy[];
- +
- +#define __a_barrier_kuser 0xffff0fa0
- +#define __a_cas_kuser 0xffff0fc0
- +#define __a_gettp_kuser 0xffff0fe0
- +
- +extern uintptr_t __attribute__((__visibility__("hidden")))
- + __a_barrier_ptr, __a_cas_ptr, __a_gettp_ptr;
- +
- +#define SET(op,ver) (__a_##op##_ptr = \
- + (uintptr_t)__a_##op##_##ver - (uintptr_t)__a_##op##_dummy)
- +
- +int __set_thread_area(void *p)
- +{
- +#if !__ARM_ARCH_7A__ && !__ARM_ARCH_7R__ && __ARM_ARCH < 7
- + if (__hwcap & HWCAP_TLS) {
- + size_t *aux;
- + SET(cas, v7);
- + SET(barrier, v7);
- + for (aux=libc.auxv; *aux; aux+=2) {
- + if (*aux != AT_PLATFORM) continue;
- + const char *s = (void *)aux[1];
- + if (s[0]!='v' || s[1]!='6' || s[2]-'0'<10u) break;
- + SET(cas, v6);
- + SET(barrier, v6);
- + break;
- + }
- + } else {
- + int ver = *(int *)0xffff0ffc;
- + SET(gettp, kuser);
- + SET(cas, kuser);
- + SET(barrier, kuser);
- + if (ver < 2) a_crash();
- + if (ver < 3) SET(barrier, oldkuser);
- + }
- +#endif
- + return __syscall(0xf0005, p);
- +}
- --- a/src/thread/arm/__set_thread_area.s
- +++ /dev/null
- @@ -1 +0,0 @@
- -/* Replaced by C code in arch/arm/src */
- --- a/src/thread/arm/__unmapself.s
- +++ b/src/thread/arm/__unmapself.s
- @@ -1,3 +1,4 @@
- +.syntax unified
- .text
- .global __unmapself
- .type __unmapself,%function
- --- /dev/null
- +++ b/src/thread/arm/atomics.s
- @@ -0,0 +1,113 @@
- +.syntax unified
- +.text
- +
- +.global __a_barrier
- +.hidden __a_barrier
- +.type __a_barrier,%function
- +__a_barrier:
- + ldr ip,1f
- + ldr ip,[pc,ip]
- + add pc,pc,ip
- +1: .word __a_barrier_ptr-1b
- +.global __a_barrier_dummy
- +.hidden __a_barrier_dummy
- +__a_barrier_dummy:
- + bx lr
- +.global __a_barrier_oldkuser
- +.hidden __a_barrier_oldkuser
- +__a_barrier_oldkuser:
- + push {r0,r1,r2,r3,ip,lr}
- + mov r1,r0
- + mov r2,sp
- + ldr ip,=0xffff0fc0
- + mov lr,pc
- + mov pc,ip
- + pop {r0,r1,r2,r3,ip,lr}
- + bx lr
- +.global __a_barrier_v6
- +.hidden __a_barrier_v6
- +__a_barrier_v6:
- + mcr p15,0,r0,c7,c10,5
- + bx lr
- +.global __a_barrier_v7
- +.hidden __a_barrier_v7
- +__a_barrier_v7:
- + .word 0xf57ff05b /* dmb ish */
- + bx lr
- +
- +.global __a_cas
- +.hidden __a_cas
- +.type __a_cas,%function
- +__a_cas:
- + ldr ip,1f
- + ldr ip,[pc,ip]
- + add pc,pc,ip
- +1: .word __a_cas_ptr-1b
- +.global __a_cas_dummy
- +.hidden __a_cas_dummy
- +__a_cas_dummy:
- + mov r3,r0
- + ldr r0,[r2]
- + subs r0,r3,r0
- + streq r1,[r2]
- + bx lr
- +.global __a_cas_v6
- +.hidden __a_cas_v6
- +__a_cas_v6:
- + mov r3,r0
- + mcr p15,0,r0,c7,c10,5
- +1: .word 0xe1920f9f /* ldrex r0,[r2] */
- + subs r0,r3,r0
- + .word 0x01820f91 /* strexeq r0,r1,[r2] */
- + teqeq r0,#1
- + beq 1b
- + mcr p15,0,r0,c7,c10,5
- + bx lr
- +.global __a_cas_v7
- +.hidden __a_cas_v7
- +__a_cas_v7:
- + mov r3,r0
- + .word 0xf57ff05b /* dmb ish */
- +1: .word 0xe1920f9f /* ldrex r0,[r2] */
- + subs r0,r3,r0
- + .word 0x01820f91 /* strexeq r0,r1,[r2] */
- + teqeq r0,#1
- + beq 1b
- + .word 0xf57ff05b /* dmb ish */
- + bx lr
- +
- +.global __aeabi_read_tp
- +.type __aeabi_read_tp,%function
- +__aeabi_read_tp:
- +
- +.global __a_gettp
- +.hidden __a_gettp
- +.type __a_gettp,%function
- +__a_gettp:
- + ldr r0,1f
- + ldr r0,[pc,r0]
- + add pc,pc,r0
- +1: .word __a_gettp_ptr-1b
- +.global __a_gettp_dummy
- +.hidden __a_gettp_dummy
- +__a_gettp_dummy:
- + mrc p15,0,r0,c13,c0,3
- + bx lr
- +
- +.data
- +.align 2
- +
- +.global __a_barrier_ptr
- +.hidden __a_barrier_ptr
- +__a_barrier_ptr:
- + .word 0
- +
- +.global __a_cas_ptr
- +.hidden __a_cas_ptr
- +__a_cas_ptr:
- + .word 0
- +
- +.global __a_gettp_ptr
- +.hidden __a_gettp_ptr
- +__a_gettp_ptr:
- + .word 0
- --- a/src/thread/arm/clone.s
- +++ b/src/thread/arm/clone.s
- @@ -1,3 +1,4 @@
- +.syntax unified
- .text
- .global __clone
- .type __clone,%function
- @@ -15,8 +16,6 @@ __clone:
- tst r0,r0
- beq 1f
- ldmfd sp!,{r4,r5,r6,r7}
- - tst lr,#1
- - moveq pc,lr
- bx lr
-
- 1: mov r0,r6
- --- a/src/thread/arm/syscall_cp.s
- +++ b/src/thread/arm/syscall_cp.s
- @@ -1,3 +1,4 @@
- +.syntax unified
- .global __cp_begin
- .hidden __cp_begin
- .global __cp_end
- @@ -22,8 +23,6 @@ __cp_begin:
- svc 0
- __cp_end:
- ldmfd sp!,{r4,r5,r6,r7,lr}
- - tst lr,#1
- - moveq pc,lr
- bx lr
- __cp_cancel:
- ldmfd sp!,{r4,r5,r6,r7,lr}
- --- a/src/thread/microblaze/syscall_cp.s
- +++ b/src/thread/microblaze/syscall_cp.s
- @@ -11,7 +11,7 @@
- __syscall_cp_asm:
- __cp_begin:
- lwi r5, r5, 0
- - bnei r5, __cancel
- + bnei r5, __cp_cancel
- addi r12, r6, 0
- add r5, r7, r0
- add r6, r8, r0
- @@ -23,3 +23,5 @@ __cp_begin:
- __cp_end:
- rtsd r15, 8
- nop
- +__cp_cancel:
- + bri __cancel
- --- a/src/thread/or1k/syscall_cp.s
- +++ b/src/thread/or1k/syscall_cp.s
- @@ -12,7 +12,7 @@ __syscall_cp_asm:
- __cp_begin:
- l.lwz r3, 0(r3)
- l.sfeqi r3, 0
- - l.bnf __cancel
- + l.bnf __cp_cancel
- l.ori r11, r4, 0
- l.ori r3, r5, 0
- l.ori r4, r6, 0
- @@ -24,3 +24,6 @@ __cp_begin:
- __cp_end:
- l.jr r9
- l.nop
- +__cp_cancel:
- + l.j __cancel
- + l.nop
- --- a/src/thread/powerpc/syscall_cp.s
- +++ b/src/thread/powerpc/syscall_cp.s
- @@ -38,7 +38,7 @@ __cp_begin:
- cmpwi cr7, 0, 0 #compare r0 with 0, store result in cr7.
- beq+ cr7, 1f #jump to label 1 if r0 was 0
-
- - b __cancel #else call cancel
- + b __cp_cancel #else call cancel
- 1:
- #ok, the cancel flag was not set
- # syscall: number goes to r0, the rest 3-8
- @@ -55,3 +55,5 @@ __cp_end:
- #else negate result.
- neg 3, 3
- blr
- +__cp_cancel:
- + b __cancel
- --- a/src/thread/pthread_cancel.c
- +++ b/src/thread/pthread_cancel.c
- @@ -1,12 +1,11 @@
- +#define _GNU_SOURCE
- #include <string.h>
- #include "pthread_impl.h"
- #include "syscall.h"
- #include "libc.h"
-
- -#ifdef SHARED
- __attribute__((__visibility__("hidden")))
- -#endif
- -long __cancel(), __cp_cancel(), __syscall_cp_asm(), __syscall_cp_c();
- +long __cancel(), __syscall_cp_asm(), __syscall_cp_c();
-
- long __cancel()
- {
- @@ -17,12 +16,6 @@ long __cancel()
- return -ECANCELED;
- }
-
- -/* If __syscall_cp_asm has adjusted the stack pointer, it must provide a
- - * definition of __cp_cancel to undo those adjustments and call __cancel.
- - * Otherwise, __cancel provides a definition for __cp_cancel. */
- -
- -weak_alias(__cancel, __cp_cancel);
- -
- long __syscall_cp_asm(volatile void *, syscall_arg_t,
- syscall_arg_t, syscall_arg_t, syscall_arg_t,
- syscall_arg_t, syscall_arg_t, syscall_arg_t);
- @@ -52,24 +45,22 @@ static void _sigaddset(sigset_t *set, in
- set->__bits[s/8/sizeof *set->__bits] |= 1UL<<(s&8*sizeof *set->__bits-1);
- }
-
- -#ifdef SHARED
- __attribute__((__visibility__("hidden")))
- -#endif
- -extern const char __cp_begin[1], __cp_end[1];
- +extern const char __cp_begin[1], __cp_end[1], __cp_cancel[1];
-
- static void cancel_handler(int sig, siginfo_t *si, void *ctx)
- {
- pthread_t self = __pthread_self();
- ucontext_t *uc = ctx;
- - const char *ip = ((char **)&uc->uc_mcontext)[CANCEL_REG_IP];
- + uintptr_t pc = uc->uc_mcontext.MC_PC;
-
- a_barrier();
- if (!self->cancel || self->canceldisable == PTHREAD_CANCEL_DISABLE) return;
-
- _sigaddset(&uc->uc_sigmask, SIGCANCEL);
-
- - if (self->cancelasync || ip >= __cp_begin && ip < __cp_end) {
- - ((char **)&uc->uc_mcontext)[CANCEL_REG_IP] = (char *)__cp_cancel;
- + if (self->cancelasync || pc >= (uintptr_t)__cp_begin && pc < (uintptr_t)__cp_end) {
- + uc->uc_mcontext.MC_PC = (uintptr_t)__cp_cancel;
- return;
- }
-
- --- /dev/null
- +++ b/src/thread/sh/__set_thread_area.c
- @@ -0,0 +1,40 @@
- +#include "pthread_impl.h"
- +#include "libc.h"
- +#include <elf.h>
- +
- +/* Also perform sh-specific init */
- +
- +#define CPU_HAS_LLSC 0x0040
- +#define CPU_HAS_CAS_L 0x0400
- +
- +__attribute__((__visibility__("hidden")))
- +extern const char __sh_cas_gusa[], __sh_cas_llsc[], __sh_cas_imask[], __sh_cas_cas_l[];
- +
- +__attribute__((__visibility__("hidden")))
- +const void *__sh_cas_ptr;
- +
- +__attribute__((__visibility__("hidden")))
- +unsigned __sh_nommu;
- +
- +int __set_thread_area(void *p)
- +{
- + size_t *aux;
- + __asm__ __volatile__ ( "ldc %0, gbr" : : "r"(p) : "memory" );
- +#ifndef __SH4A__
- + __sh_cas_ptr = __sh_cas_gusa;
- +#if !defined(__SH3__) && !defined(__SH4__)
- + for (aux=libc.auxv; *aux; aux+=2) {
- + if (*aux != AT_PLATFORM) continue;
- + const char *s = (void *)aux[1];
- + if (s[0]!='s' || s[1]!='h' || s[2]!='2' || s[3]-'0'<10u) break;
- + __sh_cas_ptr = __sh_cas_imask;
- + __sh_nommu = 1;
- + }
- +#endif
- + if (__hwcap & CPU_HAS_CAS_L)
- + __sh_cas_ptr = __sh_cas_cas_l;
- + else if (__hwcap & CPU_HAS_LLSC)
- + __sh_cas_ptr = __sh_cas_llsc;
- +#endif
- + return 0;
- +}
- --- /dev/null
- +++ b/src/thread/sh/__unmapself.c
- @@ -0,0 +1,24 @@
- +#include "pthread_impl.h"
- +
- +void __unmapself_sh_mmu(void *, size_t);
- +void __unmapself_sh_nommu(void *, size_t);
- +
- +#if !defined(__SH3__) && !defined(__SH4__)
- +#define __unmapself __unmapself_sh_nommu
- +#include "dynlink.h"
- +#undef CRTJMP
- +#define CRTJMP(pc,sp) __asm__ __volatile__( \
- + "mov.l @%0+,r0 ; mov.l @%0,r12 ; jmp @r0 ; mov %1,r15" \
- + : : "r"(pc), "r"(sp) : "r0", "memory" )
- +#include "../__unmapself.c"
- +#undef __unmapself
- +extern __attribute__((__visibility__("hidden"))) unsigned __sh_nommu;
- +#else
- +#define __sh_nommu 0
- +#endif
- +
- +void __unmapself(void *base, size_t size)
- +{
- + if (__sh_nommu) __unmapself_sh_nommu(base, size);
- + else __unmapself_sh_mmu(base, size);
- +}
- --- a/src/thread/sh/__unmapself.s
- +++ /dev/null
- @@ -1,22 +0,0 @@
- -.text
- -.global __unmapself_sh_mmu
- -.type __unmapself_sh_mmu, @function
- -__unmapself_sh_mmu:
- - mov #91, r3 ! SYS_munmap
- - trapa #31
- -
- - or r0, r0
- - or r0, r0
- - or r0, r0
- - or r0, r0
- - or r0, r0
- -
- - mov #1, r3 ! SYS_exit
- - mov #0, r4
- - trapa #31
- -
- - or r0, r0
- - or r0, r0
- - or r0, r0
- - or r0, r0
- - or r0, r0
- --- /dev/null
- +++ b/src/thread/sh/__unmapself_mmu.s
- @@ -0,0 +1,22 @@
- +.text
- +.global __unmapself_sh_mmu
- +.type __unmapself_sh_mmu, @function
- +__unmapself_sh_mmu:
- + mov #91, r3 ! SYS_munmap
- + trapa #31
- +
- + or r0, r0
- + or r0, r0
- + or r0, r0
- + or r0, r0
- + or r0, r0
- +
- + mov #1, r3 ! SYS_exit
- + mov #0, r4
- + trapa #31
- +
- + or r0, r0
- + or r0, r0
- + or r0, r0
- + or r0, r0
- + or r0, r0
- --- /dev/null
- +++ b/src/thread/sh/atomics.s
- @@ -0,0 +1,65 @@
- +/* Contract for all versions is same as cas.l r2,r3,@r0
- + * pr and r1 are also clobbered (by jsr & r1 as temp).
- + * r0,r2,r4-r15 must be preserved.
- + * r3 contains result (==r2 iff cas succeeded). */
- +
- + .align 2
- +.global __sh_cas_gusa
- +.hidden __sh_cas_gusa
- +__sh_cas_gusa:
- + mov.l r5,@-r15
- + mov.l r4,@-r15
- + mov r0,r4
- + mova 1f,r0
- + mov r15,r1
- + mov #(0f-1f),r15
- +0: mov.l @r4,r5
- + cmp/eq r5,r2
- + bf 1f
- + mov.l r3,@r4
- +1: mov r1,r15
- + mov r5,r3
- + mov r4,r0
- + mov.l @r15+,r4
- + rts
- + mov.l @r15+,r5
- +
- +.global __sh_cas_llsc
- +.hidden __sh_cas_llsc
- +__sh_cas_llsc:
- + mov r0,r1
- + synco
- +0: movli.l @r1,r0
- + cmp/eq r0,r2
- + bf 1f
- + mov r3,r0
- + movco.l r0,@r1
- + bf 0b
- + mov r2,r0
- +1: synco
- + mov r0,r3
- + rts
- + mov r1,r0
- +
- +.global __sh_cas_imask
- +.hidden __sh_cas_imask
- +__sh_cas_imask:
- + mov r0,r1
- + stc sr,r0
- + mov.l r0,@-r15
- + or #0xf0,r0
- + ldc r0,sr
- + mov.l @r1,r0
- + cmp/eq r0,r2
- + bf 1f
- + mov.l r3,@r1
- +1: ldc.l @r15+,sr
- + mov r0,r3
- + rts
- + mov r1,r0
- +
- +.global __sh_cas_cas_l
- +.hidden __sh_cas_cas_l
- +__sh_cas_cas_l:
- + rts
- + .word 0x2323 /* cas.l r2,r3,@r0 */
- --- a/src/thread/sh/syscall_cp.s
- +++ b/src/thread/sh/syscall_cp.s
- @@ -14,17 +14,8 @@ __syscall_cp_asm:
- __cp_begin:
- mov.l @r4, r4
- tst r4, r4
- - bt 2f
- -
- - mov.l L1, r0
- - braf r0
- - nop
- -1:
- -
- -.align 2
- -L1: .long __cancel@PLT-(1b-.)
- -
- -2: mov r5, r3
- + bf __cp_cancel
- + mov r5, r3
- mov r6, r4
- mov r7, r5
- mov.l @r15, r6
- @@ -43,3 +34,12 @@ __cp_end:
-
- rts
- nop
- +
- +__cp_cancel:
- + mov.l 2f, r0
- + braf r0
- + nop
- +1:
- +
- +.align 2
- +2: .long __cancel@PCREL-(1b-.)
- --- a/src/thread/x32/syscall_cp.s
- +++ b/src/thread/x32/syscall_cp.s
- @@ -14,7 +14,7 @@ __syscall_cp_internal:
- __cp_begin:
- mov (%rdi),%eax
- test %eax,%eax
- - jnz __cancel
- + jnz __cp_cancel
- mov %rdi,%r11
- mov %rsi,%rax
- mov %rdx,%rdi
- @@ -27,3 +27,5 @@ __cp_begin:
- syscall
- __cp_end:
- ret
- +__cp_cancel:
- + jmp __cancel
- --- /dev/null
- +++ b/src/thread/x32/syscall_cp_fixup.c
- @@ -0,0 +1,38 @@
- +#include <sys/syscall.h>
- +
- +__attribute__((__visibility__("hidden")))
- +long __syscall_cp_internal(volatile void*, long long, long long, long long, long long,
- + long long, long long, long long);
- +
- +struct __timespec { long long tv_sec; long tv_nsec; };
- +struct __timespec_kernel { long long tv_sec; long long tv_nsec; };
- +#define __tsc(X) ((struct __timespec*)(unsigned long)(X))
- +#define __fixup(X) do { if(X) { \
- + ts->tv_sec = __tsc(X)->tv_sec; \
- + ts->tv_nsec = __tsc(X)->tv_nsec; \
- + (X) = (unsigned long)ts; } } while(0)
- +
- +__attribute__((__visibility__("hidden")))
- +long __syscall_cp_asm (volatile void * foo, long long n, long long a1, long long a2, long long a3,
- + long long a4, long long a5, long long a6)
- +{
- + struct __timespec_kernel ts[1];
- + switch (n) {
- + case SYS_mq_timedsend: case SYS_mq_timedreceive: case SYS_pselect6:
- + __fixup(a5);
- + break;
- + case SYS_futex:
- + if((a2 & (~128 /* FUTEX_PRIVATE_FLAG */)) == 0 /* FUTEX_WAIT */)
- + __fixup(a4);
- + break;
- + case SYS_clock_nanosleep:
- + case SYS_rt_sigtimedwait: case SYS_ppoll:
- + __fixup(a3);
- + break;
- + case SYS_nanosleep:
- + __fixup(a1);
- + break;
- + }
- + return __syscall_cp_internal(foo, n, a1, a2, a3, a4, a5, a6);
- +}
- +
- --- a/src/thread/x86_64/syscall_cp.s
- +++ b/src/thread/x86_64/syscall_cp.s
- @@ -14,7 +14,7 @@ __syscall_cp_asm:
- __cp_begin:
- mov (%rdi),%eax
- test %eax,%eax
- - jnz __cancel
- + jnz __cp_cancel
- mov %rdi,%r11
- mov %rsi,%rax
- mov %rdx,%rdi
- @@ -27,3 +27,5 @@ __cp_begin:
- syscall
- __cp_end:
- ret
- +__cp_cancel:
- + jmp __cancel
- --- a/src/time/clock_gettime.c
- +++ b/src/time/clock_gettime.c
- @@ -5,37 +5,54 @@
- #include "libc.h"
- #include "atomic.h"
-
- -static int sc_clock_gettime(clockid_t clk, struct timespec *ts)
- +#ifdef VDSO_CGT_SYM
- +
- +void *__vdsosym(const char *, const char *);
- +
- +static void *volatile vdso_func;
- +
- +static int cgt_init(clockid_t clk, struct timespec *ts)
- {
- - int r = __syscall(SYS_clock_gettime, clk, ts);
- - if (!r) return r;
- - if (r == -ENOSYS) {
- - if (clk == CLOCK_REALTIME) {
- - __syscall(SYS_gettimeofday, ts, 0);
- - ts->tv_nsec = (int)ts->tv_nsec * 1000;
- - return 0;
- - }
- - r = -EINVAL;
- - }
- - errno = -r;
- - return -1;
- + void *p = __vdsosym(VDSO_CGT_VER, VDSO_CGT_SYM);
- + int (*f)(clockid_t, struct timespec *) =
- + (int (*)(clockid_t, struct timespec *))p;
- + a_cas_p(&vdso_func, (void *)cgt_init, p);
- + return f ? f(clk, ts) : -ENOSYS;
- }
-
- -void *__vdsosym(const char *, const char *);
- +static void *volatile vdso_func = (void *)cgt_init;
- +
- +#endif
-
- int __clock_gettime(clockid_t clk, struct timespec *ts)
- {
- + int r;
- +
- #ifdef VDSO_CGT_SYM
- - static int (*volatile cgt)(clockid_t, struct timespec *);
- - if (!cgt) {
- - void *f = __vdsosym(VDSO_CGT_VER, VDSO_CGT_SYM);
- - if (!f) f = (void *)sc_clock_gettime;
- - a_cas_p(&cgt, 0, f);
- + int (*f)(clockid_t, struct timespec *) =
- + (int (*)(clockid_t, struct timespec *))vdso_func;
- + if (f) {
- + r = f(clk, ts);
- + if (!r) return r;
- + if (r == -EINVAL) return __syscall_ret(r);
- + /* Fall through on errors other than EINVAL. Some buggy
- + * vdso implementations return ENOSYS for clocks they
- + * can't handle, rather than making the syscall. This
- + * also handles the case where cgt_init fails to find
- + * a vdso function to use. */
- }
- - return cgt(clk, ts);
- -#else
- - return sc_clock_gettime(clk, ts);
- #endif
- +
- + r = __syscall(SYS_clock_gettime, clk, ts);
- + if (r == -ENOSYS) {
- + if (clk == CLOCK_REALTIME) {
- + __syscall(SYS_gettimeofday, ts, 0);
- + ts->tv_nsec = (int)ts->tv_nsec * 1000;
- + return 0;
- + }
- + r = -EINVAL;
- + }
- + return __syscall_ret(r);
- }
-
- weak_alias(__clock_gettime, clock_gettime);
|